IceOfSummerの博客还是自己搭的博客靠谱后面一辈子的博客都在这了!

1. 网际协议IP

1.1 IPv4

IP报文格式

  • 版本: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 = 01400 / 8 = 1752800 / 8 = 350
  • 生存时间:一般称为TTL(Time To Live),标明数据报在网络中的寿命。最初的设计是以作为TTL的单位,每经过一个路由器就减掉响应的时间,到零时则会被丢弃。然而随着技术的进步,路由器处理数据报所需的时间不断在缩短,一般都远远小于1秒,后来就把TTL字段的功能改为“跳数限制”,即每经过一个路由器,就将该值减一,到零时就删除掉,最大值为255
  • 协议:见下表
协议名ICMPIGMPIPTCPEGPIGPUDPIPv6ESPICMP-IPv6
字段值12468917415058
  • 首部校验和:这个字段只检验数据报的首部,但不包括数据部分。具体运算方式是把首部按16字节划分,然后按照反码算术相加得到。
  • 源地址:发送IP数据报主机的IP地址
  • 目的地址:占32位。接收IP数据报主机的IP地址
  • 选项:由于选项很难背用到,而且也会增加路由器的开销,因此在IPv6中,IP数据报首部长度被改为固定值了

1.2 IPv6

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报文格式

TCP报文格式解析 (biancheng.net)

其中可能比较难记的就是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. 路由器和交换机

如果让你来设计网络 (qq.com)

交换机是工作在数据链路层的,它根据每台设备的MAC地址来转发数据。

而路由器是工作在网络层的,它负责IP报文的转发。

1
...
45678
...
23