TCP的三次握手

 假设A为客户端,B为服务器端

  • 首先B处于LISTEN(监听)状态,等待客户的连接请求
  • A向B发送了连接请求报文,SYN=1,ACK=0.选择一个初始序列号x。
  • B收到连接请求报文,如果同意建立连接,则向A发送连接确认报文,SYN=1,ACK=1,确认号为x+1,同时也选择一个初始的序号y
  • A收到B的连接确认报文,还要向B发出确认,确认号y+1,序号为x+1.
  • B收到A的确认,连接建立

1. 为什么需要三次握手

1.0 确定双方的收发能力

  • 第一次握手成功,客户端什么都不知道;服务端知道自己的接收正常与客户端的发送正常
  • 第二次握手成功,客户端知道自己发送与接收正常以及服务端的发送与接收正常
  • 第三次握手成功,服务端知道自己的发送正常以及客户端的接收正常。

1.1 避免历史连接

  • 网络拥堵情况下,客户端可能会发送多个SYN建立连接的报文
  • 对服务端来说,收到了SYN请求连接报文,它无法判断是不是历史连接(因为序列化是随机初始化的),所以它都会响应ACK+SYN。
    • 因此,如果是两次握手,则可能会建立许多历史连接
  • 如果是三次握手,当客户端收到服务端的ACK+SYN,它可以判断这个是不是历史连接请求。如果是历史连接请求,则会响应一个RST报文给服务端,表示中止这一次连接
  • 如果不是历史连接请求,则第三次发送的报文时ACK报文,通信双方就成功建立了连接
  • 综上,TCP三次握手建立连接的主要原因是防止历史连接请求初始化了连接

1.2 同步双方的初始序列号

  • TCP协议双方都需要维护一个序列号。它是可靠传输的一个关键元素,它的作用:
    • 接收方用序列号来进行去除重复数据
    • 接收方可以根据数据包的序列号按序接收
    • 可以标识发送出去的数据包中,哪些是被对方收到了。
  • 双方的初始序列号同步至少需要三次握手
  • 总结:信道不可靠, 但是通信双发需要就某个问题达成一致

1.3 避免了资源浪费

  • 网络阻塞情况下,客户端可能会发送多个SYN建立连接的报文
  • 如果两次握手的话,服务在接收到请求后就会建立多个冗余的无效连接,造成不必要的资源浪费

1.4  综上:第三次握手的原因解释

  • 能确定双方的收发能力是否正常
  • 能防止历史连接的建立
  • 能减少双方不必要的资源开销
  • 能帮助双方同步初始化序列号

2. 相关的其他问题

2.1 如果第三次握手在网络上丢失了会发生什么?

  • 客户端的TCP连接状态已经变为了ESTABLISHED状态。它会认为自己已经建立好了连接。而服务器端还在等待第三次握手的确认,处于SYN_RECV。
  • 此时服务器端迟迟接受不到第三次握手会根据超时重传机制,会等待3秒、6秒、12秒后重新发送第二次握手包。希望客户端重新发送确认包,如果指定重发次数后,仍没收到客户端的ACK应答,那么一段时间后服务器端会自动关闭这个连接
  • 如果第三次握手在网络上丢失了,而此时客户端因为以为自己建立好了连接,所以向服务端发送数据,会得到服务端RST包响应,则客户端会感知到服务端的错误。则会关闭客户端这边的连接。(其实这个我不确定对不对,我觉得向服务端发送数据的时候也是带ack的,而且这个ack和第三次握手的ack也是一样的。那为啥这个发送数据的报文不能同时充当第三次握手报文。这难道不是一种优化?)

2.2 为什么客户端和服务端的初始序列号ISN是随机的

  • 当一个已经失效的连接被重用了,但是该旧连接的历史报文还残留在网络中,如果初始序列号相同,那么很可能就无法去分辨该报文是历史报文还是新的报文。容易产生数据错乱
  • 所以每次建立连接前初始化一个序列号主要为了通信双方能够根据序列号将不属于本连接的报文段丢弃
  • 另一方面为了安全性,防止黑客伪造相同的序列号的TCP报文被对方接受
  • ISN(初始序列号)得取值是每四微秒加一,当超过 2 的 32 次方之后又从 0 开始,要四个半小时左右发生 ISN 回绕。所以 ISN 变成一个递增值,真实的实现还需要加一些随机值在里面,防止被不法份子猜到 ISN

2.3 既然IP层会分片,为啥TCP层还需要MSS

  • 如果TCP层不进行分段,将整个报文(头部+数据)交给IP层进行分片。
  • 目标主机接收到这些IP分片,如果有一个分片丢失,则整个IP报文的所有分片都需要重新重传(这个实在网络层完成验证的)。只有接收到所有的分片后目标主机在IP层重新组装好后才会再交给上一层TCP层
  • 因此,为了达到最大传输效率,TCP协议再建立连接的时候通常要协商双方的MSS值。一般不会将MSS值设置的超过MTU。这样就不用在网络层进行IP分片

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值