Java网络编程对于Java工程师来说是很重要的能力,尤其是大厂对网络编程有较高的要求。
比如在直播、实时通讯、游戏服务端开发等技术领域,通信协议和网络编程就成为了很重要的一个技术课题。
再比如你想做基础技术研发,比如消息队列、RPC框架的研发,那么网络编程也是必备的基础能力。
计算机网络在学习Java网络编程之前,我们先来了解什么是计算机网络。
计算机网络是通过传输介质、通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来的,实现资源共享和数据传输的系统。
网络编程就是编写程序使互联网的两个(或多个)设备(如计算机)之间进行数据传输。
计算机网络主要包括三部分:
- 计算机(可以包括客户端、服务器)
- 网络设备(路由器、交换机、防火墙等)
- 传输介质(可以分为有线和无线的)
按照地域范围可以对网络进行如下分类:
- 局域网︰小范围内的私有网络,一个家庭内的网络、一个公司内的网络、一个校园内的网络都属于局域网。
- 广域网:把不同地域的局域网互相连接起来的网络。运营商搭建连接远距离区域的广域网。
- 互联网:由世界各地的局域网和广域网连接起来的网络,互联网是一个开放、互联的网络,不属于任何个人和任何机构。
TCP/IP模型
TCP/IP模型是由ОSl模型演化而来,TCP/IP模型将OSI模型由七层简化为五层〔一开始为四层),应用层、表示层、会话层统—为应用层。
网络协议如同人与人之间相互交流是需要遒循一定的规矩一样,计算机之间能够进行相互通信是因为它们都共同遵守一定的规则,即网络协议。
TCP的报文格式
三次握手
1.第一次握手(客户端发送请求)
客户机发送连接请求报文段到服务器,并进入SYN_SENT状态,等待服务器确认。发送连接请求报文段内容:SVN=1,seq=x; SYN=1意思是一个TCP的SYN标志位置为1的包,指明客户端打算连接的服务器的端口; seq=x表示客户端初始序号x,保存在包头的序列号(Sequence Number)字段里。
2.第二次握手(服务端回传确认)
服务器收到客户端连接请求报文,如果同意建立连接,向客户机发回确认报文段(ACK)应答,并为该TCP连接分配TCP缓存和变量。
服务器发回确认报文段内容:SYN=1,ACK=1,seq=y,ack=x+1;SYN标志位和ACK标志位均为1,同时将确认序号(Acknowledgement Number)设置为客户的ISN加1,即x+1; seq=y为服务端初始序号y。
3.第三次握手(客户端回传确认)
客户机收到服务器的确认报文段后,向服务器给出确认报文段(ACK),并且也要给该连接分配缓存和变量。
此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。客户端发回确认报文段内容:
ACK=1,seq=X+1,ack=y+1; ACK=1为确认报文段;seq=x+1为客户端序号加1; ack=y+1,为服务器发来的ACK的初始序号字段+1。
四次挥手
1.TCP客户端发送一个FIN,用来关闭客户端到服务端的数据传送,客户端进入FIN_WAIT_1状态。发送报文段内容:FIN=1,seq=u;FIN=1表示请求切断连接;seq=u为客户端请求初始序号。
2.服务端收到这个FIN,它发回一个ACK给客户端,确认序号为收到的序号加1,和SYN一样,一个FIN将占用一个序号。服务端进入CLOSE_WAIT状态。发送报文段内容:ACK=1,seq=v,ack=u+1; ACK=1为确认报文;seq=v为服务器确认初始序号;ack=u+1为客户端初始序号加1。
3.服务器关闭客户端的连接后,发送一个FIN给客户端,服务端进入LAST_ACK状态。发送报文段内容:FIN=1,ACK=1,seq=w,ack=u+1; FIN=1为请求切断连接,ACK=1为确认报文,seq=w为服务端请求切断初始序号。
4.客户端收到FIN后,客户端进入TIME_WAIT状态,接着发回一个ACK报文给服务端确认,并将确认序号设置为收到序号加1,服务端进入CLOSED状态,完成四次挥手。发送报文内容:ACK=1,seq=u+1, ack=w+1;ACK=1为确认报文,seq=u+1为客户端初始序号加1, ack=w+1为服务器初始序号加1。
为什么是三次握手四次挥手
因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭socket,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文,我收到了”。只有等到服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送,故需要四步挥手。
由于篇幅过长今天就到这里啦!!需要获取完整pdf的朋友:



