计算机网络——TCP三次握手四次挥手

用户进程和服务器进程需要完成一次通信都需要完成三个阶段连接建立、数据传送、连接释放

参考:三次握手和四次挥手

三次握手

谢希仁《计算机网络(第五版)》

首先先明确几个概念:

序列号seq(4B):用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生,给字节编上序号后,就给每一个报文段指派一个序号,序列号seq就是这个报文段中的第一个字节的数据编号

确认号ack(4B)期待收到对方下一个报文段的第一个数据字节的序号,序列号表示报文段携带数据的第一个字节的编号,而确认号指的是期望接受到下一个字节的编号,因此挡墙报文段最后一个字节的编号+1即是确认号。

确认ACK(1bit):仅当ACK=1,确认号字段才有效。ACK=0,确认号无效。

同步SYN连接建立时用于同步序号。SYN=1表示这是一个连接请求,或连接接收报文,SYN这个标志位只有在TCP建立连接才会被置为1,握手完成后SYN标志位被置为0.当SYN=1,ACK=0表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使用SYN=1,ACK=1

终止FIN:用来释放一个连接。

过程

B的TCP服务器进程先创建传输控制块TCB,准备接受客户进程的连接请求。然后服务器进程就处于LISTEN(收听)状态,等待客户的连接请求。若有,则作出响应。

1)第一次握手:A首先向B发一个SYN (Synchronize) 标记的包,告诉B请求建立连接,一个 SYN包就是仅SYN标记设为1的TCP包(参见TCP包头Resources),SYN=1的报文段不能携带数据,但要消耗掉一个序号,此时TCP客户进程进入SYN-SENT(同步已发送)状态。

2)第二次握手:B收到后会发一个对SYN包的确认包(SYN/ACK)回去,表示对第一个SYN包的确认,并继续握手操作.注意: SYN/ACK包是仅SYN 和 ACK 标记为1的包。在确认报文段中,测试TCP服务器进程进入SYN-RCVD(同步收到)状态;

3)第三次握手:TCP客户进程收到B的确认后,要向B给出确认报文段,ACK报文段可以携带数据,不携带数据则不消耗序号。TCP连接已经建立,A进入ESTABLISHED(已建立连接)。

当B收到A的确认后,也进入建立连接状态。

序列号和确认号的关系:

第一次握手序列号seq=x;

第二次握手序列号seq=y,确认号ack=x+1;

第三次握手序列号seq=x+1,确认号ack=y+1;

序列号seq是上一次的确认号,而确认号是上一次的序列号+1;这是因为SYN=1的报文段不能携带数据,但要消耗掉一个序号,所以下一个报文段要+1;

为什么要进行三次握手?

为了防止已经失效的连接请求报文段突然又传到服务端,因而产生错误”,这种情况是:一端(client)A发出去的第一个连接请求报文并没有丢失,而是因为某些未知的原因在某个网络节点上发生滞留,导致延迟到连接释放以后的某个时间才到达另一端(server)B。本来这是一个早已失效的报文段,但是B收到此失效的报文之后,会误认为是A再次发出的一个新的连接请求,于是B端就向A又发出确认报文,表示同意建立连接。如果不采用“三次握手”,那么只要B端发出确认报文就会认为新的连接已经建立了,但是A端并没有发出建立连接的请求,因此不会去向B端发送数据,B端没有收到数据就会一直等待,这样B端就会白白浪费掉很多资源。如果采用“三次握手”的话就不会出现这种情况,B端收到一个过时失效的报文段之后,向A端发出确认,此时A并没有要求建立连接,所以就不会向B端发送确认,这个时候B端也能够知道连接没有建立。(知乎上对上面的解释的评论:这个解答不是问题的本质,这个课本很多知识比较片面。问题的核心在于保证信道数据传输的可靠性,避免资源浪费仅仅是一个小的弱原因,不重要。) 

四次挥手

从客户端到服务端释放连接的过程中,需要四次报文传输。

TCP四次挥手过程

1)A的应用进程先向其TCP发出连接释放报文段(FIN=1,序号seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN-WAIT-1(终止等待1)状态,等待B的确认。

2)B收到连接释放报文段后即发出确认报文段,(ACK=1,确认号ack=u+1,序号seq=v),B进入CLOSE-WAIT(关闭等待)状态,此时的TCP处于半关闭状态,A到B的连接释放。

3)A收到B的确认后,进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。

4)B没有要向A发出的数据,B发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),B进入LAST-ACK(最后确认)状态,等待A的确认。

5)A收到B的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),A进入TIME-WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,A才进入CLOSED状态。

大概就是A和B:

A:“我不和你说话了”

B:“知道了”

此时A单方面不和B说话,当B也没有话对A说的时候

B:“我也不和你说话了”

A:“好的”

两个人互相不说话了

TCP四次挥手总结

客户端发送FIN后,进入终止等待状态,服务器收到客户端连接释放报文段后,就立即给客户端发送确认,服务器就进入CLOSE_WAIT状态,此时TCP服务器进程就通知高层应用进程,因而从客户端到服务器的连接就释放了。此时是“半关闭状态”,即客户端不可以发送给服务器,服务器可以发送给客户端。

此时,如果服务器没有数据报发送给客户端,其应用程序就通知TCP释放连接,然后发送给客户端连接释放数据报,并等待确认。客户端发送确认后,进入TIME_WAIT状态,但是此时TCP连接还没有释放,然后经过等待计时器设置的2MSL后,才进入到CLOSE状态。

你可能感兴趣的:(计算机网络——TCP三次握手四次挥手)