前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TCP 协议

TCP 协议

作者头像
lonelydawn
发布2021-09-26 11:34:11
5110
发布2021-09-26 11:34:11
举报
文章被收录于专栏:lonelydawn的前端猿区

TCP是一种面向连接、可靠的传输方式。

超时重传

TCP层每发送一个数据包,都要设置一个定时器,如果接收方在有效时间内没有返回数据接收的确认ACK,发送方则重新发送这个数据包。

滑动窗口

滑动窗口,主要用于流量控制,避免性能高的主机向性能低的主机短时间传输大量数据,以致撑爆性能低的主机的数据接收缓冲区。

滑动窗口包含几个概念:

  • 慢启动,每收到一个数据包的ACK确认后,都会将拥塞窗口的长度加一,直到达到慢启动的窗口阈值,进入拥塞避免阶段。如果中间发生数据包超时重传,则重新开始慢启动阶段。
  • 拥塞避免,在此阶段,整个窗口的数据包都返回ACK确认后,才会将拥塞窗口的长度加一。
  • 快速重传,一个窗口中连续3个数据包发生超时重传,则认为整个窗口的数据都丢失了,然后将整个窗口的数据都进行重传。
  • 快速恢复,在快速重传之后,会将拥塞窗口的长度按一定规则缩小。之后,整个窗口的数据包都返回ACK确认后,将窗口长度加一。此外,收到超时数据包返回的ACK后,也会将拥塞窗口的长度加一。当窗口长度达到阈值时,进入拥塞避免阶段。

TCP三次握手

  1. 主机A向主机B发送连接请求
  2. 主机B向主机发送ACK确认
  3. 主机A建立连接,向主机B发送ACK确认;主机B收到ACK确认,建立连接

为什么要三次握手?

如果网络不会出现阻塞延迟的情况,一次握手就够了:

  • 源主机建立连接并向目标主机发送连接请求
  • 目标主机收到连接请求后,建立连接

三次握手是为了兜底异常情况。

  • 假如一个连接请求因为物理节点繁忙而被阻塞,超时失效之后才被传到目标主机。
  • 目标主机会误认为这是源主机发送的新的建立连接的请求,假如只是两次握手,此时目标主机应该建立连接并向源主机返回连接响应。
  • 源主机在收到响应后,发现这是过期的连接请求,不做任何事情。此时目标主机将一直连接状态,但又不接收和发送数据,这是一种资源浪费。

而在三次握手中,

  • 当连接请求因阻塞而延迟到达目标主机,目标主机并不直接建立连接,而是返回连接确认。
  • 源主机收到确认后,发现这是过期的请求,不做任何事情。
  • 目标主机因为收不到连接确认,所以也不会建立连接,这样就兜底这种异常情况。

TCP四次挥手

  1. 主机A在发送完数据后,向主机B发送关闭连接的请求FIN,之后处于半关闭状态,不再发送任何数据,但可以接收数据
  2. 主机B在接收完数据后,处理关闭连接的请求,返回FIN同意关闭。在此之前,可能也向主机A发送了一些数据;在此之后,也处于半关闭状态,不再发送新的数据。
  3. 主机A在接收完数据后,并不知道是否所有的数据都已经接收,因为有的数据可能还在路上,因此需要向主机B发送请求(FIN & ACK)来确认是否所有的数据都已经发送完成,同时也是告诉主机B数据已经接收完成了。
  4. 主机B在收到主机A的ACK确认后,判断数据是否传输完成。如果传输完成,则向主机A返回确认(FIN & ACK),并关闭连接。
  5. 主机A收到关闭确认,得知数据已经传输完成,于是关闭连接。

TCP四次挥手主要是为了保证连接关闭前的数据能够稳定地进行传输。

为什么要四次挥手?

当然也是为了兜底异常情况,与建立连接时不同,建立连接时还没有数据传输,关闭连接时,之前的数据可能还没有传输完成,需要保证数据稳定地传输。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 超时重传
  • 滑动窗口
  • TCP三次握手
  • TCP四次挥手
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档