简介
传输层在前面的博文中已经详细的介绍了,以漫画 + 画图的方式,因此这里不在赘述。但是相关的细节叙述的不是太好,因此主针对TCP的三次握手和四次挥手再次进行叙述。联系上socket套接字编程进行说明。?传输层漫画版
三次握手
1、图示
拿上一次博文的图继续说注意红色框内的接口。
2、补充
由于上一篇博文叙述的顺序,所以并没有说,如果ACK丢失或者SYN丢失会怎么样。所以现在进行补充。
①第一次握手失败,即SYN丢失,客户端接重传。
②第二次握手失败,即服务端发送的ACK丢失,也就意味着服务端的SYN也丢失了,客户端和服务端都会重新发送SYN
③第三次握手失败,即客户端给服务器的ACK丢失,这个时候, 如果此时ACK在网络中丢失,那么Server端该TCP连接的状态为SYN_RECV,并且依次等待3秒、6秒、12秒后重新发送SYN+ACK包,以便Client重新发送ACK包。如果重发指定次数后,仍然未收到ACK应答,那么一段时间后,Server自动关闭这个连接。 但是Client认为这个连接已经建立,如果Client端向Server写数据,Server端将以RST包(用于强制关闭tcp连接)响应,方能感知到Server的错误。
3、三次握手的原因
这个问题其实同为什么不是两次,为什么不是四次等回答是相似的。TCP是全双工通信,3次握手完成两个重要的功能,既要双方都能够通信,也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。如果只是两次握手,只能确定单向是可以通信的,这样当客户端发起请求,服务端响应,服务端创建新的套接字开始与客户端通信,但是如果这是一个无效的连接请求,如网络滞留的一个请求,这样会造成服务器的资源浪费。
不需要四次,是因为前四次就可以确定双方可以通信,由于ACK只是一个比特位,因此可以让回复一端发送SYN时带上ACK,这样提高了连接效率
四次挥手
1、图示
2、TIME_WAIT
这个状态是非常重要的状态,在这个状态是属于主动关闭方的,在第三次挥手完毕后,主动关闭方会自动等待2MSL,这样等待的意义则是:
1、保证最后一次握手报文能到被动关闭方,到不了还能能进行超时重传。
2、2MSL后,这次连接的所有报文都会消失,不会影响下一次连接。
3、如果重传的FIN包或者ACK丢失,也不影响,最后会直接关闭当前连接。
3、FIN包和ACK
第二次挥手和第三次挥手之所以不能同时,是因为如果被动关闭方还有数据没有发送完,它会先回复一个ACK,等数据发送完后再发送FIN。