分类
路由选择协议
struct IpHeader {
/* [0, 4) */
uint4_t version, header_length/* 4-Byte */;
uint8_t service;
uint16_t packet_length/* 1-Byte */;
/* [4, 8) */
uint16_t identifier;
uint3_t tag;
uint13_t offset/* 8-Byte */;
/* [8, 12) */
uint8_t life_time/* -- at each router */;
uint8_t protocal/* TCP = 6, UDP = 17 */;
uint16_t header_check_sum;
/* [12, 16) */
uint32_t source_ip;
/* [16, 20) */
uint32_t target_ip;
/* [20, ..) */
int[] optional_and_padding;
};
受数据链路层 MTU 限制,较长的 IP 数据报将被分为若干片:
DF
,表示 Don’t Fragment;最低位记作 MF
,表示 More Fragments。IP 地址 = 网络号 + 主机号
特殊 IP 地址:
0
,主机号全为 0
,只可作源0
,主机号为特定值,只可作目标0
1
,主机号全为 1
,只可作目标1
,只可作目标127
,主机号不全为 0
且不全为 1
类型 | A | B | C | D | E |
---|---|---|---|---|---|
网络号大小 | 8-bit | 16-bit | 24-bit | ||
前几位 | 0 | 10 | 110 | 1110 | 1111 |
首字节范围 | [1, 127) | [128, 192) | [192, 224) | [224, 240) | [240, 255) |
可用网段数 | $2^7-2$ | $2^{14}-2$ | $2^{21}-2$ | ||
最大主机数 | $2^{24}-2$ | $2^{16}-2$ | $2^{8}-2$ |
私有地址
10.*.*.*
,共 1 个网段172.16.*.*
~172.31.*.*
,共 16 个网段192.168.0.*
~192.168.255.*
,共 256 个网段【网络地址转换 (Network Address Translation)】
global_ip:global_port
local_ip:local_port
0
且不全为 1
) 255.0.0.0
,B 类 255.255.0.0
,C 类 255.255.255.0
0
且不全为 1
) 141.14.72.24
,子网掩码 255.255.192.0
,网络地址 141.14.64.0
提供
特点:无连接、首部开销小、尽最大努力交付(不可靠)
struct UdpHeader {
uint16_t source_port, target_port;
uint16_t datagram_length, check_sum;
};
struct PseudoHeader {
uint32_t source_ip, target_ip;
uint8_t zero = 0;
uint8_t protocal = 17; /* UDP */
uint16_t datagram_length;
};
将伪首部 + UDP 报文段视为 uint16_t[]
,以(二进制)反码之和的反码作为校验和:
0
作为 udp_header.check_sum
的值。1
则无差错。特点:有连接、一对一、可靠交付、全双工、面向字节流
struct TcpHeader {
uint16_t source_port, target_port;
uint32_t ack/* acknowledge number */;
uint32_t seq/* sequence number */;
uint4_t header_length/* 以 4B 为长度 */; uint6_t reserved;
uint1_t URG/* URGent */, ACK/* ACKnowledge */, PSH/* PuSH */;
uint1_t RST/* ReSeT */, SYN/* SYNchronize*/, FIN/* FINish */;
uint16_t receive_window;
uint16_t check_sum, urgent_ptr;
uint32_t optional[];
};
SYN=1, seq=x
)SYN=1, ACK=1, seq=y, ack=x+1
)ACK=1, seq=x+1, ack=y+1
),可携带数据FIN=1, seq=u
)ACK=1, seq=v, ack=u+1
),进入半关闭状态(Server 仍可向 Client 传输数据)FIN=1, ACK=1, seq=w, ack=u+1
)ACK=1, seq=u+1, ack=w+1
,再等待 2 MSL(最长报文段寿命的两倍) [0, ack)
的字节)匹配接收端读取速率与发送端发送速率
tcp_header
向发送端许诺接收窗口 (receive window, rwnd
)min(rwnd, cwnd)
为发送窗口 (send window, swnd
) 的上限发送端按以下四种算法(窗口单位为 MSS,时间单位为 RTT)计算拥塞窗口 (congestion window, cwnd
):
cwnd
从 1
开始(试探网络性能)指数增长 (*= 2
);若 cwnd >= ss_thresh
,则改用拥塞避免 [2]。cwnd
线性增长 (+= 1
);若出现超时,则判定拥塞,取 ss_thresh = cwnd / 2
,改用慢开始 [1]。ss_thresh = cwnd / 2
,再令 cwnd
从 ss_thresh
开始线性增长。