码迷,mamicode.com
首页 > 其他好文 > 详细

TCP之三次握手和四次挥手

时间:2016-05-22 00:54:28      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:三次握手、四次挥手

一、建立连接-->三次握手

(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时间,这样就可以保证本次所有连接的数据从网络上消失。


四、窗口

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

技术分享技术分享


TCP之三次握手和四次挥手

标签:三次握手、四次挥手

原文地址:http://green906.blog.51cto.com/10697569/1775713

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!