tcp-ip.md

封装

PDU 协议数据单元
物理层 数据位 (bit)

数据链路层 数据帧 (frame)

网络层 数据包 (packet)

传输层 数据段(segment)

应用层 数据 (data)

MTU 最大传输单元

  • 以太网 和 IEE802.3 对数据帧 都有限制,最大值 分别为 1500 字节,1492 字节。链路层的这个特性称为 MTU
  • 当 IP 数据报的长度大于 MTU 时,网络层就需要对 数据报 进行 分片
  • netstat -in 命令 查看 网络接口的 MTU

IP 数据报

IP 协议是提供的数据传输服务是不可靠、无连接的。

  • 不可靠,不保证数据报能成功到达目的地,发生错误时,丢弃,可靠性全由上层协议来提供。
  • 无连接,每个数据报的处理是相互独立的,可不按发送顺序接收。

普通 IP 数据报 报头长度 20 字节,

  • 版本号,4 位,0100 表示 IPV4, 0110 表示 IPV6
  • 首部长度,4 位,IP 报头长度,包括 选项字段
  • 服务类型(TOS),4 种,最小延时、最大吞吐量、最高可靠性、最小花费,4 个标识位 只能有一个被置为 1
  • 总长度,16 位, 报头+数据部分长度,最长可达 65535 字节
  • 标识/序列号,16 位,标识发送方发送的每一个数据报,如果发送的数据报未分片,则此值一次加 1
  • (分片)标志:3 位,第一位保留,未使用。第二位 DF(Don’t Fragment),为 1,未分片。第三位 MF(More Fragment),为 1,发生分片
  • 偏移:13 位,分片相对于原始 IP 数据报开始处的偏移
  • 生产周期(TTL),8 位,数据报可以经过的最多的路由器个数,如果数据报的 TTL 值被减至 0,丢弃
  • 上层协议,8 位,标识那个协议向 IP 传送数据 ICMP 为 1, TCP 为 6,UDP 为 17
  • 首部校验和:16 位,根据 IP 首部计算的校验和码
  • 源 IP,目的 IP,
  • 选项,数据报中可变长、可选的信息

IP 路由选择

route -n 可查看路由表 使用 traceroute 来追踪路由过程

1
2
3
4
5
6
7
8
traceroute www.shiyanlou.com

1 192.168.43.25 (192.168.43.25) 8.572 ms 4.136 ms 3.803 ms
2 * * *
3 192.168.196.42 (192.168.196.42) 81.462 ms 38.798 ms 66.947 ms
4 192.168.175.106 (192.168.175.106) 45.047 ms 76.935 ms 39.918 ms
5 192.168.175.97 (192.168.175.97) 80.681 ms 77.482 ms *
6 * * *

记录按序列号从 1 开始,每个记录就是一跳,每跳表示一个网关,每行个时间,是探测数据包向每个网关发送 3 个数据包后,网关响应时间

NAT 技术

192.168.X.X 或 172.16.X.X,这是 C 类和 B 类网的私有地址,就是俗称的内网 IP

ifconfig eth0, 查看内网 IP

1
2
3
4
5
6
7
8
9
ifconfig eth0

eth0 Link encap:以太网 硬件地址 02:42:ac:11:00:04
inet 地址:172.17.0.4 广播:172.17.255.255 掩码:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:40137 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:36312 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:0
接收字节:11485937 (11.4 MB) 发送字节:29181950 (29.1 MB)

ARP (Address Resolution Protocol) 地址解析协议

通过 IP 地址,查询对应的 MAC 地址
在电脑和路由器中都有一个 ARP 缓存表,保存着近期与自己有过通信的主机的 IP 地址与 MAC 地址对应关系。使用过程:

  • 当主机发送一个 IP 数据报时,会先查询一下自己的 ARP 缓存表
  • 找到对应的 MAC 地址,则将 IP 数据报封装为数据帧,将 MAC 地址放在帧首部
  • 如果查询 IP-MAC 值对 不存在,那么主机向网络中广播发送一个 ARP 请求数据帧,ARP 请求中包含待查询 IP 地址
  • 网络内所有收到 ARP 请求的主机查询自己的 IP 地址,符合则回复一个 ARP 应答数据帧,其中包含自己的 MAC 地址
  • 收到 ARP 应答后,主机将 IP-MAC 对应信息存入自己的 ARP 缓存,然后再据此封装 IP 数据报,再发送数据帧
ARP 代理

如果 ARP 请求是从一个网络上的主机发往另一个网络上的主机,那么连接这两个网络的路由器就可以回答该 ARP 请求,此过程称作 代理 ARP

ICMP 控制报文协议

通信过程中发生各种问题时,ICMP 将问题反馈
ping 程序和 traceroute 程序是两个常见的基于 ICMP 协议的工具

