计算机网络相关协议

ipv4私有地址:
10.0.0.0 ~ 10.255.255.255
172.16.0.0 ~ 172.31.255.255
192.168.0.0 ~ 192.168.255.255
数据链路层
MAC地址 6个字节,共48位,前24位为厂家标识符,固化在适配器的ROM中
MAC帧
mac帧有两个标准,DIX Ethernet V2标准和IEEE802.3标准
以太网V2标准

五个字段组成,目的地址、源地址、类型字段、数据字段、帧检验序列FCS
| 字段 | 作用 | 示例 |
|---|---|---|
| 类型字段 | 标志上一层使用的什么协议 | 0x0800 表示上层使用的ip协议 0x0806 ARP协议 |
| 数据字段 | 长度在46-1500字节之间(64= 64(最小长度)-18) | |
| 帧检验序列FCS | 使用CRC检验 | |
mac帧长度 64 - 1518 字节
EthernetV2的MAC帧中,首部没有一个帧长度 。
这是因为曼彻斯特编码,曼彻斯特编码的每一个码元(不管是1还是0)的正中间一定有一次电压的变化(低到高或者高到低),当发送方把一个以太网帧发送完毕后,就不再发送其他码元,因此,发送方网络适配器的接口上的电压也就不再变化。接受方就可以很容易的找到以太网帧的结束位置。

曼彻斯特编码: 位周期中心的向上跳变代表 0,位周期中心的向下跳变代表1。但也可反过来定义。
差分曼彻斯特编码:在每一位的中心处始终都有跳变。位开始边界有跳变代表0,而位开始边界没有跳变代表1。
当数据字段不足46字节时,会有填充字段以保证帧长不小于64,如何区分填充字段呢?
上层协议必须有识别有效的数据字段长度的功能!当上层使用IP协议时,其首部有一个“总长度”字段,总长度字段加上填充字段的长度等于MAC帧数据字段长度。
例如IP数据包总长度为42字节,mac帧填充字段就需要有4字节,当mac帧把46字节的数据上传到IP层时,IP层就把其中最后4字节的填充字段丢弃。
在图中发现,在传输媒体中。实际传送的要比MAC帧还多8字节。
这是因为当一个站刚开始接受MAC帧时,需要适配器的时钟与到达的比特流达成同步。该8字节由硬件生成,前面7字节是同步码(10交替出现1010..1010),第八个字节是帧开始定界符(10101011)前六位和同步码一致,后两位通知适配器mac帧信息来了
在以太网中传送数据时是以帧为单位,各个帧之间必须由一定的间隙,保证接受端知晓帧的长度。接受端只要找到帧开始定界符,其后面的连续到达的比特流都属于同一个MAC帧,由此可见MAC不需要帧结束定界符。
IEEE802.3标准规定出现下列i情况之一的即为无效MAC帧
- 帧长度不是整数字节
- 帧检验序列FCS出错
- 收到的帧数据字段长度不在46-1500,即帧长度不在64-1518字节之间
对于无效帧直接丢弃。
IEEE802.3
与Ethernet V2 帧格式的区别
- 第三个字段是 长度/类型,当这个字段
>0x0600时,就表示类型。此时和以太网V2帧格式一样。当这个字段<0x0600时就表示长度。即MAC帧的数据部分长度。若长度字段和数据字段的长度不一致,无效帧,丢弃。但因为是曼彻斯特编码,长度字段并无实际意义。 - 当 长度/类型 字段
<0x0600时候,数据字段必须装入上面的逻辑链路控制LLC的子层LLC帧。
由于现在广泛使用的局域网只有以太网,因此LLC帧已失去意义。市场上流行的都是以太网V2的MAC帧
以太网交换机的自学习功能
扩展以太网常用的方法是在数据链路层进行,最初使用的是网桥。网桥对收到的MAC帧根据目的地址进行转发和过滤,
当 网 桥 收 到 一 个 帧 时 , 并 不 是 向 所 有 的 接 口 转 发 此 帧 , 而 是 根 据 此 帧 的 目 的 MAC 地 址, 查 找 网 桥 中 的 地 址 表 , 然 后 确 定 将 该 帧 转 发 到 哪 一 个 接 口 , 或 者 是 把 它 丢 弃 ( 即 过 滤 )。
1990问世的交换式集线器(switch hub),淘汰了网桥。交换式集线器常被称为以太网交换机(switch),或第二层交换机(L2 switch)强调这种交换机工作在数据链路层。
以太网交换机实质上是一个多接口的网桥。其内部有帧交换表(又称为地址表)是通过自学习算法自动地逐渐建立起来的

A向B发送一帧,从接口1进入到交换机。交换机查找交换表(根据目的MAC地址) 并记录A的MAC和接口
有:直接根据接口转发出去
无:将源MAC和接口写入交换表,然后向其他接口广播。
当目的MAC一致时,才收下这个帧,并记录MAC地址和接口,其他接口过滤操作。
交换表中每个项目都设有一定的有效时间,考虑到有时候在交换机接口会更换主机。
以 太 网 交 换 机 的 这 种 自 学 习 方 法 使 得 以 太 网 交 换 机 能 够 即 插 即 用 , 不 必 人 工 进 行 配

