功能
提供进程之间的通信,即端口到端口的通信。传输层将报文加上端口信息后传给链路层。
Description:端到端的透明数据传输,差错控制,流量控制
过程:
进程-端口-主机-路由-主机-端口-进程
其中,IP协议作用于主机之间,传输层协议(TCP/UDP)作用于端口之间.
端口
略
Socket=(IP:Port)
面向连接和不
TCP:面向连接 可靠性强 报文体积大
UDP:无:不保证送达 速度快
UDP
在IP的基础上添加了复用,分用和差错检测
复用:多个源端口都走IP
分用:一条IP分给多个目标端口
提供无连接不保证送达的服务,可靠检查需要在应用层处理
用于DNS等服务
UDP不分割报文,只是加上首部就传给网络层的IP
首部格式
UDP首部仅有8B
16位原端口-16位目的端口
16位UDP长度(包括首部的8B,单位为字节)-16位Checksum
数据部分
校验和的计算
- 内容的补全:在数据报之前添加一个仅用作校验和计算的伪首部.伪首部长12B
- 数据的补全:补全为8B的整数倍
- 计算:每4B16位为一组,求和之后求反
校验和其他细节
- 校验和字段是可选的,不想用可以全0
- 校验和计算结果为全0,则填入全1
- 伪首部包含了IP报文的部分信息
TCP
- 面向连接的可靠传输层协议
- 点对点,一对一
- 全双工
- 可靠有序的交付服务
- 面向字节流
TCP的报文段
- 源/目的端口
- 序号SEQ,长4B
- 确认号ACK,长4B
- 数据offset,长4b表示首部长度(单位:per 4B)
- reserve 6位
- FLAGS,6位
- 窗口,占2B,表示接收方的现有缓存空间.(e.g. seq=701,window=1000,则可以接受的序号区间在702~1701之间)
- 校验和,占2B.同样要加上12B的伪首部,参看UDP.
- 紧急指针,2B
- Options,包含MSS(MSS仅有数据字段长度)
- Padding,整个长度是4B的整数倍
连接的建立:三次握手
- SYN=1,SEQ=x
- SYN=1,ACK=1,ACK=x+1,SEQ=y
- ACK=1,SEQ=x+1,ACK=y+1
连接的释放:四次挥手
连接双方都可以提出FIN
- FIN=1(要求FIN)
- ACK=1(服务器收到FIN)
开始数据传送,经过几个传输周期
这里仅有服务器->客户端的数据流向,ACK不变,并且客户端处连接已经关闭 - FIN=1,ACK=1(服务器完成数据传输,关闭服务端)
- ACK=1(客户端收到消息)
收到服务器消息延迟2MSL,客户端关闭
END
TCP的可靠传输机制
和GBN/SR不同,上述协议运行在链路层,保证了数据帧的有序可靠。
TCP的序号
TCP是针对字节流的,所以序号是数据部分字节的序号
和建立连接和释放连接时候不同,SYN和FIN报文没有数据的
e.g. 数据传输阶段,第一报文段SEQ=1,数据长度100,则返回的ACK=101,下一个报文SEQ=101
序号建立在字节流上而不是报文段
ACK
ACK为期待的下一个报文的字节序号.
TCP使用累积确认,只确认第一个丢失的字节.
e.g. 当SEQ=3的报文缺失,但收到了SEQ=5,ACK还是3.
重传机制
超时重传
如果发出报文段后规定时间RTT没有接收到ACK,则认为是报文丢失,重传一份
RTT由采样算法决定.
Multi-ACK
即发送/收到了多个相同的ACK.
为什么会发生?
该报文没有到达接收方而后续的报文到达并储存在接收方的buffer中.在响应后续的报文时就会传送缺失的那个ACK(见上).此时发送方就会收到两个相同的ACK,表示该报文丢失,所以重传.
这种重传无视计时器的限制,所以叫快速重传.
流量控制
- 目的:保护接收方的缓存区不溢出
- 原理:滑动窗口匹配:接收方根据发送方的发送窗口大小动态调整rwnd.
rwnd是通过TCP报文的头部传输的.
拥塞控制
流量控制考虑的是两端的承受能力(缓冲区),拥塞控制考虑的是线路的承受能力.
keywords:慢开始,拥塞避免,快重传,快恢复,Reno
这一块已经比较清楚了,只放个图做参考.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NtelsWPe-1631863207384)(index_files/0.12337701345063509.png)]
注意门限值,收到3个重复的ACK时拥塞窗口/2
TCP传输实例
仅作参考.TCP入门与实例讲解 - 程序猿小卡 - 博客园 (cnblogs.com)
Prep.
主机A和主机B通过TCP建立连接,为方便区分,起始SEQ均为0(Relative Offset)
未特别指出,标志位均为0.
连接建立
- A:SYN=1,seq=0
- B:SYN=1,ACK=1,seq=0,ack=1
- A:ACK=1,seq=1,ack=1
数据传输
- B:seq=1,len=273,ack=2
- A:seq=2,len=1,ack=274已经收到前273字节
- B:seq=274,len=1400,ack=3发送长1400的报文
- …
数据断开
- A:FIN=1,seq=84,ack=9379 此时A不再发送信息,处于半开状态
- B:ACK=1,seq=9379,ack=85
- B:FIN=1,ACK=1, B收到断开请求,传送剩余内容 这里没有
- A:ACK=1,seq=85,ack=9380 A收到B的传送完毕的信息,断开
题目中存在的一些问题
- TCP 使用对报文确认的机制
TCP拥塞和流量控制解题TIPs
流量控制和接收窗口
接收方根据自己剩余的缓存,动态调整发送方发送窗口的大小。
这种机制通过接收方在ACK中的窗口字段设置rwnd实现.
rwnd=剩余的接收缓存,在发送完毕后会有变动.
具体的控制过程参考P221 Fig.5.10
拥塞控制
- 慢开始(指数)-拥塞避免-加法增大
- 遇到拥塞,门限/2
- 用慢开始-打到1MSS重新指数
- 用快恢复-打到门限然后线性增加
TIPS
最终的发送窗口=
M
i
n
(
c
w
n
d
,
r
w
n
d
)
Min(cwnd,rwnd)
Min(cwnd,rwnd)
当提到收到三个ACK后,使用快恢复,否则默认慢开始.
以及,考虑一个这样的表述方式:P226,21
接下来*个RTT内
每个RTT代表一个传输轮次,该轮次下发送当前发送窗口个数的报文
即:
- 发送1个MSS
- 2个
- 4个
- 8个
当全部收到ACK后
此时cwnd再次*2,应该cwnd=16
门限不是 2 n 2^n 2n?
e.g. P226.22
后半段门限为6
则慢启动序列为
1
,
2
,
4
,
6
,
7
,
8
,
.
.
.
1,2,4,6,7,8,...
1,2,4,6,7,8,...
MSS和报文段
接受窗口,发送窗口的大小变化以字节为单位.
即,如果MSS=2KB(P227,28)
cwnd序列为2,4,8,16,…
RTT和时间
RTT是一个时间段.
所以要注意题目提到的瞬间.比如,发送时或收到ACK时,etc
比如,1,2,4,8
8发送时是3RTT,收到ack是4RTT.
一定要注意,很多题目就在这里挖坑.
字节**为单位.
即,如果MSS=2KB(P227,28)
cwnd序列为2,4,8,16,…
RTT和时间
RTT是一个时间段.
所以要注意题目提到的瞬间.比如,发送时或收到ACK时,etc
比如,1,2,4,8
8发送时是3RTT,收到ack是4RTT.
一定要注意,很多题目就在这里挖坑.