Unix网络编程
HTTP权威指南
第一行代码 第2版
第一行代码 第3版
Computer Organization And Design e
The Linux Programming interface e
TCP/IP 详解 e
TCP
TCP 负责足够快地发送数据报,又不能引起网络拥塞。TCP 超时后要重传没有递交的数据报。还要把错序的数据报重新装配成正确的顺序。
TCP 服务由发送端和接收端创建一种称为套接字(socket)的端点来获得。每个 socket 都有一个编号,由主机的 IP 地址加主机的 16 位数值组成。16 位数值称为端口(port)。为获得 TCP服务,必须显式的在两台机器的套接字之间建立连接。
TCP 连接是全双工的,不支持组播和广播。
TCP 连接上的每个字节都有 TA 自己独有的 32 位序号。
TCP 实体使用的基本协议是具有动态窗口大小的滑动窗口协议。确认号的值等于接收端期望接收的下一个序号。
TCP 段头结构
ACK 位表明 Acknowledgment number 是有效的。
SYN (Synchronize sequence numbers)
FIN
每个选项(Options)具有类型-长度-值(Type-Length-Value)编码。
TCP 拥塞控制
当网络的负载超过处理能力,就会产生拥塞。当路由器上的队列增长到很大时,网络层检测到拥塞,并试图通过丢弃数据包来管理拥塞。传输层接收到网络层传来的拥塞信息,也会减慢 TA 发送到网络的流量速率。
TCP 维护一个拥塞窗口(congestion window),窗口大小是任何时候发送端可以向网络发送而字节数。
流量控制窗口指出了接收端可以缓冲的字节数。
慢开始
拥塞避免
快重传
快恢复
TCP 建立连接
第 1 步,客户端发送一个 TCP 段,SYN 位设为 1 。一般随机挑选一个初始的 sequence number (client_isn),
第 2 步,当服务端收到包含 TCP SYN segment 的 IP datagram 时,服务端会提取出 TCP SYN segment。然后服务端向客户端发送 TCP segment, SYN 位置 1,ACK 置 1,acknowledgment number 设为 isn + 1,再挑选一个 server_isn 放在 sequence number。
第 3 步,当客户端收到 SYNACK segment 后,客户端再向服务端发送一个 TCP segment,ACK 置 1,acknowledgment number 设为 server_isn + 1,SYN 位置 0。带上发送到服务端的数据。
TCP 关闭连接
客户端和服务端都可以断开连接。
第 1 步,客户端发送 TCP segment,FIN 置 1,
第 2 步,服务端收到后,ACK 置 1,
第 3 步,服务端再发送 segment,FIN 置 1,
第 4 步,客户端发送 segment,ACK 置 1,
UDP
QUIC
QUIC在许多方面可以被视为一种新型的可靠且安全的传输层协议,它适合为形似HTTP的协议提供服务,并且可以解决一些在基于TCP和TLS传输的HTTP/2协议中存在的缺点。
问题
网络条件比较好的情况下,TCP 的什么机制会影响传输速度?
TCP 报文段首部有 20 个字节,利用率较低。
慢启动
如何实现 UDP 的可靠传输?
UDP 是传输层协议,我们要实现 UDP 的可靠传输,就要在应用层模仿 TCP,为 UDP 加上那些机制。
添加 seq/ack,添加序列号和确认号,确保数据发送到对端。
添加发送和接收缓冲区,用于用户超时重传。
添加超时重传机制。
添加滑动窗口和拥塞窗口。