TCP概述
TCP的特点:
- TCP是 点对点的传输方式:一个发送方,一个接收方
- TCP是可靠的、按序的字节流;
- TCP使用流水线机制;
- TCP发送方/接收方都有缓存;
- TCP是全双工(full-duplex)模式;
- TCP是面向连接的协议:
通信双方在发送数据之前必须建立连接
连接状态只在连接的两端中维护,在沿途节点中并不维护状态。
TCP连接包括:两台主机上的缓存、连接状态变量、socket等 - TCP有流量控制机制;
TCP段的结构:
TCP的序列号和ACK格式:
-
序列号:
- 序列号指的是segment中第一个字节的编号,而不是segment的编号
- 建立TCP连接时,双方随机选择序列号
-
ACKs:
- 希望接收到的下一个字节的序列号
- 累计确认:该序列号之前的所有字节均已被正确接收到
接收方如何处理乱序到达的Segment?——TCP规范中没有规定,由TCP的实现者做出决策
TCP可靠数据传输
概述:
- TCP在IP层提供的不可靠服务基础上实现可靠数据传输服务;
- TCP可靠数据传输使用流水线机制;
- TCP可靠数据传输使用累积确认机制;
- TCP使用单一重传定时器
- 触发重传的事件
- 超时
- 收到重复ACK
TCP的RTT和超时设置
- 超时时间应大于 RTT,但是RTT是变化的;过短导致不必要的重传,过长导致对段丢失时间反应慢
估算RTT:测量从段发出去到收到ACK的时间(忽略重传)
- 测量多个SampleRTT,求平均值,形成RTT的估计值 EstimatedRTT
TCP发送方事件
- 从应用层收到数据
- 创建Segment
- 序列号是Segment第一个字节的编号
- 开启计时器
- 设置超时时间:TimeOutInterval
- 超时事件
- 重传引起超时的Segment
- 重启定时器
- 收到ACK:如果确认此前未确认的Segment
- 更新SendBase;
- 如果窗口中还有未被确认的分组,重新启动定时器
TCP重传示例:
快速重传机制
- TCP的实现中,如果发生超时,超时时间间隔将重新设置,即将超时时间间隔加倍,导致其很大
通过重复ACK检测分组丢失:Sender会背靠背地发送多个分组;如果某个分组丢失,可能会引发多个重复的ACK如果sender收到对同一数据的3个ACK,则假定该数据之后的段已经丢失
快速重传:在定时器超时之前即进行重传
TCP流量控制
在TCP传输中,接收方为TCP连接分配 buffer
上层应用可能处理buffer中数据的速度较慢,发送方如果发送过快会导致溢出
流量控制:
Receiver通过在Segment 的头部字段将 RcvWindow 告诉Sender
Sender限制自己已经发送的但还未收到ACK的数据不超过接收方的空闲RcvWindow尺寸
即使Receiver告知Sender RcvWindow=0;为了让后续的传输仍能进行,发送方仍然会发送一个小段
TCP连接管理
TCP sender和receiver在传输数据前需要建立连接:初始化TCP变量:Seq. #、Buffe、r和流量控制信息
建立连接三步握手:
关闭TCP连接管理:
- Step 1: client向server发送TCP FIN 控制segment
- Step 2: server 收到FIN, 回复ACK. 关闭连接, 发送FIN
- Step 3: client 收到FIN, 回复ACK(进入“等待” –如果收到FIN,会重新发送ACK)
- Step 4: server收到ACK. 连接关闭.
————————————————————————————————————————————————————————
由于水平有限及时间仓促或疏忽大意以及其他的一些原因,文中难免会存在一些错误,如若有发现不正确的地方,还请大佬们评论或私信告之于我,以便及时纠错
转载:https://blog.csdn.net/weixin_43154583/article/details/105659425
查看评论