1. 网际协议IP
1.1 IPv4
- 版本:IPv4为4,IPv6即为6
- 首部长度:单位为4字节,因此头部最长为15个4字节,即60字节
- 区分服务(旧版叫服务类型):QoS分类和标记 - 知乎 (zhihu.com)
- 总长度:总长度包括首部和数据的长度。
- 标识:用于路由器分片重组。同一个分片的标志值相同,不同的分片的标识值不同。
- 标志:占3位,但只两位可以使用
- 最低位(可以理解为最右边):记为MF(More Fragment)。MF = 1标识后面还有分片。
- 中间位:记为DF(Don't Fragment),意为不能分片,只有当DF = 0时才允许分片。
- 片偏移:较长的分组在分片后,某片在原分组中的相对位置,单位是8字节。
- 例如有一个数据有3800字节,被分为了1400字节、1400字节、1000字节(忽略了首部),则它们的片偏移分别为:
0/8 = 0
,1400 / 8 = 175
,2800 / 8 = 350
- 例如有一个数据有3800字节,被分为了1400字节、1400字节、1000字节(忽略了首部),则它们的片偏移分别为:
- 生存时间:一般称为TTL(Time To Live),标明数据报在网络中的寿命。最初的设计是以秒作为TTL的单位,每经过一个路由器就减掉响应的时间,到零时则会被丢弃。然而随着技术的进步,路由器处理数据报所需的时间不断在缩短,一般都远远小于1秒,后来就把TTL字段的功能改为“跳数限制”,即每经过一个路由器,就将该值减一,到零时就删除掉,最大值为255
- 协议:见下表
协议名 | ICMP | IGMP | IP | TCP | EGP | IGP | UDP | IPv6 | ESP | ICMP-IPv6 |
---|---|---|---|---|---|---|---|---|---|---|
字段值 | 1 | 2 | 4 | 6 | 8 | 9 | 17 | 41 | 50 | 58 |
- 首部校验和:这个字段只检验数据报的首部,但不包括数据部分。具体运算方式是把首部按16字节划分,然后按照反码算术相加得到。
- 源地址:发送IP数据报主机的IP地址
- 目的地址:占32位。接收IP数据报主机的IP地址
- 选项:由于选项很难背用到,而且也会增加路由器的开销,因此在IPv6中,IP数据报首部长度被改为固定值了
1.2 IPv6
-
版本:IPv6肯定就是6了
-
通信量类(Traffic Class):这是为了区分不同的IPv6数据报的类别或优先级,和IPv4的区分服务字段的作用相似。
-
流标号(Flow Label):IPv6的一个新的机制是支持资源预分配,并且允许路由器把每个数据报与一个给定的资源分配相联系。
-
有效荷载长度:它指明IPv6数据报除基本首部以为的字节数(所有扩展首部都算在有效荷载之内)。
-
下一个首部:它相当于IPv4的协议字段或可选字段。
-
跳数限制:用来防止数据报在网络中无期限的存在。
2. TCP
2.1 三次握手
深入浅出TCP三次握手 (多图详解) - 知乎 (zhihu.com)
主要是要记住客户端和服务端的状态:
- 客户端:CLOSED -> SYN-SENT -> ESTABLISHED
- 服务端:CLOSED -> SYN-RCVD -> ESTABLISHED
之后在每次通信时,下次消息的seq
为对方上次消息的ack
,下次消息的ack
为对方上次消息的seq + 总数据长度
(同一个seq
可能会有多个消息)
在握手时,虽然数据长度为0,在理解时需要将其"当做"长度为1。
2.2 四次挥手
TCP四次挥手详解_oOoOoOooOO的博客-CSDN博客
客户端和服务端的状态:
- 客户端(主动关闭的那一方):ESTABLISHED -> FIN_WAIT -> TIME_WAIT(等待2ms) -> CLOSE
- 服务端(响应关闭的那一方):ESTABLISHED -> CLOSE_WAIT -> LAST_ACK -> CLOSE
这里在主动关闭的那一方需要等待2MSL,原因如下:
-
首先占用该端口,因为IP报文在网络中的生存时间是有限的,让旧的报文全部在网络中被丢弃
-
若主动关闭的那一方的ACK没有被服务端收到,此时服务端再次返回一个FIN报文,会被客户端错误的以为是一个错误报文而导致状态重置(发送RST报文)
TCP的TIME_WAIT状态 - 知乎 (zhihu.com)
2.3 TCP报文格式
其中可能比较难记的就是8个标志位的前两个了,其实只需要记住全称就不容易忘了:
- CWR:Congestion Window Reduce
- ECE:ECN Echo,全称Explicit Congestin Notification Echo
里面还有个校验和,这里需要知道是怎么算的。在计算机网络第八版P218中介绍了UDP的检验和计算:
- 首先在数据报前添加一个伪首部
- 将校验和的位置置零
- 以16位2个字节为单位,如果由于数据的长度导致无法满足该条件,则在数据部分后补零即可。之后将所有数据相加,如果溢出,则添加到低位(二进制反码运算求和)
- 将结果取反添加到校验和的位置
在验证时同样使用上面的方法,但不用把校验位置零,若计算结果最终为全1,则表示数据无误
TCP/UDP伪头部详解_tcp 伪头部_M、k的博客-CSDN博客
需要注意的是IP报文的校验不包含数据。
3. 路由器和交换机
交换机是工作在数据链路层的,它根据每台设备的MAC地址来转发数据。
而路由器是工作在网络层的,它负责IP报文的转发。