>>只记录自己认为重要的问题,并且简要记录。写多了也记不住,哈哈。
参考博文:博文
1.1 三次握手
自己描述:
A发送同步请求
SYN=1(序列号x),进入同步发送状态SYN-SENT。B收到请求,返回同步响应
SYN=1,ACK=1(确认号x+1,序列号y),进入同步已接收状态SYN-RCVD。A再回一个应答
ACK=1(确认号y+1,序列号x+1)。这样,双发都进入了已建立连接状态ESTAB-LISHED。1.2 四次握手
自己描述:
A发送终止请求
FIN=1(序列号u),进入终止等待1状态FIN-WAIT-1。B收到请求,先返回应答
ACK=1(确认号u+1,序列号v),进入关闭等待状态CLOSE-WAIT。返回终止响应
FIN=1,ACK=1(确认号u+1,序列号w),进入最后确认状态LAST-WAIT。A再回一个应答
ACK=1(确认号w+1,序列号u+1),进入时间等待状态TIME-WAIT。2MSL
:是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间
1.3 常见问题
1、为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:不同之处在于第二次握手
。
建立连接时,SYN+ACK报文一起发送,ACK报文是用来应答的,SYN报文是用来同步的。
关闭连接时,只能先回复一个ACK报文,等Server的报文都发送完了,我才能发送FIN报文。
2、为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
答:用来重发可能丢失的ACK报文。
Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。
3、为什么不能用两次握手进行连接?
答:3次握手完成两个重要的功能:既要双方做好发送数据的准备工作
,也要初始序列号在握手过程中被发送和确认
。
4、如果已经建立了连接,但是客户端突然出现故障了怎么办?
答:TCP的服务器端还设有一个保活计时器
,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。