2.3收发数据

2.3收发数据

  1. 将HTTP消息交给协议栈

    1. 应用程序调用socket库中的write将发送的数据交给协议栈
    2. 协议栈收到数据后执行发送操作。
    1. 协议栈收到数据之后并不会马上发送,影响协议栈发送的两大因素

      1. 数据长度:当从应用程序中收到的数据长度超过或者接近MSS时发送

        1. MTU: 一个网络包的最大长度,以太网中一般为1500字节
        2. MSS: 出去头部之后,一个网络包所能容纳的TCP数据的最大长度
        3. [图片上传失败...(image-fa024d-1587223590343)]
      2. 时间:协议栈内部有一个计时器,经过一段时间之后,网络包就会发送出去。

  2. 对较大的数据进行拆分

    1. 当发送缓冲区的数据超过MSS长度时,数据会被以没MSS长度为单位进行拆分放进单独的网络包进行发送。
    2. [图片上传失败...(image-b5a3da-1587223590344)]
  3. 使用ACK号确认网络包已收到

    1. TCP具备确认是否成功收到网络包

      1. 通过序号和ACK号进行数据确认
      2. TCP数据收发是双向的,客户端和服务端需要各自计算序号,双方在连接的过程中相互告知自己计算的序号和初始值。
      1. 序号和ACK号交互的实际过程
      1. [图片上传失败...(image-620e08-1587223590344)]

        1. 客户端将到服务端方向通信相关的序号初始值,发送给服务端。
        2. 服务端通过初始值算出ACK号并返回作为确认,同时也计算出到客户端方向的通信的序号初始值,发客户端给
        3. 客户端根据初始值算出ACK返回给服务端
        4. 客户端向服务端发送请求,序号和数据一起发送
        5. 服务度收到数据并返回ACK号
        6. 同7
        7. 同服务端向客户端发送数据正好相反
    1. 通过“序号”和“ACK号”可以确认接收方是否收到了网络包
  4. 根据网络包平均返回时间调整ACK号等待时间

    1. TCP采用了动态调整等待时间的方法

      1. 等待时间是根据ACK号返回所需要的时间来确定的
  5. 使用窗口有效管理ACK号

    1. 滑动窗口:发送一个包之后,不等待ACK号返回,直接发送后续一系列包
    2. [图片上传失败...(image-66c507-1587223590344)]
    1. 接收缓冲区:接收方的TCP收发数据存放的地方
    2. 缓冲区溢出:数据达到速率比处理数据并发给应用程序的速率要快,数据越来越大就会造成溢出。
    1. 滑动窗口的结局思路:接收方告知发送方最多能处理多少的数据,发送方根据这个值控制发送数据
  6. ACK和窗口的合并

    1. 确定返回ACK号和更新窗口的时机。可以提高收发数据的效率。
    2. 在等待发送ACK号的时候正好更新窗口,就可以吧ACK和更新窗口放在一个网络包里一起发送。
  7. 接受HTTP响应消息

    1. 协议栈检查收到的数据块和TCP头部的内容,判断是否有数据丢失
    2. 如果没有问题返回ACK号
    3. 协议栈将数据暂存到接受缓冲区中
    4. 将数据连接起来还原出原始数据
    5. 将原始数据复制到应用程序指定的内存地址中
    6. 最后控制流程交回应用程序

你可能感兴趣的:(2.3收发数据)