传输层基础
-
传输层的功能
- 应用进程之间的逻辑通信
- 复用和分用
- 差错检测:TCP - 重发, UDP - 丢弃
- 提供面向连接和无连接的传输协议
-
端口号:16b,能表示 65535 个不同的端口号,端口号只具有本地意义
-
服务器端使用的端口号:
- 熟知端口号:0-1023
- 登记端口号:1024-49151,必须在 LANA 登记防止重复
-
客户端使用的端口号 / 短暂端口号:49152-65535
-
-
套接字 Socket:端口号拼接到 IP 地址,即套接字 = {IP 地址:端口号}
-
传输层协议应用
UDP
-
功能:复用和分用,差错检测
-
特点:
- 无须建立连接
- 无连接状态
- 首部开销小:8B
- 没有拥塞控制
- 支持一对一,一对多,多对一,多对多
- 面向报文:对应用层交下来的报文,添加首部后向下交给 IP 层,一次发送一个报文,不合并,不拆分,因此报文是 UDP 处理的最小单位
-
场景:常用于一次性传输较少的数据的网络应用,如 DNS,SNMP
-
不可靠交付:可靠的工作交给应用层完成
-
首部格式
- 源端口:不需要时可用全 0
- 目的端口:必须要,如果端口号错误,则 ICMP 发送端口不可达差错报文
- 长度:包含首部,最小 8B(仅包含首部)
- 检验和:可选,检验整个数据报,不使用检验和全置为 0,如果计算的检验和为 0,则全置为 1
TCP
-
TCP 特点:
- 面向连接:TCP 连接时一条逻辑连接
- 只能一对一
- 提供可靠交付:无差错,无丢失,不重复,有序
- 全双工通信
- 面向字节流
- 首部可变:最短 20B,可追加 4B 整数倍的选项(整个首部最大 60B)
-
TCP 首部
- 源端口:2B
- 目的端口:2B
- 序号: 4B
- 确认号:4B,表示期望收到的下一个报文段的第一个数据字节的序号
- 数据偏移:4b,以 4B 为单位,表示数据距离报文起始的偏移量
- 保留:6b
- 紧急位 URG:为 1 时有效,表示有紧急数据(优先级高)
- 确认位 ACK:为 1 时表示确认号字段有效(规定连接建立后置为 1)
- 推送位 PSH:为 1 时表示对方要马上响应
- 复位位 RST:为 1 时表示出现严重差错(主机崩溃宕机等),释放连接,也可以拒绝非法报文段
- 同步位 SYN:为 1 时表示是连接请求或者连接接收报文
- 终止位 FIN:为 1 时要求释放连接
- 窗口:2B
- 检验和:2B
- 紧急指针:2B,在 URG = 1 时此字段有效
- 选项:最长 40 B
- 填充:保证首部长度是 4B 的整数倍
-
TCP 连接端口 / 两侧端点:套接字
TCP 连接建立和释放
-
TCP 连接的建立:三次握手
- 客户机到服务器:SYN = 1(请求),seq = x,SYN报文不能携带数据,消耗掉一个序号
- 服务器到客户机:SYN = 1(接受),ACK = 1,ack = x + 1,seq = y
- 客户机到服务器:ACK = 1,ack = y + 1, seq = x + 1,这个报文带数据则消耗一个序号,不带数据则不消耗
-
TCP 连接的释放:四次挥手
- 客户机到服务器:FIN = 1,seq = u,带不带数据都要消耗一个序号,这时客户机不能再发送数据,但可以接收数据
- 服务器到客户机:ACK =1,ack = u + 1,seq = v,释放客户机到服务器连接
- 服务器到客户机重复12步骤
TIP:客户机最短释放时间 1RTT + 2MSL,服务器最短释放时间 1.5 RTT
TCP 可靠传输和流量控制
-
TCP 可靠传输
- 序号
- 确认:累计确认
- 重传:超时和冗余 ACK(3个)
-
TCP 流量控制
- 发送方维持接收窗口 rwnd(单位 B)
- 发送方维持接收窗口 rwnd(单位 B)
TCP 拥塞控制
-
发送方窗口:接收窗口 rwnd,拥塞窗口 cwnd
-
发送窗口的上限:min(rwnd,cwnd)
-
慢开始算法和拥塞避免
- cwnd = 1,随传输次数指数增长
- 慢开始门限 ssthresh,cwnd 达到 ssthresh 后,每次传输 + 1
- 如果出现拥塞,ssthresh = 当前 cwnd 的一半,cwnd = 1
-
快重传和快恢复
- 快重传:连续接收到 3 个冗余 ACK 立刻重传相应的报文段
- 快恢复:连续接收到 3 个冗余 ACK 后,ssthresh = 当前 cwnd 的一半,cwnd = 当前 cwnd 的一半