TCP&UDP

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 段头结构

image-20210304160457963

ACK 位表明 Acknowledgment number 是有效的。

SYN (Synchronize sequence numbers)

FIN

每个选项(Options)具有类型-长度-值(Type-Length-Value)编码。

TCP 拥塞控制

当网络的负载超过处理能力,就会产生拥塞。当路由器上的队列增长到很大时,网络层检测到拥塞,并试图通过丢弃数据包来管理拥塞。传输层接收到网络层传来的拥塞信息,也会减慢 TA 发送到网络的流量速率。

TCP 维护一个拥塞窗口(congestion window),窗口大小是任何时候发送端可以向网络发送而字节数。

流量控制窗口指出了接收端可以缓冲的字节数。

慢开始

拥塞避免

快重传

快恢复

TCP 建立连接

image-20210304165229211

第 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 关闭连接

image-20210304165249120

客户端和服务端都可以断开连接。

第 1 步,客户端发送 TCP segment,FIN 置 1,

第 2 步,服务端收到后,ACK 置 1,

第 3 步,服务端再发送 segment,FIN 置 1,

第 4 步,客户端发送 segment,ACK 置 1,

ca9947b8e8924dd6a098fcb2743fa19a~tplv-k3u1fbpfcp-zoom-1.image

image-20210304165156990

UDP

QUIC

QUIC在许多方面可以被视为一种新型的可靠且安全的传输层协议,它适合为形似HTTP的协议提供服务,并且可以解决一些在基于TCP和TLS传输的HTTP/2协议中存在的缺点。

问题

网络条件比较好的情况下,TCP 的什么机制会影响传输速度?

TCP 报文段首部有 20 个字节,利用率较低。

慢启动

如何实现 UDP 的可靠传输?

UDP 是传输层协议,我们要实现 UDP 的可靠传输,就要在应用层模仿 TCP,为 UDP 加上那些机制。

添加 seq/ack,添加序列号和确认号,确保数据发送到对端。

添加发送和接收缓冲区,用于用户超时重传。

添加超时重传机制。

添加滑动窗口和拥塞窗口。

参考