网络层只负责送到主机,传输层用端口送到进程。UDP 只做这件事;TCP 还要保证可靠,并且不把对方和网络压垮。
这一章只要会:
| UDP | TCP | |
|---|---|---|
| 连接 | 无连接 | 面向连接 |
| 可靠性 | 不可靠,尽最大努力交付 | 可靠:不丢、不重复、按序到达 |
| 传输单位 | 面向报文:应用层给多长就发多长 | 面向字节流:把数据看成一串字节 |
| 首部 | 8 B | 20 B 起 |
| 通信对象 | 一对一、一对多、多对多 | 只能一对一 |
| 流量控制、拥塞控制 | 没有 | 有 |
| 典型应用 | DNS、DHCP、实时音视频 | HTTP、FTP、电子邮件 |
长度包括首部和数据。检验和要把首部和数据都算进去,计算时临时加上一个 12 B 的伪首部(含源 IP、目的 IP)。
固定首部 20 B。大题读抓包数据时,就是按这个格式一个字段一个字段地对。
| 字段 | 含义 |
|---|---|
| 序号 seq | 本报文段数据部分第一个字节的编号 |
| 确认号 ack | 期望收到的下一个字节的编号。ack = n 表示 n − 1 及之前的都收到了 |
| 数据偏移 | TCP 首部长度,单位 4 B |
| 窗口 | 接收方告诉对方:我现在还能接收多少字节(rwnd) |
| SYN | 建立连接时置 1 |
| FIN | 释放连接时置 1 |
| ACK | 置 1 时确认号才有效。连接建立后所有报文段的 ACK 都是 1 |
甲向乙连续发送两个报文段,分别带 300 B 和 500 B 数据,第一个报文段的序号是 200。乙正确收到两个报文段后,发回的确认号是多少?
所以第三次握手 seq = x + 1;如果它没带数据,客户发的第一个数据报文段 seq 还是 x + 1。
| 阶段或事件 | 条件 | cwnd 怎么变 |
|---|---|---|
| 慢开始 | cwnd < ssthresh | 每过一轮翻倍,但不能超过 ssthresh |
| 拥塞避免 | cwnd ≥ ssthresh | 每过一轮加 1 |
| 超时 | 认为网络严重拥塞 | ssthresh = cwnd ÷ 2,cwnd = 1,重新慢开始 |
| 收到 3 个重复 ACK | 认为只是个别报文段丢了 | 立即重传(快重传);ssthresh = cwnd ÷ 2,cwnd = ssthresh,直接进入拥塞避免(快恢复) |
实际能发多少,由两个窗口共同决定:发送窗口 = min(接收窗口 rwnd, 拥塞窗口 cwnd)。
MSS 为 1 KB,拥塞窗口为 16 KB 时发生超时。接下来 4 个 RTT 都传输成功,此时拥塞窗口多大?
ssthresh = 12,当前 cwnd = 8,下一轮是多少?
上图第 16 轮到第 17 轮就是这种情况。
3 个重复 ACK:ssthresh = 12,cwnd = 12,进入拥塞避免。
超时:ssthresh = 12,cwnd = 1,重新慢开始。
700。收到的是 500 ~ 699,下一个期望的是 700。