TCP协议

一、TCP分包、组包

  • TCP数据包大小
    • 以太网数据包大小固定1518字节,后期调整为1522字节,其中1500字节为负载payload
    • IP数据包头信息至少20字节,IP数据包负载大约1480字节
    • TCP数据包头信息至少20字节,TCP数据包负载大约1460字节,继续扣除IP或者TCP额外头信息,TCP负载实际上约为1400字节
      http
  • TCP数据包编号
    • 如果发送内容超出1400字节,需分成多个包发送。TCP协议为每个包编号(sequence number,简称SEQ),以便接收的一方可按照顺序还原,发生丢包也可以快速定位
    • 第一个包编号是一个随机数,假设这个包负载长度是100字节,则下一个包编号是101
    • 每个数据包可以得到两个编号,自身的编号和下一个包的编号,接收方由此知道,应该按照什么顺序将它们组包成原始文件
      tcp seq
  • TCP数据包组装
    • 接收到数据包后,组包是由操作系统完成的,应用程序不会直接处理TCP数据包。操作系统不会处理TCP数据包里面的数据,一旦组装好TCP数据包,就按照TCP头部信息中的接收端口转交给监听该端口的应用程序
    • 应用程序接收到组装好的原始数据,比如浏览器访问,就会根据HTTP协议的Content-Length字段正确读出所需数据
    • 注意:一次TCP通信可以包括多个HTTP通信

二、慢启动和ACK

  • 引入
    • 服务器发送数据包,当然越快越好,最好一次性全发出去。但是发送太快,就很有可能丢包。带宽小、路由器过热、缓存溢出等许多因素都会导致丢包,路线不好的话,发的越快,丢得越多。最理想状态是在线路允许的情况下,达到最高速率
  • 慢启动(slow start)
    • TCP协议为了做到效率和可靠性统一,设计了慢启动机制。开始的时候发送得慢,然后根据丢包情况,调整速率,如果不丢包,则加快发送给速度,如果丢包,则降低发送速度
    • Linux内核(常量TCP_INIT_CWND),刚开始通信时候,发送方一次性发送10个数据包,即"发送窗口"的大小为10,然后停下来,等待接收方确认,再继续发送
  • ACK
    • 默认情况下,接收方每收到两个TCP数据包,就要发送一个确认消息(acknowledgement),所以这个确认消息就简称ACK
    • ACK携带两个信息
      • 期待要收到下一个数据包的编号
      • 接受方的接收窗口的剩余容量
    • 发送窗口
      • 发送方接收到ACK回复,并已知已发出数据包的最新编号,就会推测出接收方大概的接收速率,从而调整发送速率,这被称之为发送窗口,这个窗口大小是可变的
        tcp ack
    • 注意
      • 由于 TCP 通信是双向的,所以双方都需要发送 ACK。两方的窗口大小,很可能是不一样的。而且 ACK 只是很简单的几个字段,通常与数据合并在一个数据包里面发送
      • 下图一共是4次通信
        1)第一次通信,A主机发给B主机的数据包编号是1,长度是100字节
        2)第二次通信,B主机ACK编号是1+100=101,B主机发送给A主机数据包编号是1,长度是200字节
        3)第三次通信,A主机ACK编号是201,A主机发送给B主机数据包编号是101,长度是50字节
        4)第四次通信,B主机ACK编号是151,B主机发送数据包编号是201,长度是1000字节

        tcp ack both
  • 慢启动
    • 即使对于带宽很大、线路很好的连接,TCP 也总是从10个数据包开始慢慢试,过了一段时间以后,才达到最高的传输速率。这就是 TCP 的慢启动

三、丢包处理

  • 如何确认丢包?
    • 因为每个数据包都会携带下一个数据包编号,如果下一个数据包没有收到,则ACK不会发生变化
    • 比如:接收方收到4号包,但是没有收到5号包,ACK就会记录并返回发送方期待收到5号包,如果过段时间收到5号包,ACK将刷新;如果还是没有收到甚至已经接收到6、7号包,ACK依然不会变化,总是回复期待接收5号包,发送方发现三个连续重复的ACK,或者超时依然没有收到ACK回复,默认为丢包,将再次发送5号包即重传
      tcp lost package

四、TCP三次握手

参考阮一峰日志:
http://www.ruanyifeng.com/blog/2017/06/tcp-protocol.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值