2.3收发数据
2020-04-18 本文已影响0人
August________
2.3收发数据
-
将HTTP消息交给协议栈
- 应用程序调用socket库中的write将发送的数据交给协议栈
- 协议栈收到数据后执行发送操作。
-
协议栈收到数据之后并不会马上发送,影响协议栈发送的两大因素
-
数据长度:当从应用程序中收到的数据长度超过或者接近MSS时发送
- MTU: 一个网络包的最大长度,以太网中一般为1500字节
- MSS: 出去头部之后,一个网络包所能容纳的TCP数据的最大长度
- [图片上传失败...(image-fa024d-1587223590343)]
-
时间:协议栈内部有一个计时器,经过一段时间之后,网络包就会发送出去。
-
-
-
对较大的数据进行拆分
- 当发送缓冲区的数据超过MSS长度时,数据会被以没MSS长度为单位进行拆分放进单独的网络包进行发送。
- [图片上传失败...(image-b5a3da-1587223590344)]
-
使用ACK号确认网络包已收到
-
TCP具备确认是否成功收到网络包
- 通过序号和ACK号进行数据确认
- TCP数据收发是双向的,客户端和服务端需要各自计算序号,双方在连接的过程中相互告知自己计算的序号和初始值。
- 序号和ACK号交互的实际过程
-
[图片上传失败...(image-620e08-1587223590344)]
- 客户端将到服务端方向通信相关的序号初始值,发送给服务端。
- 服务端通过初始值算出ACK号并返回作为确认,同时也计算出到客户端方向的通信的序号初始值,发客户端给
- 客户端根据初始值算出ACK返回给服务端
- 客户端向服务端发送请求,序号和数据一起发送
- 服务度收到数据并返回ACK号
- 同7
- 同服务端向客户端发送数据正好相反
-
-
- 通过“序号”和“ACK号”可以确认接收方是否收到了网络包
-
根据网络包平均返回时间调整ACK号等待时间
-
TCP采用了动态调整等待时间的方法
- 等待时间是根据ACK号返回所需要的时间来确定的
-
-
使用窗口有效管理ACK号
- 滑动窗口:发送一个包之后,不等待ACK号返回,直接发送后续一系列包
- [图片上传失败...(image-66c507-1587223590344)]
- 接收缓冲区:接收方的TCP收发数据存放的地方
- 缓冲区溢出:数据达到速率比处理数据并发给应用程序的速率要快,数据越来越大就会造成溢出。
- 滑动窗口的结局思路:接收方告知发送方最多能处理多少的数据,发送方根据这个值控制发送数据
-
ACK和窗口的合并
- 确定返回ACK号和更新窗口的时机。可以提高收发数据的效率。
- 在等待发送ACK号的时候正好更新窗口,就可以吧ACK和更新窗口放在一个网络包里一起发送。
-
接受HTTP响应消息
- 协议栈检查收到的数据块和TCP头部的内容,判断是否有数据丢失
- 如果没有问题返回ACK号
- 协议栈将数据暂存到接受缓冲区中
- 将数据连接起来还原出原始数据
- 将原始数据复制到应用程序指定的内存地址中
- 最后控制流程交回应用程序