网络编程的理解和TCP三次握手和四次挥手详解
网络编程就是通过IP地址和端口号或者域名连接到另一台计算机上,使用规定的协议(HTTP)和数据传输方式(TCP/UDP)交换数据。
比如:使用套接字来达到进程间通信
TCP协议:
提供可靠的,端到端的字节流的通信。是一种面向连接的协议。是字节流而不是报文流。
UDP协议:
是一种无连接、不可靠的传输协议。发送的是IP数据包。
OSI模型
是一个用于计算机互联的标准体系。
一共分为七层:
物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
TCP/IP五层模型
分别应用层、传输层、网络层、数据链路层、物理层。
应用层囊括了OSI模型的应用、表示、会话层。
每一层都工作着不同的设备。
每一层也有自己的协议。
比如应用层有HTTP超文本传输协议。
传输层有TCP、UDP协议。
网络编程:
实际上就是计算机之间的通信,通过IP地址和端口交换数据。
通信的模型有官方的OSI七层模型和实际上用的TCP/IP模型。
OSI模型有七层分别是应用层、表示层、会话层、传输层、网络层、数据链路层和物理层。
而TCP/IP
模型把OSI中的应用、表示、会话层都放在了一个应用层中。
每一层都有自己的传输协议。像应用层就有我们常用的HTTP超文本传输协议,和FTP协议。
传输层则是TCP和UDP协议。
TCP协议是一种面向连接、可靠的、提供端到端的字节流的传输协议。TCP确保传输数据的正确性,不出现丢失或乱序。
TCP的工作方式:
TCP报文中比较重要的字段有:
Seq序号,确认号ACK,标志位Flags。
共6个,即URG、ACK、PSH、RST、SYN、FIN等。具体含义如下:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HcfmcxV0-1595265358735)(C:\Users\12556\AppData\Roaming\Typora\typora-user-images\image-20200721004246759.png)]
建立连接的三次握手:
首先客户端发送一段TCP报文给服务器:
其中标志位为SYN表示请求建立新连接。
Seq序号为一个x(x通常是1)
随后客户端进入SYN-SEND也就是请求连接发送阶段
之后服务器接收到来自客户端的TCP报文也返回一段TCP报文:
标志位为SYN和ACK,表示确认客户端的报文Seq序号有效,并同意创建新连接。
序号为Seq=y
确认号为Ack=x+1(确认号在一次传输中一般都是对方的序号加一)
随后服务器进入SYN-RCVD:请求新连接已接收阶段。
客户端接受到服务器确认的TCP报文后:
明确客户端到服务器的数据传输都是正常的,结束SYN-SENT阶段。
并且返回最后一段TCP报文:
标志位为:ACK,确认服务器发送的信号。
序号Seq=x+1
确认号:ACK=y+1,表示收到了服务器的报文序号,+1作为这段报文的确认序号。
随后客户端进入ESTABLISHED阶段,连接以建立阶段。
服务器在收到来自客户端的确认数据报文后也进入ESTABLISHED阶段。
四次挥手:
连接的释放必须是某一方的主动释放。另一方被动释放。
以客户端主动释放为例。
1.客户端想要释放连接:
在挥手之前先结束ESTABLISHED阶段,
发送一段TCP报文:
标记为为FIN表示请求释放连接
序号为Seq=U
随后客户端进入FIN-WAIT-1阶段,也就是半关闭阶段,停止向客户端到服务器端的方向发送数据,但是任然可以接受服务器的数据。
这里的不发送的不是一切数据。所以客户端仍然能发送ACK确认报文。
2.服务器端接收到客户端的报文:
结束ESTABLISHED阶段,进入CLOSE-WAIT阶段,半关闭状态,返回TCP报文。
标志位为ACK,接收到客户端发送释放连接的请求
序号Seq=V
确认号Ack=U+1
随后服务器准备释放他们的连接
客户端接收到服务器端的TCP报文后,确认了客户端之前的发送请求进入FIN-WAIT-2阶段。
3.服务器发送ACK确认报文后,准备释放连接之后,再次向客户端发送报文
其中:
标志位为FIN,ACK,表示已经准备好释放连接
Seq=W
确认序号为ACk=U+1
服务器结束CLOSE-WAIT阶段,进入LAST-ACK阶段。最后确认阶段。
此时停止了服务器端向客户端发送数据,但是能接受客户端的数据。
4.客户端收到服务器的报文后,确认服务器要释放连接,进入TIME-WAIT阶段
向服务器发送一段报文:
标记为ACK,表示接收到服务器准备释放连接的信号
序号Seq=U+1
确认号Ack=w+1
随后TIME-WAIT阶段等待2MSL
其中1MSL是指:一段TCP报文在传输过程中的最大生命周期。
2MSL的实际作用是:
第一个1MSL表示:
客户端发送的确认报文。
服务器端在1MSL内没有收到客户端发出的ACK确认报文,就会再次向客户端发出FIN报文。
此时是第二个MSL时间。
如果2MSL内客户端都没有接收到服务器的报文。
表示服务器正常接收了ACK报文,关闭了连接。
而UDP则是无连接、不可靠的发送IP数据包的协议。使用UDP的速度更快,但是不保证数据一定传输到对方。并且UDP的结构简单所以网络开销小。TCP则可以保证接收端毫无差错的收到发送端的字节流。