TCP/IP的三次握手,四次断开

一、先介绍TCP的报文格式​

TCP的报文格式:TCP/IP的三次握手,四次断开_第1张图片

 

源端口号:本次TCP连接中,发起连接的主机使用的端口号;

目的端口号:本次TCP连接主,接受连接的主机使用的端口号;

序号:通过TCP传输的每一个数据段,都有一个序号,作用是为了确认此数据段的顺序。网络中允许传输的数据长度是有限制的,所以当我们要通过TCP传输一个较大的数据时,TCP会将数据切割成很多小的数据段进行传输。而将这些小的数据段发送到目的主机时(发送方会同时发送多个数据),并不能保证它们是按顺序到达目的地,所以对于每一个数据段,都要有一个序号,来标识它们是属于总数据的哪一部分,以保证在目的主机中能将他们重新拼接。

确认序号:接收方若接收到一个数据段,会发送一个确认报文给发送方,告诉发送方已经接收到这个数据段,而确认序号的作用就是告诉发送方接收到了哪条数据段。若接收方接收到了序号为n的报文段,则确认序号将是n+1,表示它已经接收了n,下一条想要接收n+1

首部长度TCP报文的首部+选项的字节数;

ACK:只有1 bit的标志位,若为1,表示这个数据段中的确认序号是有效的,即这个数据报是对之前接收到的某个报文的确认(一个TCP报文可以同时作为确认报文和传递数据报文)。

RST:只有1 bit的标志位,若客户端向服务器的一个端口请求建立TCP连接,但是服务器的那个端口并不允许建立连接(比如没开启此端口),则服务器会回送一个TCP报文,将RST位置为1,告诉客户端不要再向这个端口发起连接;

SYN:只有1 bit的标志位,若为1,表示这是一条建立连接的TCP报文段;

FIN:只有1 bit的标志位,若为1,表示这是一条断开连接的TCP报文段

三次握手

1、第一次握手:客户端给服务器发送一个SYN报文。

2、第二次握手:服务器收到 SYN 报文之后,会应答一个 SYN+ACK 报文。

3、第三次握手:客户端收到 SYN+ACK 报文之后,会回应一个 ACK 报文。

4、服务器收到 ACK 报文之后,三次握手建立完成。

三次握手作用

是为了 确认双方的接收与发送能力是否正常 + 同步序列号有同步了序列号才有可靠的传输

*SYN:同步序列编号(Synchronize Sequence Numbers)。是TCP/IP建立连接时使用的握手信号。在客户机和服务器之间建立正常的TCP网络连接时,客户机首先发出一个SYN消息,服务器使用SYN+ACK应答表示接收到了这个消息,最后客户机再以ACK消息响应。这样在客户机和服务器之间才能建立起可靠的TCP连接,数据才可以在客户机和服务器之间传递。

*ACK (Acknowledge character)即是确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符表示发来的数据已确认接收无误

示例图

TCP/IP的三次握手,四次断开_第2张图片

 

  • 四次断开

第一步:客户端进程发出断开连接指令,这将导致客户端的TCP程序创建一个特殊的TCP报文段,发送到服务器。这个报文段的FIN字段被置为1,表示这是一条断开连接的报文;

第二步:服务器接收到客户端发来的断开连接报文,向客户端回送这个报文的确认报文(ACK字段为1),告诉服务器已经接收到FIN报文,并允许断开连接;

第三步:服务器发送完确认报文后,服务器的TCP程序创建一条自己的断开连接报文,此报文的FIN字段被置为1,然后发往客户端;

第四步:客户端接收到服务器发来的FIN报文段,则产生一条确认报文(ACK1),发送给服务器,告知服务器已经接收到了它的断开报文。服务器接收到这条ACK报文段后,释放TCP连接相关的资源(缓存和变量),而客户端等待一段时间后(半分钟、一分钟或两分钟),也释放处于客户端的缓存和变量;

客户端等待的原因

原因一:客户端接收到服务器发送的FIN报文后(第三次挥手),会回送一条确认报文(第四次挥手),但是,客户端并不知道这条确认报文是否可以顺利到达服务器。若这条确认报文在传送到服务器的过程中损坏、丢失或超时,将引起服务器重新发送FIN报文,客户端接收到后,将需要再次发送一条确认报文,直到服务器正确接收。但是,客户端发送确认报文后,立刻释放资源,将导致无法处理重传的FIN报文,所以客户端需要等待一段时间,直到确认没有出现上述情况出现再释放资源。

原因二TCP四次挥手完成后,理论上已经断开了连接,但是这不代表之前通过这条连接发送的所有数据都处理完毕了,有些可能还在网络中传输。若在四次挥手后,立即释放客户端的资源,然后客户端立即以同一个源端口,向服务器的同一个目的端口再次建立一个TCP连接,这个连接和上一个的 源端口+源IP+目的端口+目的IP 都一模一样,此时将会产生问题。若上一次连接遗留在网络中的报文此时到达,将会被当做新连接传输的数据处理,于是可能会产生一些不可预估的错误。所以,客户端在断开连接后,需要等待一段时间,直到网络中遗留的数据都死掉,才释放资源,而在资源没有被释放前,是不允许建立一个 源端口+源IP+目的端口+目的IP 都一模一样的TCP连接的(因为TCP套接字由这四部分标识)。

示例图:

TCP/IP的三次握手,四次断开_第3张图片

 

四次断开的原因

TCP是一个全双工AB建立连接,则A可以向B发送数据,而B也可以向A发送数据。)所以,只有当两端的数据都发送完毕,连接才能安全的断开。如A接收到了B的FIN报文段,他会等到自己所有的数据发送完,然后也向B发送一个FIN报文,告诉B我也没数据了,这时候连接才能真正断开,两端各自释放资源。

你可能感兴趣的:(tcp/ip,网络,服务器)