TCPIP协议三次握⼿和四次挥⼿
TCP 协议简述
TCP(Transmission Control Protocol)⽹络传输控制协议,是⼀种⾯向连接的、可靠的、基于字节流的传输层通信协议,数据传输前建⽴连接的⼯作要经过三次握⼿,数据传输后断开连接的⼯作要经过四次挥⼿。TCP 提供⾯向有连接的通信传输,⾯向有连接是指在传送数据之前必须先建⽴连接,数据传送完成后要释放连接。
⽆论哪⼀⽅向另⼀⽅发送数据之前,都必须先在双⽅之间建⽴⼀条连接。在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握⼿进⾏初始化的。同时由于TCP协议是⼀种⾯向连接的、可靠的、基于字节流的运输层通信协议,TCP是全双⼯模式,所以需要四次挥⼿关闭连接。
TCP包⾸部
⽹络中传输的数据包由两部分组成:⼀部分是协议所要⽤到的⾸部,另⼀部分是上⼀层传过来的数据。⾸部的结构由协议的具体规范详细定义。在数据包的⾸部,明确标明了协议应该如何读取数据。反过来说,看到⾸部,也就能够了解该协议必要的信息以及所要处理的数据。包⾸部就像协议的脸。
下⾯的图是TCP头部的规范定义,它定义了TCP协议如何读取和解析数据:
图⽚.png
TCP头部
TCP⾸部承载这TCP协议需要的各项信息,下⾯我们来分析⼀下:
TCP端⼝号
TCP的连接是需要四个要素确定唯⼀⼀个连接:(源IP,源端⼝号)+ (⽬地IP,⽬的端⼝号)
所以TCP⾸部预留了两个16位作为端⼝号的存储,⽽IP地址由上⼀层IP协议负责传递
源端⼝号和⽬地端⼝各占16位两个字节,也就是端⼝的范围是2^16=65535
另外1024以下是系统保留的,从1024-65535是⽤户使⽤的端⼝范围
TCP的序号和确认号:
32位序号 seq:Sequence number 缩写seq ,TCP通信过程中某⼀个传输⽅向上的字节流的每个字节的序号,通过这个来确认发送的数据有序,⽐如现在序列号为1000,发送了1000,下⼀个序列号就是2000。
32位确认号 ack:Acknowledge number 缩写ack,TCP对上⼀次seq序号做出的确认号,⽤来响应TCP报⽂段,给收到的TCP报⽂段的序号
认,也不会向server发送数据。但server却以为新的运输连接已经建⽴,并⼀直等待client发来数据。这样,server的很多资源就⽩⽩浪费掉了。
所以,采⽤“三次握⼿”的办法可以防⽌上述现象发⽣。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建⽴连接。经过三次的互相确认,⼤家就会认为对⽅对听的到⾃⼰说话,并且愿意下⼀步沟通,否则,对话就不⼀定能正常下去了。
TCP 四次挥⼿关闭连接
四次挥⼿即终⽌TCP连接,就是指断开⼀个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这⼀过程由客户端或服务端任⼀⽅执⾏close来触发。
由于TCP连接是全双⼯的,因此,每个⽅向都必须要单独进⾏关闭,这⼀原则是当⼀⽅完成数据发送任务后,发送⼀个FIN来终⽌这⼀⽅向的连接,收到⼀个FIN只是意味着这⼀⽅向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这⼀⽅向也发送了FIN。⾸先进⾏关闭的⼀⽅将执⾏主动关闭,⽽另⼀⽅则执⾏被动关闭。
四次挥⼿关闭连接
挥⼿请求可以是Client端,也可以是Server端发起的,我们假设是Client端发起:
第⼀次挥⼿: Client端发起挥⼿请求,向Server端发送标志位是FIN报⽂段,设置序列号seq,此时,Client端进⼊FIN_WAIT_1状态,这表⽰Client端没有数据要发送给Server端了。
第⼆次分⼿:Server端收到了Client端发送的FIN报⽂段,向Client端返回⼀个标志位是ACK的报⽂段,ack设为seq加1,Client端进⼊FIN_WAIT_2状态,Server端告诉Client端,我确认并同意你的关闭请求。
第三次分⼿: Server端向Client端发送标志位是FIN的报⽂段,请求关闭连接,同时Client端进⼊LAST_ACK状态。
第四次分⼿ : Client端收到Server端发送的FIN报⽂段,向Server端发送标志位是ACK的报⽂段,然后Client端进⼊TIME_WAIT状态。Server端收到Client端的ACK报⽂段以后,就关闭连接。此时,Client端等待2MSL的时间后依然没有收到回复,则证明Server端已正常关闭,那好,Client端也可以关闭连接了。
为什么连接的时候是三次握⼿,关闭的时候却是四次握⼿?
建⽴连接时因为当Server端收到Client端的SYN连接请求报⽂后,可以直接发送SYN+ACK报⽂。其中ACK报⽂是⽤来应答的,SYN报⽂是⽤来同步的。所以建⽴连接只需要三次握⼿。
由于TCP协议是⼀种⾯向连接的、可靠的、基于字节流的运输层通信协议,TCP是全双⼯模式。
这就意味着,关闭连接时,当Client端发出FIN报⽂段时,只是表⽰Client端告诉Server端数据已经发送完毕了。当Server端收到FIN报⽂并返回ACK报⽂段,表⽰它已经知道Client端没有数据发送了,但是Server端还是可以发送数据到Client端的,所以Server很可能并不会⽴即关闭SOCKET,直到Server端把数据也发送完毕。
当Server端也发送了FIN报⽂段时,这个时候就表⽰Server端也没有数据要发送了,就会告诉Client端,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。
为什么要等待2MSL?
MSL:报⽂段最⼤⽣存时间,它是任何报⽂段被丢弃前在⽹络内的最长时间。
有以下两个原因:
第⼀点:保证TCP协议的全双⼯连接能够可靠关闭:
由于IP协议的不可靠性或者是其它⽹络原因,导致了Server端没有收到Client端的ACK报⽂,那么Server端就会在超时之后重新发送FIN,如果此时Client端的连接已经关闭处于CLOESD状态,那么重
发的FIN就不到对应的连接了,从⽽导致连接错乱,所以,Client端发送完最后的ACK 不能直接进⼊CLOSED状态,⽽要保持TIME_WAIT,当再次收到FIN的收,能够保证对⽅收到ACK,最后正确关闭连接。
第⼆点:保证这次连接的重复数据段从⽹络中消失
如果Client端发送最后的ACK直接进⼊CLOSED状态,然后⼜再向Server端发起⼀个新连接,这时不能保证新连接的与刚关闭的连接的端⼝号是不同的,也就是新连接和⽼连接的端⼝号可能⼀样了,那么就可能出现问题:如果前⼀次的连接某些数据滞留在⽹络中,这些延迟数据在建⽴新连
接后到达Client端,由于新⽼连接的端⼝号和IP都⼀样,TCP协议就认为延迟数据是属于新连接的,新连接就会接收到脏数据,这样就会导致数据包混乱。所以TCP连接需要在TIME_WAIT状态等待2倍MSL,才能保证本次连接的所有数据在⽹络中消失。
图⽚.pngtcpip协议pdf
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论