一篇彻底搞懂TCP的三次握手和四次挥手

TCP建立连接

tcp是面向连接的协议,所以使用TCP连接前必须先建立连接。
而建立连接是通过三次握手来进行的。
至于为什么是三次握手,不是两次握手也不是四次,我自慢慢道来,请君倾耳听。
下面的有些英文名称为了好理解全使用小写。
在这里插入图片描述

如果你还不了解TCP报文的首部格式的话,去这里看看吧:TCP的头部格式,详细信息都在这

  • 一开始,服务端和客户端都处于close阶段。先是服务器开启某个端口,处于listen阶段。
  • 客户端会初始化序号,将此序号 x 至于TCP首部的序号字段中,同时把SYN字段置为1,表示SYN报文,接着把第一个SYN报文发送给服务端,表示向服务端发起连接。之后客户端处于syn_send状态。
  • 服务端接收到SYN报文之后,也会初始化自己的序号,将此序号 y 填入TCP首部的序号字段中。然后将确认应答号填入 x + 1 。接着把SYN和ACK部分都置为1,最后把报文发送给客户端。之后服务器处于syn_rcvd状态。
  • 客户端收到服务器报文之后,还要向服务器回应最后一个应答报文,该应答报文ACK标志位置为1,确认应答好为 y + 1 ,最后将报文发送给服务端。之后客户端处于established状态。
  • 服务器收到客户端的应答报文之后也进入established状态。

注:在上面的过程中,第三次握手是可以携带数据的,前两次握手是不可以携带数据的

一旦完成了三次握手,双方都处于established状态,连接就成功建立了,可以相互发送数据了。

为什么不是两次握手?

原因: 不能防止历史连接的建立,会造成双方资源的浪费。

  • 网络环境是错综复杂的考虑一种情况,A发出连接请求,但是第一个请求报文段在一些网络节点长时间滞留了,A长时间没有收到确认,于是重传一次连接请求,后来收到确认,建立了连接,传输了数据,数据传输完毕之后,就释放了连接,这个时候第一个请求报文兜兜转转又来到了B,这个时候如果是两次握手,B发送确认报文之后,就会建立连接了。但是三次握手中,A会根据这个确认报文,联系上下文,知道这个是历史连接,防止历史连接的建立。

为什么不是四次握手?

因为三次握手就已经理论上足够了,不需要使用更多的通信次数。

为什么IP层会分片,TCP还需要MSS呢?

MTU:一个网络包的最大长度,以太网中一般为1500字节。
MSS:出去TCP和IP头部长度之后,一个网络包能够容纳的TCP数据的最大长度。

如果TCP报文整个交给IP层去分片,看起来没有什么问题,其实问题很大

  • 如果一个IP分片丢失,整个IP报文的所有分片都需要重传。因为IP层本身没有超时重传机制,它由传输层的TCP来负责超时和重传。

所以为了最佳的传输效能,TCP协议在建立连接的时候就相互协商双方的MSS值,当TCP层发现数据超过MSS时,则会先进行分片,当然由它形成的IP包的长度也就不会大于MTU,自然也就不用IP分片了。

  • 经过TCP分片之后,如果一个TCP分片丢失,进行重发也是以MSS为单位,而不用重发所有的分片,大大增加了重传的效率。

TCP释放连接

TCP断开连接是以四次挥手的方式。
双方都可以主动断开连接,断开连接之后,主机中的资源将被释放。
在这里插入图片描述

  • 客户端打算关闭连接,此时会发送一个TCP首部 FIN 标志为1的报文,即FIN报文,之后客户端进入 fin_wait_1状态。表示客户端不再发送数据了,但是还能接收数据。
  • 服务端收到FIN报文之后,就向客户端发送ACK应答报文,服务端进入close_wait状态。此时可能服务端还有数据需要处理和发送。
  • 客户端收到ACK应答报文之后,进入fin_wait_2状态。
  • 等待服务端处理完数据之后也向客户端发送FIN报文。之后服务端进入last_ack 状态。表示同意现在关闭连接。
  • 服务器在收到 ACK 应答报文之后,就进入了closed状态,至此服务器已完成连接的关闭。
  • 客户端在经过 2MSL 一段时间后,自动进入closed 状态,至此客户端也完成连接的关闭。

这里区别三次握手的三次,这个四次握手的四次当然是必要的的,因为中间需要进行数据的传输咯。

注:为什么要等待2MSl呢?

第一: 为了保证A发送的最后一个ACK报文能够到达B,这个ACK报文可能丢失,B就可能会超时重传FIN - ACK 报文段。2MSL保证了这一来一回的操作能够成功进行。

第二:防止上面提到的 “ 已失效的连接请求报文段” 出现在本连接中。A在发送完最后一个ACK报文段之后,再经过2MSL时间,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。

此篇文章是我对网络的理解。与君共享。
有些学习自:小林coding的图解计算机网络。
还有:《计算机网络》谢希仁著,一书。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小黑cc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值