网络层
物理地址(MAC)是数据链路层和物理层使用的地址,
IP地址是网络层和以上各层使用的地址,是一种逻辑地址(称P地址为逻辑地址是因为 IP 地址是用软件实现的)。


A类地址:0 - 127
B类地址:128.0 - 191.0
C类地址:192.0 - 223.0
D类地址:224.0 - 239.0
E类地址:240.0 -
私有地址:
10.0.0.0~10.255.255.255
172.16.0.0~172.31.255.255
192.168.0.0~192.168.255.255
ARP--地址解析协议
参考: 谢希仁 第七版
wireshark 数据包分析实战(第三版)
已 经 知 道 了 一 个 机 器 ( 主 机 或 路 由 器 的 IP 地 址 , 需 要 找 出 其 相 应 的 硬 件 地 址 。 地 址 解 析 协 议 ARP 就 是 用 来 解 决 这 样 的 问 题 的 。
IP 协 议 使 用 了 ARP 协 议
ARP是解决同一个局域网上的主机和路由器IP地址和硬件地址的映射问题

每台主机都设有一个ARP高速缓存(ARP cache),里面有本局域网上的各主机和路由器的IP到硬件地址的映射。
当A向本局域网上的B发送IP数据包时候,
查ARP cache 有无B的IP
- 有:将IP对应的MAC地址写入MAC帧,然后通过局域网把该MAC帧发出去
- 无:自动运行ARP协议
- A上面的ARP进程在本局域网 广播
ARP请求分组(包含自己的IP和MAC地址) - 局域网上的所有ARP进程收到该
ARP请求分组并将A的信息写入到自己ARP cache中。 - B的IP地址与要查询的IP一致,收下该
ARP请求分组,并向A发送ARP响应分组(写下自己的MAC地址) - A收到B的
响应分组,将信息写入A的ARP cache中。
- A上面的ARP进程在本局域网 广播
跨局域网时
A向b发送IP数据包,局域网内使用ARP协议,跨局域网的工作由路由器进行工作
- A -> 路由器R1:此时需要把R1的IP地址解析为硬件地址HA3
A广播ARP请求分组(在局域网1上广播),找到一个路由器R1的硬件地址。 - R1把IP数据包转发到与R1连接在同一个网络(局域网2)上的主机,这时由R1广播
ARP请求分组找到局域网2的主机B - 若主机B不在局域网2上,R1在局域网2上广播
ARP请求分组,找到连接在局域网2上的一个路由器R2。由R2继续 2和3的步骤
为什么使用抽象的IP而不是直接使用硬件MAC地址?
由 于 全 世 界 存 在 着 各 式 各 样 的 网 络 , 它 们 使 用 不 同 的 硬 件 地 址 。 要 使 这 些 异 构 网 络 能 够 互 相 通 信 就 必 须 进 行 非 常 复 杂 的 硬 件 地 址 转 换 工 作 , 因 此 由 用 户 或 用 户 主 机 来 完 成 这 项 工 作 几 乎 是 不 可 能 的 事 。 但 IP 编 址 把 这 个 复 杂 问 题 解 决 了 。 连 接 到 互 联 网 的 主 机 只 需 各 自 拥 有 一 个 唯 一 的 IP 地 址 , 它 们 之 间 的 通 信 就 像 连 接 在 同 一 个 网 络 上 那 样 简 单 方 便 , 因 为 上 述 的 调 用 ARP 的 复 杂 过 程 都 是 由 计 算 机 软 件 自 动 进 行 的 , 对 用 户 来 说 是 看 不 见 这 种 调 用 过 程 的 。
ARP数据包结构
2+2+
1+1+2
6+4+6+4
= 28字节

硬件类型:
协议类型: ARP请求正在使用的高层协议。
硬件地址长度: 正在使用的硬件地址的长度(1个字节)。
协议地址长度: 对于指定协议类型所使用的逻辑地址(ip地址)的长度(1个字节)。
操作: ARP数据包的功能,1表示请求,2表示响应。
发送方硬件地址: 发送者的硬件地址。
发送方协议地址: 发送者的IP协议地址。
目标硬件地址: 目的接收方的硬件地址(ARP 请求中为0)。
目标协议地址: 目的接受方的高层协议地址。
ARP请求

ARP响应

ICMP--网际控制报文协议
为了更有效的转发IP数据包和提高交互成功的机会,在网络层使用ICMP协议
ICMP的一个重要应用就是分组网间探测PING(Packet InterNet Groper) PING是应用层直接使用网络层ICMP的一个例子,未经过TCP或UDP传输层协议。
ICMP允许主机和路由器报告差错情况和提供有关异常情况的报告
ICMP报文分为:ICMP差错报告报文和ICMP询问报文
ICMP报文是装在IP数据包中的,作为其中的数据部分。

图中ICMP 差 错 报 告 报 文 共 有 四 种
| 类型 | 含义 | 详细 |
|---|---|---|
| 3 | 终点不可达 | “ 当 路 由 器 或 主 机 不 能 交 付 数 据 报 时 就 向 源 点 发 送 终 点 不 可 达 报 文 |
| 11 | 时间超过 | 当 路 由 器 收 到 生 存 时 间 为 零 的 数 据 报 时 , 除 丢 弃 该 数 据 报 外 , 还 要 向 源 点 发 送 时 间 超 过 报 文 。 当 终 点 在 预 先 规 定 的 时 间 内 不 能 收 到 一 个 数 据 报 的 全 部 数 据 报 片 时 , 就 把 已 收 到 的 数 据 报 片 都 丢 弃 , 并 向 源 点 发 送 时 间 超 过 报 文 。 |
| 12 | 参 数 问 题 | 当 路 由 器 或 目 的 主 机 收 到 的 数 据 报 的 首 部 中 有 的 字 段 的 值 不 正 确 时 , 就 丢 弃 该 数 据 报 , 并 向 源 点 发 送 参 数 问 题 报 文 |
| 5 | 改 变 路 由 ( 重 定 向 ) | 路 由 器 把 改 变 路 由 报 文 发 送 给 主 机 , 让 主 机 知 道 下 次 应 将 数 据 报 发 送 给 另 外 的 路 由 器 ( 可 通 过 更 好 的 路 由 )。 |
改 变 路 由 报 文 进 行 简 短 的 解 释:
在 互 联 网 中 主 机 的 数 量 远 大 于 路 由 器 的 数 量 , 出 于 效 率 的 考 虑 , 这 些 主 机 不 和 连 接 在 网 络 上 的 路 由 器 定 期 交 换 路 由 信 息 。
在 主 机 刚 开 始 工 作 时 , 一 般 都 在 路 由 表 中 设 置 一 个 默 认 路 由 器 的 IP 地 址 。 不 管 数 据 报 要 发 送 到 哪 个 目 的 地 址 , 都 一 律 先 把 数 据 报 传 送 给 这 个 默 认 路 由 器 , 而 这 个 默 认 路 由 器 知 道 到 每 一 个 目 的 网 络 的 最 佳 路 由 ( 通 过 和 其 他 路 由 器 交 换 路 由 信 息 ) 如 果 默 认 路 由 器 发 现 主 机 发 往 某 个 目 的 地 址 的 数 据 报 的 最 佳 路 由 应 当 经 过 网 络 上 的 另 一 个 路 由 器 R 时 , 就 用 改 变 路 由 报 文 把 这 情 况 告 诉 主 机 。 于 是 , 该 主 机 就 在 其 路 由 表 中 增 加 一 个 项 目 : 到 某 某 目 的 地 址 应 经 过 路 由 器 R ( 而 不 是 默 认 路 由 器 )。
所有的ICMP差错报告报文中的数据字段都具有同样的格式。
将收到的需要进行差错报告的IP数据包的首部和数据字段前八个字节(为了得到传输层的端口号(TCP和UDP)以及传输层报文的发送序号(对于TCP))提取出来,作为ICMP报文的数据字段,再加上相应的ICMP差错报告报文的前八个字节,就构成了ICMP差错报告报文。

将装入了ICMP数据报文的IP数据包发送给源点(初始收到的IP数据报是由源点发送过来的)
以下情况,不发生ICMP差错报告报文:
- 对 ICMP 差 错 报 告 报 文 , 不 再 发 送 ICMP 差 错 报 告 报 文 。
- 对 第 一 个 分 片 的 数 据 报 片 的 所 有 后 续 数 据 报 片 , 都 不 发 送 ICMP 差 错 报 告 报 文 。
- 对 具 有 多 播 地 址 的 数 据 报 , 都 不 发 送 ICMP 差 错 报 告 报 文 。
- 对 具 有 特 殊 地 址 ( 如 127.0.0.0 或 0.0.0.0) 的 数据 报 , 不 发 送 ICMP 差 错 报 告 报 文 。
常用的 ICMP 询 问 报 文 有 两 种
| 类型 | 含义 | 详细 |
|---|---|---|
| 8或者0 | 回送(echo)请求和回答 | ICMP 回 送 请 求 报 文 是 由 主 机 或 路 由 器 向 一 个 特 定 的 目 的 主 机 发 出 的 询 问 。 收 到 此 报 文 的 主 机 必 须 给 源 主 机 或 路 由 器 发 送 ICMP 回 送 回 答 报 文 。 (PING命令) 用 来 测 试 目 的 站 是 否 可 达 以 及 了 解 其 有 关 状 态 。 |
| 13或14 | 时间戳请求和回答 | 询问时间戳, 时 间 戳 请 求 与 回 答 可 用 于 时 钟 同 步 和 时 间 测 量 |
IP数据报格式
IPv4

| 字段 | 说明 |
|---|---|
| 标识符(Identifcation) | 一个唯一的标识数字,用来识别一个数据包或者被分片数据包的次序。 |
| 标志(Flags) | 用来标志一个数据包是否是一组分片数据包的一部分。 001 后面存在分片 000 数据分片的最后/或者未被分片 010 不能被分片 |
| 片偏移(Fragment of set) | 一个数据包是一个分片,这个域中的值就会被用来将数据包以正确的顺序重新组装。 |
| 存活时间(Time To Live) | 用来定义数据包的生存周期,以经过路由器的跳数/秒数进行描述。 |
| 协议(Protocol) | 用来识别在数据包序列中上层协议数据包的类型。 |
| 首部校验和(Header Checksum) | 一个错误检测机制,用来确认IP头的内容没有被损坏或者篡改。 |
| 源IP地址(SourceIPAddress) | 发出数据包主机的地址。 |
| 目的IP地址(DestinationIPAddress) | 数据包目的地的IP 地址。 |
| 选项(Options) | 保留作额外的IP选项。它包含着源站选路和时间的一些选项。 |
| 数据(Data) | 使用IP传递的实际数据 |
总长度:虽 然 使 用 尽 可 能 长 的 IP 数 据 报 会 使 传 输 效 率 得 到 提 高 ( 因 为 每 一 个 IP 数 据 报 中 更快更高更强更团结首 部 长 度 占 数 据 报 总 长 度 的 比 例 就 会 小 些 ), 但 数 据 报 短 些 也 有 好 处 。 每 一 个 IP 数 据 报 越 短, 路 由 器 转 发 的 速 度 就 越 快 。为 此, IP 协 议 规 定 , 在 互 联 网 中 所 有 的 主 机 和 路 由 器 , 必 须 能 够 接 受 长 度 不 超 过 576 字 节 的 数 据 报 。 这 是 假 定 上 层 交 下 来 的 数 据 长 度 有 512 字 节 ( 合 理 的 长 度 ), 加 上 最 长 的 IP 首 部 60 字 节 , 再 加 上 4 字 节 的 富 余 量 , 就 得 到 576 字 节 。 当 主 机 需 要 发 送 长 度 超 过 576 字 节 的 数 据 报 时 , 应 当 先 了 解 一 下 , 目 的 主 机 能 否 接 受 所 要 发 送 的 数 据 报 长 度 。 否 则 , 就 要 进 行 分 片 。
首部检验和:不采用复杂的CRC检验,而采用反码算术运算。把首部划分为16位的字,然后相加,将和的反码写入检验和字段。接收方再次使用反码算术运算相加,得到的和取反,全0为正常。出错丢弃
eg: 和:0x4500 + 0x0034 + 0x0000(检验和初始值) + 0x4000 + 0x4011 = 0xC545 (1100 0101 0100 0101) 反码:0x3aba(0011 1010 1011 1010)
接受方: 0x4500 + 0x0034 + 0x3ABA(反码写入) + 0x4000 + 0x4011 = 0xc545 + 0x3ABA = 0xffff 反码:0x0000
IPv6
ipv6的地址有128位,大多数情况下用16进制数表示.8组两个字节的16进制数表示
地址分为网络部分(64 bit)和主机部分(64 bit),分布称为:网络前缀(network prefix)和接口标识符( interface identifier)
IPv6通信有3种类别
-
单播(unicast):一对一通信
$\underbrace{fe80}{前缀}: \overbrace {0000:0000:0000} ^{补码}:\underbrace{ 7a31:c1ff:fecd:b256} $在同一网络下,与另一个设备通信需要用到本地连接地址。
一个本地连接地址的前10个最高有效位被设置为1111 1110 10( 0xfe8 ), 紧接着的54位被设置成0。
所以,当地址的前半部分是fe80:0000:0000:0000时,这就是一个本地连接地址。
中间的0可以省略,故也可表示为:fe80::7a31:c1ff:fecd:b256
其中本地链接地址后面的%接的数字,主要作用是指明所要使用的网卡 ,使用
netstat -nr和ipconfig /all命令,分别查看网卡和ip地址信息
本地连接IPv6地址的另一半是接口ID部分,它表明了在网络上唯一的一个主机端点。在以太网中,这是基于MAC地址而来的。然而,MAC地址只有48位6个字节,要把128-10-54=64位8个字节填满
①手工配置:建议在服务器和重要网络设备上配置。
②系统通过软件自动生成:保护主机的私密性。③使用 IEEE EUI-64规范生成 (由MAC地址产生 IPv6 地址接口ID的方法可以减少配置的工作)
缺点是某些恶意者可以通过二层MAC推算出三层IPv6地址。-
先将MAC地址切成两半,
$ \underbrace{78:31:c1}{前半段} : \underbrace {cd:b2:56}$
-
然后将0xfffe在两边当作补码附录上。
-
组成一个唯一的标识符
$ \underbrace{7831:c1}{MAC地址前半段} \overbrace{ff:fe}^{补码} \underbrace {cd:b256}$
-
反转第一个字节的第7位bit,
$0x78(0111 1000) \rightarrow 0111 1010(0x7a)$最终IPv6地址为:
fe80::7a31:c1ff:fecd:b256
当单播流量在公网传播时,IPv6的地址会发送变化
-
全局单播通过将前3位设置为001,加上45位全局路由前缀来标识
-
全局路由前缀由IAIA(互联网数字分配机构)分配,唯一的标识一个组织的地址空间
-
接下来的16位是子网ID,用以划分地址,类似IPv4地址的子网掩码
-
最后64位被用来当作接口ID,类似本地连接地址,路由前缀和子网ID可以依据大小而变化
$ \overbrace {\underbrace{2001:4860:4860}{路由器前缀} : \underbrace{0000}{子网ID}}^{网络前缀} : \underbrace {7a31:c1ff:fecd:b256}_{接口标识符}$
-
-
任播(multicast):一对多通信
-
多播(anycast):一对多的通信,但数据报只交付给其中的一个(通常是距离最近的一个)

IPv6不支持广播流量,广播 被认为是低效的传输机制。但因此ARP协议无法使用。
IPv6是通过 邻居请求(neighbor solicitation) 互相发现的,利用 ICMPv6 完成工作,是邻居发现协议NDP的一项功能。
IPv6包结构
IPv6 首部改为8字节对齐(即首部长度必须是8字节的整数倍)、原来的IPv4首部是4字节对齐。
IPv6 数据报由两大部分组成,即基本首部(base header)和后面的有效载荷(payload)。
有效载荷也称为净负荷, 有效载荷允许有零个或多个扩展首部。
所有的扩展首部并不属于IPv6数据报的首部。


下一个首部字段:相当于IPv4的协议字段和可选字段
- 当IPv6 数据报没有扩展首部时,下一个首部字段的作用和 IPv4的协议字段一样, 指出了基本首部后面的数据应交付IP层上面的哪个高层协议(例如:6:表示应交付运输层TCP,17: UDP)。
- 当出现扩展首部时,下一个首部字段的值就标识后面第一个扩展首部的类型。
取消了IPv4首部不必要的字段,降低了路由器处理数据包的速度(首部检验和字段)
将IPv4首部中选项功能放在扩展首部,并把扩展首部留给路径两端的主机来处理。路径中的路由器不需要处理这些扩展首部(有个例外,逐跳选择扩展首部)。
大大提高了路由器的处理效率。
RFC 2460 定义了6种扩展首部
- 逐跳选择
- 路由选择
- 分片
- 鉴别
- 封装安全有效载荷
- 目的站选项
IPv6分片
IPv4内置分片支持,因为协议确认报文能穿过所有MTU值不同的网络。
但在IPv6中很少用到分片,在传输IPv6报文前,设备会执行MTU探索。决定报文的最大容量,
一旦路由器收到了比下一层网络MTU还大的报文,路由器会丢弃该报文。并返回“报文太大”的ICMPv6消息给源主机。如果上一层协议支持,则源主机收到消息后,会尝试对报文进行分片,然后重发。这个过程会重复,直到达到足够小的MTU或者载荷不能再被分片。
路由器永远不会对报文进行分片。源设备负责选择一个在传输路径中合适的MTU值,并对报文分片。
分片需要在报文上添加一个分片拓展包头。
ipv6_fragments.pcapng

IPv4 VS IPv6
http_ip4andip6.pcapng

| 描述 | IPv4 | IPv6 |
|---|---|---|
| 地址 | 长度为 32 位(4 个字节)。地址由网络和主机部分组成,。IPv4 地址的总数为 $2^{32}$ 。IPv4 地址的文本格式为 x.x.x.x,其中 0<=x<=255。可省略前导零。最大打印字符数为 15 个,不计掩码。 | 长度为 128 位(16 个字节)。基本体系结构的网络数字为 64 位,主机数字为 64 位。通常,IPv6 地址(或其部分)的主机部分将派生自 MAC 地址或其他接口标识。根据子网前缀,IPv6 的体系结构比 IPv4 的体系结构更复杂。IPv6 地址的数目比 IPv4 地址的数目大 1028(79 228 162 514 264 337 593 543 950 336)倍。IPv6 地址的文本格式为 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx,其中每个 x 都是十六进制数,表示 4 位。可省略前导零。可在地址的文本格式中使用一次双冒号(::),用于指定任意数目的 0 位。例如,::ffff:10.120.78.40 表示 IPv4 映射的 IPv6 地址。 |
| IP 报头 | 根据提供的 IP 选项,有 20-60 个字节的可变长度。 | 40 个字节的固定长度。没有 IP 报头选项。通常,IPv6 报头比 IPv4 报头简单。 |
ICMPv6
使用和ICMP相同的报文结构,被归类为,错误信息和报告信息
ICMPv6使用多播,将信息同时传递给一组目的地址,只有订阅了数据流的主机才会收到和处理数据。
多播地址很好辨认 0xff00::/8

icmpv6_neighbor_solicitation.pcapng


传输层
TCP -- transmission Control Protocol
在RFC793定义,面向连接的协议,全双工。 可靠交付,面向字节流

ack和seq的计算
- sequence number:表示的是发送方这边,这个packet的数据部分的第一位应该在整个data stream中所在的位置。
- acknowledge number:应当是上次已成功收到数据字节序号加1,表示的是期望的对方(接收方)的下一次sequence number是多少。
TCP最初只规定了一种选择字段,即MSS最大报文段长度(Maximum Segment Size)。
MSS是每一个TCP报文段中的数据字段的最大长度。
数据字段加上TCP首部才等于整个的TCP报文段。所以MSS并不是整个TCP报文段的最大长度。为 什 么 要 规 定 一 个 最 大 报 文 段 长 度 MSS ?
并 不 是 考 虑 接 收 方 的 接 收 缓 存 可 能 放 不 下 TCP 报 文 段 中 的 数 据。
TCP报文段的数据部分,至少加上40字节(20B TCP头部+20B IP头部)才能组成一个IP数据报。若 选 择 较 小 的 MSS 长 度 , 网 络 的 利 用 率 就 降 低 。
设 想 在 极 端 的 情 况 下 , 当 TCP 报 文 段 只 含 有 1 字 节 的 数 据 时 , 在 IP 层 传 输 的 数 据 报 的 开 销 至 少 有 40 字 节 ( 包 括 TCP 报 文 段 的 首 部 和 IP 数 据 报 的 首 部 。 这 样 , 对 网 络 的 利 用 率 就 不 会 超 过 1/41。 到 了 数 据 链 路 层 证 要 加 上 一 些 开 销 。反 过 来 , 若 TCP 报 文 段 非 常 长 , 那 么 在 IP 层 传 输 时 就 有 可 能 要 分 解 成 多 个 短 数 据 报 片 。 在 终 点 要 把 收 到 的 各 个 短 数 据 报 片 装 配 成 原 来 的 TCP 报 文 段 。 当 传 输 出 错 时 还 要 进 行 重 传 。 这 些 也 都 会 使 开 销 增 大
因此,MSS尽可能的大些。只要IP层传输时不需要再分片就行。 但IP数据报经历的路径是动态变化的。最佳的MSS是很难确定的。
在连接建立过程中,双方把自己能支持的MSS写入这一字段。若未填写,则MSS默认 536B,因此在互联网上的主机都应能接受的TCP报文段长度是 536+20 = 556B
随着互联网的发展,又陆续增加了几个选项。如窗口扩大选项、时间戳选项等(见建议标准RFC 7323)。以后又增加了有关选择确认(SACK)选项(见建议标准RFC 2018)。这些选项的位置都在图所示的选项字段。
-
窗口扩大选项 占3字节 是 为 了 扩 大 窗 口
-
时间戳选项占10字节,其中最主要的字段是时间戳值字段(4字节) 和时间戳回送回答字段(4字节)。
时间戳选项有以下两个功能:
- 用来计算往返时间RTT(见后面的5.6.2节)。发送方把当前时钟的时间值放入时间戳字段,接收方在确认该报文段时把时间戳字段值复制到时间戳回送回答字段。因此,发送方在收到确认报文后,可以准确地计算出RTT来。
- 用于处理TCP序号超过 $2^{32}$ 的情况,这又称为防止序号绕回PAWS(Protect Against Wrapped Sequence numbers)。当使用高速网络时,在一次TCP连接的数据传送中,序号可能会被重复使用。
-
选择确认选择
TCP端口
为了将数据传输到远程服务器或者设备的特定应用中,TCP数据包必须知道远程服务所监听的端口。

在使用TCP通信时,有65535个端口可以使用,其中
- 1~1023 是标准端口组,特定服务会用到这些
- 1024~65535 是临时端口组
三次握手

为什么要三次确定?
这 主 要 是 为 了 防 止 已 失 效 的 连 接 请 求 报 文 段 突 然 又 传 送 到 了 B, 因 而 产 生 错 误 。
A第一次请求连接报文段滞留,延误到B的时间, B 误认 A 再次申请建立连接,但实际A并没,若不采用第三次确定,此时B发送确定后,连接就建立起来了,B之后就等待A发送数据。但实际上A并没建立新的连接,B的资源就会被浪费。
四次挥手

为 什 么 A 在 TIME-WAIT 状 态 必 须 等 待 2 MSL (Maximum Segment Lifetime,最长报文段寿命)的 时 间 ?
这 有 两 个 理 由 。 第 一 , 为 了 保 证 A 发 送 的 最 后 一 个 ACK 报 文 段 能 够 到 达 B。 这 个 ACK 报 文 段 有 可 能 丢 失 , 因 而 使 处 在 LAST-ACK 状 态 的 B 收 不 到 对 已 发 送 的 FIN + ACK 报 文 段 的 确 认 。B 会 超 时 重 传 这 个 FIN + ACK 报 文 段 , 而 A 就 能 在 2MSL 时 间 内 收 到 这 个 重 传 的 FIN + ACK 报 文 段 。 接 着 A 重 传 一 次 确 认 , 重 新 启 动 2MSL 计 时 器 。 最 后 ,A 和 B 都 正 常 进 入 到 CLOSED 状 态 。 如 果 A 在 TIME-WAIT 状 态 不 等 待 一 段 时 间 , 而 是 在 发 送 完 ACK 报 立 即 释 放 连 接 , 那 么 就 无 法 收 到 B 重 传 的 FIN + ACK 文 段 后 报 文 段 , 因 而 也 不 会 再 发 送 一 次 确 认 报 文 段 。 这 样 ,B 就 无 法 按 照 正 常 步 骤 进 入 CLOSED 状 态 。 第 二 , 防 止 上 一 节 提 到 的 “ 已 失 效 的 连 接 请 求 报 文 段 “ 出 现 在 本 连 接 中 。A 在 发 送 完 最 后 一 个 ACK 报 文 段 后 , 再 经 过 时 间 2MSL, 就 可 以 使 本 连 接 持 续 的 时 间 内 所 产 生 的 所 有 报 文 段 都 从 网 络 中 消 失 。 这 样 就 可 以 使 下 一 个 新 的 连 接 中 不 会 出 现 这 种 旧 的 连 接 请 求 报 文 段 。 B 只 要 收 到 了 A 发 出 的 确 认 , 就 进 入 CLOSED 状 态 。 同 样 ,B 在 撤 销 相 应 的 传 输 控 制 块 TCB 后 , 就 结 束 了 这 次 的 TCP 连 接 。 我 们 注 意 到 ,B 结 束 TCP 连 接 的 时 间 要 比 A 早
TCP的可靠传输的实现
TCP的流量控制
流量控制(flow control)就是让发送方的发送速率不要太快,要让接收方来得及接收。
滑动窗口实现流量控制
TCP的拥塞控制
在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫做拥塞(congestion)。
$$
\sum 对资源的需求 > 可用资源
$$
TCP进行拥塞控制的算法有四种,即慢开始(slow-star)、拥塞避免(congestion avoidance)、快重传(fast retransmit )和快恢复(fast recovery)
UDP -- User Datagram Protocol
UDP用户数据报协议,主要是为了提供高速的传输。
UDP是一种 无连接 尽力服务 面向报文 无拥塞控制.首部只有8字节
一个无连接协议并不会正式的建立和结束主机之间的连接。不提供可靠性服务。(但依赖UDP的协议通常会有其自己内置的可靠性服务。或者使用ICMP的一些功能。

应用层

DHCP - UDP
动态主机配置协议(Dynamic Host Configuration Protocol)
通过广播交互,基于UDP,提供即插即用联网的机制,支持地址续租

DHCP客户端使用的源端口号为68,DHCP服务器使用的源端口号为67。
DHCP的选项字段,最多为1200字节。DHCP通过此字段包含了DHCP报文类型,服务器分配给终端的配置信息,如网关IP地址,DNS服务器的IP地址,客户端可以使用IP地址的有效租期等信息
DHCP续租过程 DORA(Discover、Offer、Request、Acknowledgement)
- 主机 广播 DHCP发现报文
- DHCP服务器 广播 DHCP提供报文
- 主机 广播 DHCP请求报文
- DHCP服务器 广播 DHCP确认报文
DHCPv6
针对ipv6提出的协议。
DHCPv6使用的标准端口:546和547端口
DHCPv6不是基于BOOTP协议(DHCP协议的前身)设计的,因此DHCPv6的数据包结构要比DHCP协议精简很多。

- msg-type:长度8bit,表示报文的类型,总共定义了13种消息类型。
- transaction-id:长度24bit,表示 DHCPv6 客户端随机生成的交互ID(服务端发起的报文交互ID为0),用来标识一次来回交互的 DHCPv6 报文。例如Solicit/Advertise报文为一次交互,Request/Reply报文为另外一次交互,两者有不同的交互ID。
- options:根据消息类型不一样长度可变,表示 DHCPv6 的可选字段。此字段包含了 DHCPv6 服务器分配给 IPv6 主机的配置信息,如客户端标识、服务器标识或有效生命周期等信息。
DHCPv6实现了DHCP相同的功能,DORA -> SARR(Solicit、Advertise、Request、Reply )
- 发起(Solicit):客户端向一个特定的组播地址(
ff02::1:2)发送一个初始化数据包,尝试在网络上发现可用的DHCPv6服务器 - 公告(Advertise):一个可用的DHCPv6服务器直接回复客户端,表明此服务器能够提供地址分配和设置服务。
- 请求(Request):客户端通过组播方式向服务器发起地址配置信息请求。
- 回复(Reply):服务器向客户端直接发送其请求的所有配置信息,SARR过程完成。
DNS - UDP
域名系统(Domain Name System)。提供一种进行主机名到IP地址转换的目录服务
域名

| 国家顶级域名 | 通用顶级域名 | 基础结构域名 | |||
|---|---|---|---|---|---|
| cn | 中国 | com | 公司企业 | arpa | 用于反向域名解析 |
| us | 美国 | net | 网络服务机构 | ||
| uk | 英国 | org | 非营利性组织 | ||
| int | 国际组织 | ||||
| edu | 美国专用的教育机构 | ||||
| gov | 美国的政府部门 | ||||
| mil | 美国的军事部门 | ||||
| asia | 亚太地区 | ||||
| info | 各种情况 | ||||
在国家顶级域名下注册的二级域名均由该国家自行确定。例如日本, 将其教育和企业机构的二级域名定为ac和co, 而不用edu和com。
我国把二级域名划分为“类别域名”和“行政区域名”两大类。
-
“类别域名”共7个
二级域名 二级域名 ac 科研机构 com 工、商、金融等企业 gov 中国的政府机构 org 非营利性的组织 -
“行政区域名”共34个,适用于我国的各省、自治区、直辖市。例如:bj(北京市),js(江苏省)
世界上的计算机在互联网中的域名都必须是唯一的
域名服务器
DNS服务器存储了一个有着IP地址和DNS名字映射资源记录的数据库,并将其和客户端以及其他DNS服务器共享。
域名服务器划分为以下四种不同的类型:
-
根域名服务器
-
根域名服务器是最高层次的域名服务器,所有的根域名服务器都知道所有的顶级域名服务器的IP地址
-
需要注意的是,根域名服务器用来
管辖顶级域(如.com), 通常它并不直接把待查询的域名直接转换成IP地址,而是告诉本地域名服务器下一步应当找哪个顶级域名服务器进行查询。
-
-
顶级域名服务器
- 管理在该顶级域名服务器注册的所有二级域名。
- 收到DNS查询请求时,就给出相应的回答(可能是最后的结果,也可能是下一步应当查找的域名服务器的IP地址)。
-
权限域名服务器
- 每台主机都必须在权限域名服务器处登记。为了更加可靠地工作,一台主机最好至少有两个授权域名服务器。
- 实际上,许多域名服务器都同时充当 本地域名服务器和权限域名服务器。
- 权限域名服务器总能将其管辖的主机名转换为该主机的IP地址
-
本地域名服务器
- 每个因特网服务提供者(ISP), 或一所大学,甚至一所大学中的各个系,都可以拥有一个本地域名服务器。
- 当一台主机发出DNS查询请求时,这个查询请求报文就发送给该主机的本地域名服务器。
- 事实上,我们在Windows系统中配置“本地连接”时,就需要填写DNS地址,这个地址就是本地DNS (域名服务器)的地址
DNS报文

DNS查询举例
-
递归查询
当本地域名服务器不知道IP时,由本地域名服务器向根域名服务器发出请求查询一般主机向本地域名服务器的查询采用递归查询
-
迭代查询
当根域名服务器收到请求时,要么给出IP地址(通常不),要么告知本地域名服务器应向哪个顶级域名服务器发送请求,然后由本地域名服务器进行后续查询。
本地域名服务器向根域名服务器 通常采用迭代查询。

假定域名为m.xyz.com的主机想知道另一台主机(域名为 y.abc.com)的IP地址。
下面是图6-5(a)的几个查询步骤:
- 主机m.xyz.com 先向其本地域名服务器 dns.xyz.com 进行递归查询。
- 本地域名服务器采用迭代查询。它先向一个根域名服务器查询。
- 根域名服务器告诉本地域名服务器,下一次应查询的顶级域名服务器 dns.com的IP地址。
- 本地域名服务器向顶级域名服务器dns.com进行查询。
- 顶级域名服务器dns.com告诉本地域名服务器,下一次应查询的权限域名服务器 dns.abc.com的IP地址。
- 本地域名服务器向权限域名服务器dns.abc.com进行查询。
- 权限域名服务器dns.abc.com告诉本地域名服务器,所查询的主机的IP地址。
- 本地域名服务器最后把查询结果告诉主机m.xyz.com。
图6-5(b)是本地域名服务器采用递归查询的情况。在这种情况下,本地域名服务器只
需向根域名服务器查询一次,后面的几次查询都是在其他几个域名服务器之间进行的。
最后,本地域名服务器从根域名服务器得到了所需的IP地址,并把查询结果告诉主机m.xyz.com。整个的查询也是使用8个UDP。
HTTP
URL 统一资源定位符。<协议>://<主机>:<端口>/<路径>
URI:统一资源标识符
http是万维网的传输机制,允许浏览器通过连接web服务器浏览网页。
http端口是80 或者8080. 面向事务的,无状态(可使用cookie增加状态),采用TCP连接

请求一个万维网文档所需时间:2*RTT+文档传输时间 (一个RTT用于连接TCP连接, 另一个RTT用于请求和接收文档。
HTTP/1.1版本使用了持续连接,该连接能保持一段时间,解决了http/1.0版本的非持续连接的负担
HTTP/1.1的持续连接有两种工作方式 1. 非流水线方式 2. 流水线方式
-
非流水线方式:客户在收到前一个响应后才能发出下一个请求
-
流水线方式:客户在收到HTTP的响应报文前就能接着发送新的请求报文。(TCP连接响应收到前就可以发送http请求报文)
使用流水线方式,客户访问所有的对象只需花费一个RTT时间(http请求和接受文档的RTT)
http报文结构
http请求

http响应

状态码都是三位数字的,分为5类
1xx表示通知信息,如请求收到了或正在进行处理。
2xx表示成功,如接受或知道了。
3xx表示重定向,如要完成请求还必须采取进一步的行动。
4xx表示客户的差错,如请求中有错误的语法或不能完成。
5xx表示服务器的差错,如服务器失效无法完成请求。

浙公网安备 33010602011771号