使用 tcpdump 命令查看 ping 命令包结构 sudo tcpdump -nnvXSs 0 -c2 icmp 开启监听

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
ping -c1 mirrors.cloud.aliyuncs.com
sudo tcpdump -nnvXSs 0 -c2 icmp
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
08:31:40.124621 IP (tos 0x0, ttl 64, id 32833, offset 0, flags [DF], proto ICMP (1), length 84)
192.168.42.3 > 100.100.2.148: ICMP echo request, id 3240, seq 1, length 64
0x0000: 4500 0054 8041 4000 4001 68c4 c0a8 2a03 E..T.A@.@.h...*.
0x0010: 6464 0294 0800 a743 0ca8 0001 6cf7 6162 dd.....C....l.ab
0x0020: 0000 0000 b5e6 0100 0000 0000 1011 1213 ................
0x0030: 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 .............!"#
0x0040: 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 $%&'()*+,-./0123
0x0050: 3435 3637 4567
08:31:40.126595 IP (tos 0x0, ttl 101, id 31415, offset 0, flags [DF], proto ICMP (1), length 84)
100.100.2.148 > 192.168.42.3: ICMP echo reply, id 3240, seq 1, length 64
0x0000: 4500 0054 7ab7 4000 6501 494e 6464 0294 E..Tz.@.e.INdd..
0x0010: c0a8 2a03 0000 af43 0ca8 0001 6cf7 6162 ..*....C....l.ab
0x0020: 0000 0000 b5e6 0100 0000 0000 1011 1213 ................
0x0030: 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 .............!"#
0x0040: 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 $%&'()*+,-./0123
0x0050: 3435 3637 4567
2 packets captured
2 packets received by filter
0 packets dropped by kernel

UDP

  • 无连接,发送数据之前不需要建立连接,减小开销和时延
  • 尽最大努力交付,不保证交付可靠性
  • 首部开销小,8 字节 UDP 报头,对应从应用层交付下来的 IP 数据报,简单封装
  • 没有拥塞控制,允许拥塞时丢失一些数据
  • 支持一对一,一对多,多对一

UDP 报文

UDP 报头+数据部分,UDP 报头总 8 字节,分 4 个字段:

  • 源端口,2 字节,在对方需要回信时可用,不需要时全 0
  • 目的端口,2 字节,必须
  • 长度,2 字节,长度值包括 报头 和数据部分
  • 校验和,2 字节,有错丢弃

TCP

  • 可靠的,面向连接的

  • 点对点,一条 TCP 连接只能连接 2 个端点

  • 可靠传输,无差错,不丢失、不重复、按顺序

  • 全双工 通信,允许双方任何时候都发送数据,连接两端都设有 发送缓存、接收缓存

  • 面向字节流,仅把数据看作一连串的字节序列

建立连接(3 次握手)

  • 客户端发出 请求连接报文段,报头控制位 SYN=1, 初始序列号 seq=x。客户端进入 SYN-SENT(同步已发送)状态
  • 服务端收到请求报文段后,回发确认报文段,报头 控制位 SYN=1,ACK=1,确认号 ack=x+1,自己的初始序列号 seq=y。服务端 进入 SYN-RCVD(同步收到)状态
  • 客户端 收到 服务端的确认报文段后,还要给服务器回发一个确认报文段, 报头控制位 ACK=1,确认号 ack=y+1,序列号 seq=x+1。

至此 TCP 连接建立,客户端进入 ESTABLISHED(已建立连接)状态,服务端 收到确认后,也进入 ESTABLISHED 状态

释放连接(4 次握手)

  • TCP 两端都还处于 ESTABLISHED 状态,客户端停止发送数据,发送一个 FIN 报文段。FIN=1,序号 seq=u。客户进入 FIN-WAIT-1(终止等待)状态
  • 服务端回复确认报文段,确认号 ack=u+1,序号 seq=v,服务端进入 CLOSE-WAIT(关闭等待)状态
  • 客户端收到确认报文段,进入 FIN-WAIT-2 状态,服务端发送完数据后,发出 FIN 报文,FIN=1,序号 seq=w,确认号 ack=u+1,然后进入 LAST-ACK(最后确认)状态
  • 客户端 回复确认报文段,ACK=1,确认号 ack=w+1,序号 seq=u+1,然后进入 TIME-WAIT(时间等待)状态

此时连接还未释放,需要时间等待状态结束 两端才会 CLOSED。

TCP 可靠传输的实现

  • TCP 报文段的长度可变,根据收发方的缓存状态、网络状态 进行调整

  • TCP 收到数据后,将回发一个确认报文,以告知发送者收到数据

  • 超时重发

    当 TCP 发出一个报文段后,它启动一个定时器,等待目的端 回发的确认,如果不能及时收到一个确认,将重发。

    • 发送者在发送一个报文段后,要暂时保存该报文段的副本,为发生超时重传时使用,收到确认报文后删除该报文段
  • TCP 将检验报头的校验和,如果发现报文段有差错,则丢弃该报文段,等待超时重传

  • TCP 将数据按字节排序,报文段通过序号确保顺序

  • TCP 提供流量控制,两端都有缓存区

TCP 可靠传输的实现

  • TCP 报文段的长度可变,根据收发方的缓存状态、网络状态 进行调整

  • TCP 收到数据后,将回发一个确认报文,以告知发送者收到数据

  • 超时重发

    • 当 TCP 发出一个报文段后,它启动一个定时器,等待目的端 回发的确认,如果不能及时收到一个确认,将重发。

    • 发送者在发送一个报文段后,要暂时保存该报文段的副本,为发生超时重传时使用,收到确认报文后删除该报文段

  • TCP 将检验报头的校验和,如果发现报文段有差错,则丢弃该报文段,等待超时重传

  • TCP 将数据按字节排序,报文段通过序号确保顺序

  • TCP 提供流量控制,两端都有缓存区

流量控制、拥塞控制

慢启动,加性增,乘性减

  • 慢启动,初始的窗口值很小,按指数规律增长,直到“阈值”
  • 加性增,窗口值达到“阈值”后,每发送一个报文段,窗口值就增加一个单位量
  • 乘性减,无论什么阶段,只要出现超时,则把窗口值 减少 一半