读书笔记-TCP/IP详解 卷1:协议
https://book.douban.com/subject/1088054/
IP
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live | Protocol | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding | <-- optional
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| DATA ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
UDP
0 7 8 15 16 23 24 31
+--------+--------+--------+--------+
| Source | Destination |
| Port | Port |
+--------+--------+--------+--------+
| | |
| Length | Checksum |
+--------+--------+--------+--------+
| |
| DATA ... |
+-----------------------------------+
TCP
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |C|E|U|A|P|R|S|F| |
| Offset| Res. |W|C|R|C|S|S|Y|I| Window |
| | |R|E|G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Ch1 概述
局域网: LAN(Local Area Netword)
TCPIP协议族
层次 | 常见协议 | 协议特点 |
---|---|---|
应用层 | HTTP Telnet FTP | End-to-End |
传输层 | TCP UDP | End-to-End |
网络层 | IP ICMP IGMP | Hop-by-Hop |
链路层 | MAC 802.3 ARP RARP | Hop-by-Hop |
通常, 应用层对应的应用程序是一个用户进程, 下三层在系统内核中执行.
一个互联网(Internet)就是一组通过相同协议族相连在一起的网络.
网桥在链路层上对网络进行互连; 路由器在网络层上对网络进行互连.
ICMP是IP协议的附属协议(同属网络层), 但是ICMP报文被封装到IP数据报中.
0b 0000 0000
=> 0
0b 1000 0000
=> 2^7=128
0b 1100 0000
=> 2^7+2^6=192
0b 1110 0000
=> 2^7+2^6+2^5=224
0b 1111 0000
=> 2^7+2^6+2^5+2^4=240
A: 0wwwwwww hhhhhhhh hhhhhhhh hhhhhhhh 0.0.0.0 ~ 127.255.255.255
B: 10wwwwww wwwwwwww hhhhhhhh hhhhhhhh 128.0.0.0 ~ 191.255.255.255
C: 110wwwww wwwwwwww wwwwwwww hhhhhhhh 192.0.0.0 ~ 223.255.255.255
D: 1110bbbb bbbbbbbb bbbbbbbb bbbbbbbb 224.0.0.0 ~ 239.255.255.255
E: 11110xxx xxxxxxxx xxxxxxxx xxxxxxxx 240.0.0.0 ~ 255.255.255.255
A类地址: 8*1-1=7 bit网络号, 8*3=24 bit主机号
B类地址: 8*2-2=14 bit网络号, 8*2=16 bit主机号
C类地址: 8*3-3=21 bit网络号, 8*1=8 bit主机号
D类地址: 8*4-4=28 bit多播组号
E类地址: 留待后用
TCP segment 报文段 UDP datagram 数据报 IP datagram 数据报 Ethernet frame 帧
/etc/services
The Well Known Ports are those from 0 through 1023. The Registered Ports are those from 1024 through 49151 The Dynamic and/or Private Ports are those from 49152 through 65535
RFC
IANA
Ch2 链路层
以太网封装/IEEE802.3封装
都使用 8bit/byte*6byte=48bit 的MAC地址.
以太网封装
6byte目的地址
+ 6byte源地址
+ 2byte类型
+ 46~1500byte数据
+ 4byteCRC
以太网帧内数据: 46~1500byte
以太网帧体积: 64~1518byte
类型值 | 对应类型 |
---|---|
0800 | IP数据报 |
0806 | 28byteARP+18bytePAD |
8035 | 28byteRARP+18bytePAD |
SLIP: 串行线路 (IP Serial Line IP)
以END(0xc0)分隔, 在串行线路上对IP数据报进行封装.
缺陷:
- 必须知道对方IP, 无法通知给对方本机IP.
- 数据帧无类型字段. 传输SLIP的串行线路无法同时传输其他协议.
- 无校验和, 校验需要依赖上层协议.
CSLIP, 压缩的SLIP, 对报文首部压缩.
PPP, 点对点串行协议. 比SLIP相比, 增加了1bye协议字段和2byteCRC.
SLIP, CSLIP, PPP 都运行在低速串行链路上.
环回接口 (Loopback Interface)
- 传给环回地址的数据都作为IP输入
- 广播/多播的数据报都复制一份到环回接口
- 传给给主机IP地址的数据都送到环回接口
MTU 最大传输单元
MTU指的是帧中data部分的长度, 即 单个帧的实际最大负载容量
, 不包括帧头帧尾.
Ethernet MTU: 1500
IEEE 802.3: 1492
本机loopback的MTU为65536, 不受Ethernet MTU影响.
Ch3 IP:网际协议
不可靠,无连接的数据报传送服务.
网络字节序: big endian. 最高位在左边.
IP首部20byte, 最长60byte.
TOS: 服务类型
TTL: 生存时间
IP首部校验和只对本IP数据报的首部负责, 内部负载数据自行负责各自的差错检验.
IP首部始终是32bit的整数倍(占满图例的整行, 每行4byte, 32bit).
目的IP地址与本机IP地址(或IP广播地址) | 匹配 | 不匹配 |
---|---|---|
路由 | 处理 | 转发 |
主机 | 处理 | 丢弃 |
IP路由选择是逐跳的, hop-by-hop.
IP路由过程中, 目的IP始终不变, 目的MAC每条都变.
0.0.0.0
可以作为源IP, 不可作为目的IP.
查看80端口
netstat -antp | grep :80
Ch4 ARP:地址解析协议
ARP/RARP 由以太网封装, 但隶属于链路层.
32bit IP地址 ==ARP==> 48bit MAC地址
32bit IP地址 <==RARP= 48bit MAC地址
以太网广播所有机器, 以获得目的IP对应的MAC地址.
每个网络接口有一个硬件地址, 在硬件上进行数据帧交换依赖正确的网络接口.
ARP代理: 路由器伪装为目的主机, 将自己的MAC发过去.
免费ARP: 发送ARP查找自己的IP. 确定LAN内自己的IP没有冲突; 通知LAN内其他成员更新ARP Cache.
Ch5 RARP: 逆地址解析协议
无盘系统子啊引导时获取IP地址.
RARP 在数据链路层广播, 防止路由器转发.
op字段 2byte | 代表含义 |
---|---|
1 | ARP请求 |
2 | ARP应答 |
3 | RARP请求 |
4 | RARP应答 |
RARP服务器为用户进程, 与系统无关.
Ch6 ICMP: Internet控制报文协议
ICMP由IP封装, 但隶属于网络层.
为避免广播风暴, 以下情况不会导致产生ICMP查询报文:
- ICMP差错报文
- 目的地址是广播/多播的IP数据报
- 源地址是广播/多播/环回/零地址的IP数据报
- 链路层广播的数据报
- 不是IP分片的第一片
ICMP分为查询和差错.
ICMP差错报文必须包括生成该差错的IP数据报的IP首部(20~60byte)再追加其后紧跟的8byte内容.
Ch7 Ping程序
原理: 发送ICMP echo request
, 等待ICMP echo reply
.
大多数TCPIP在内核中实现了ICMP服务器.
IP记录路由: 每个处理数据报的路由器将其IP写入IP首部的选项中.
IP首部长度20~60byte, 选项最大40byte. 除去3byte RR控制字段还剩37byte可用.
37/4=9...1
, 最多存放9个IP地址.
centos7中的ping不支持RR.
Ch8 Traceroute 程序
TTL: 跳站计数器, 每经过一个路由就减一. 对于TTL为0的IP数据报, 路由器应该将之丢弃, 并发回ICMP超时信息.
准备一个大于30000的PID的UDP;
将TTL设为1, 即探测第一跳路由, 返回ICMP超时.
将TTL设为2, 即探测第二跳路由, 返回ICMP超时.
...
将TTL设为n, 即探测最后一跳路由, 返回ICMP端口不可达.
不保证每个IP数据报走的路径都一样.
ping 与 traceroute 对比
ping 发送ICMP, 返回ICMP.
traceroute 发送UDP, 返回ICMP.
ping的回显应答包含分组的发送时间; ping回显应答中包含发起程序的PID;
traceroute返回的差错报文只包含UDP头, 无发送时间; 探针UDP的目的PID从33435开始每次递增一.
ping 每秒发送一个分组(快, 并行); traceroute 发送请求后等到应答再发下一个(慢, 串行).
Ch9 IP选路
IP搜索路由表优先级: 主机地址 > 网络地址 > 默认地址
Flags | 含义 |
---|---|
有U | 可用 |
有G | 间接路由 |
无G | 直接路由 |
有H | 主机地址 |
无H | 网络地址 |
有D | 由重定向报文创建 |
有M | 由重定向报文修改 |
重定向一般用来让具有很少选路信息的主机逐渐建立更完善的路由表. ICMP重定向差错报文, 由路由器为主机生成.
Ch10 动态选路协议
RIP 选路信息协议
OSPF 开放最短路径优先
BGP 边界网关协议
CIDR 无类型类间选路
Ch11 UDP 用户数据报协议
UDP: 面向数据报
TCP: 面向流字符
TCP端口号与UDP端口号是独立的(IP中已包含协议信息).
0 7 8 15 16 23 24 31
+--------+--------+--------+--------+
| Source | Destination |
| Port | Port |
+--------+--------+--------+--------+
| | |
| UDP Length | Checksum |
+--------+--------+--------+--------+
| |
| DATA ... |
+-----------------------------------+
UDP首部为定长8byte. DATA部分最小可以为0.
UDP校验和为可选项, 校验内容为整个UDP数据报.
UDP校验覆盖UDP头和数据, IP校验只覆盖IP头.
UDP数据报可以为奇数字节.
UDP 用户数据部分最大值:
理论上: 2^16-1 -20 -8 = 65507 byte
以太网: 1500 -20 -8 = 1472 byte
为避免IP层分片, 以太网MTU为1500byte.
因特网: 576 -20 -8 = 548 byte
Internet的标准MTU为576byte.
TCP为应用程序提供连续的字节流, 没有信息边界.
IP层分片, 根据MTU分片, 在下一跳重新组装. 一片丢失则整个数据报丢失, 网络层没有重传的设计. UDP首部信息只在第一片内.
当IP首部设置了不分片DF, 但数据报体积大于MTU时, 会产生ICMP不可达差错.
当数据报接受速度大于处理速度时, 可能产生ICMP源站抑制差错.
参考: https://www.cnblogs.com/linuxbug/p/4906000.html
Ch12 广播和多播
多播可以穿透路由器, 广播不能穿透路由器.
广播多播仅用于UDP. TCP面向连接.
ARP/RARP 为广播, 单个主机向其他所有主机发送帧.
255.255.255.255 受限的广播, 仅在本地网络使用, 路由器禁止转发.
多播, 后23位IP复制到MAC地址低位.
Ch13 IGMP
组播地址表的学习和维护全靠IGMP监听.
Ch14 DNS: 域名系统
DNS 是一种用于TCPIP应用程序的分布式数据库. 可提供域名与其对应IP的双向解析, 和邮件选路.
DNS解析器是应用程序的一部分, 不包含在内核中.
域名不区分大小写, 每个段最多63个字符, 用 .
分隔.
NIC网络信息中心, 负责分配顶级域名和委派区域授权.
区域管理者提供一台主服务器和至少一台辅服务器. 主服务器从磁盘读入域名信息, 辅服务器从主服务读入域名信息(区域传送).
资源记录RR(Resource Record)
PORT:53, TCP UDP都支持. 区域传送使用TCP(数据量大), 查询主要使用UDP.
Ch14 TFTP
略
Ch15 BOOTP
略
Ch16 TCP: 传输控制协议
TCP提供了一种 全双工的 可靠的 面向连接的 字节流 传输层 服务.
一个TCP连接仅有两方进行通信, 不适用与广播多播.
TCP可靠性:
- 合理分割报文段
- 定时器, 超时重传
- 确认回复
- 覆盖首部和数据的校验和
- 报文段排序
- 报文段去重
- 流量控制
TCP对字节流内容不做解释, 由应用层处理.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data(optional) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
TCP Header Format
客户端IP + 客户端PORT + 服务端IP + 服务端PORT, 四元组唯一确定TCP连接.
序号, Sequence Number, 对字节流的每个字节进行计数. 32bit无符号数.
在一个TCP连接中传送的字节流中的每一个字节都按顺序编号. 整个要传送的字节流的起始序号必须在连接建立时设置. TCP首部的序号字段指本报文段所发送的数据的 第一个字节的序号 . TCP首部的确认序号是 期望 收到的下一个报文段的第一个数据字节的序号.
若确认号为N, 则表明 N-1
为止的所有数据都已经正确收到.
TCP首部一般为20byte, 最大60byte.
标识比特位 | 用途 |
---|---|
URG | Urgent Pointer field significant 紧急指针 |
ACK | Acknowledgment field significant 确认序号有效 |
PSH | Push Function 要求接收方尽快将此报文段交给应用层 |
RST | Reset the connection 重建连接 |
SYN | Synchronize sequence numbers 新建连接时的同步序号 |
FIN | No more data from sender 发送端完成发送任务 |
Ch18 TCP连接的建立和终止
UDP直接发送数据, 无需预先握手; TCP需要三次握手, 再发送数据, 再四次挥手.
三次握手, 建立连接
请求方A 响应方B
-- SYN a -->
<-- SYN b, ACK a+1 --
-- SYN b+1 -->
四次挥手, 断开连接
请求方A 响应方B
-- FIN a -->
<-- ACK a+1 --
<-- FIN b --
-- ACK b+1 -->
ISN, 初始序号, 随时间而变化, 每4ms加一. 为防止延迟的分组被重传.
TCP 为全双工, 每个方向需要单独关闭, 也可以只关闭一个方向, 另一个方向仍然可以发送数据.
MSS, 最大报文长度, MTU - IP头 - TCP头
MSL, 最大生存时间, 任何报文段丢弃前在网络内的最长时间.
TIME_WAIT 状态, 即 2MSL 状态, 两倍的TCP报文最大生存时间.
从TCP主动关闭发起第一个FIN到最后一个ACK之后, 该连接必须在 TIME_WAIT 状态停留 2MSL 时间, 以保证可以重发最后一组的FIN和ACK.
IP数据报的TTL基于跳数, MSL 基于定时器.
平静时间, TCP在重启后的MSL内不能建立任何连接. 防止上一次迟到的TCP连接进入干扰.
目的端口无监听时, UDP产生端口不可达, TCP产生复位.
TCP同时打开, 四次握手, 一条连接.
应用层指明等待连接请求的连接队列的最大长度, 即积压值 backlog.
积压值说明的是TCP监听的端口已被TCP接受而等待应用层接受的最大连接数. 该值与系统最大连接数无关, 与服务器最大并发数无关.
TCP服务器无法使客户端主动打开失效. 当应用层被告知连接请求到来时, 三次握手已经完成.
Ch19 TCP 交互数据流
按照分组数量计算, TCP报文段包含成块数据和交互数据.
Nagle
在较慢的广域网中, 常使用 Nagle 算法来减少小报文段的数目. Nagle要求一个TCP连接上最多只能有一个未被确认的未完成小分组, 在该分组的ACK到达之前不能发送其他小分组.
if there is new data to send
if the window size >= MSS and available data is >= MSS
send complete MSS segment now
else
if there is unconfirmed data still in the pipe
enqueue data in the buffer until an acknowledge is received
else
send data immediately
end if
end if
end if
Ch20 TCP的成块数据流
UDP 的报文段大小由应用层指定;
TCP 的报文段大小由协议根据窗口值和网络拥塞情况而自动决定.
对于重复的分组:
接收方: 丢弃新的重复分组, 对老的分组发送ACK;
发送方: 丢弃新的重复ACK;
Ch21 TCP的超时重传
ARQ, 自动重传. 发送方发送分组即启动定时器, 在定时器到期之前收到ACK则销毁定时器继续后续发送; 若直到定时器到期都没收到ACK则重发旧的分组; 若收到重复的ACK直接丢弃. 接收方收到分组立即返回ACK; 若收到重复的分组, 丢弃新的分组, 重发旧的分组.
连续ARQ, 使用滑动窗口. 积累确认, 对按序列到达的最后一个分组发送ACK. go-back-N 对丢失的分组重传.
TCP规定, 即使接收窗口大小为0, 也必须接收: 零窗口探测报文段 / 确认报文段 / 紧急数据报文段 .
Ch22 TCP坚持定时器
Ch23 TCP保活定时器
中间路由可以崩溃, 只要两端主机没有重启, 则连接依然保持建立.