您的位置:首页 > 理论基础 > 计算机网络

TCP之三次握手和四次挥手

2016-05-21 17:31 447 查看
一、建立连接-->三次握手
(1)第一次握手:建立连接时,客户端A发送SYN(SYN=J)包到服务器B,并进入SYN_SEND状态,等待服务器确认。
(2)第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=J+1),同时自己也发送一个SYN包(SYN=K),即SYN+ACK包,此时服务器B进入SYN_RECV状态。
(3)第三次握手:客户端A收到服务器的SYN+ACK包,向服务器B发送确认包ACK(ACK=K+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。





各个状态的意义:
SYN_SEND:在发送连接请求后等待匹配的连接请求
SYN_RECV:在收到和发送一个连接请求后等待对连接请求的确认
ESTABLISHED:代表一个打开的连接,数据可以传送给用户

二、关闭连接-->四次挥手
(1)第一次挥手:客户端A发送一个FIN(FIN=M),用来关闭客户A到服务器B的数据传送,并进入FIN_WAIT_1状态。
(2)第二次挥手:服务器B收到这个FIN,它发回一ACK(ACK=M+1),服务器进入CLOSE_WAIT状态。
【服务器收到FIN后,返回ACK,关闭服务器读通道】
【客户机收到ACK后,关闭客户机写通道】
(3)第三次挥手:服务器B关闭与客户端A的连接,发送一个FIN(FIN=N)包给客户端A,并进入LAST_ACK状态。
(4)第四次挥手:客户端收到这个FIN,它发回ACK(ACK=N+1)报文确认,服务端B进入CLOSED状态。
【客户机收到FIN后,返回确认段ACK,关闭客户机读通道】
【服务器收到ACK,关闭服务器写通道】





各个状态的意义:
FIN-WAIT_1:等待远程TCP的连接中断请求,或先前的连接中断请求的确认
CLOSE_WAIT:等待从本地用户发来的连接中断请求
FIN_WAIT2:从远程TCP等待连接中断请求
LAST_ACK:等待原来发向远程 TCP的连接中断请求的确认
TIME_WAIT:等待足够多的时间以确保远程TCP接收到连接中断请求的确认
CLOSED:没有任何连接状态

三、为什么主动发起关闭连接的一方将达到TIME_WAIT状态,而且这个状态要保持2MSL的时间,而不是直接进入CLOSED状态?(Client主动关闭,Windows下默认2MSL=240s)
(1)保证TCP协议的全双工连接能够可靠关闭
如果Client直接CLOSED了,如果由于IP协议的不可靠性或者是其它网络原因,导致Server没有收到Client最后回复的ACK,那么Server就会在超时之后继续发送FIN,此时由于Client已经CLOSED了,就找不到与重发的FIN对应的连接,最后Server就会收到RST而不是ACK,Server就会以为是连接错误把问题报告给高层。这样的情况虽然不会造成数据的丢失,但是却导致了TCP协议不符合可靠性连接的要求。所以,Client不是直接进入CLOSED,而是要保持TIME_WAIT,当再次收到FIN的时候,能够保证对方收到ACK,最后正确的关闭连接。

(2)保证这次连接的重复数据段从网络中消失
如果Client直接CLOSED了,然后又向Server发起了一个新连接,如果恰好新连接和老连接的端口号是相同的,恰好前一次连接的某些数据仍然滞留在网络中,这些延迟数据在建立新连接后才到达Server,由于新连接和老连接的端口号是一样的,又因为TCP协议判断不同连接的依据是socket pair,于是TCP协议就认为那个延迟数据是新连接的 ,这样就导致了和真正新连接的数据包发生混淆了。所以TCP连接还要在TIME_WAIT状态等待2MSL时间,这样就可以保证本次所有连接的数据从网络上消失。

四、窗口
建立连接时,各端分配一块缓冲区用来存储接收的数据,并将缓冲区的尺寸发送给另一端,接收方发送的确认信息中包含了自己剩余的缓冲区尺寸,剩余缓冲区空间的数量叫做窗口。




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息