0x0 IP协议的特点

  • 无连接,传输数据前不用建立连接
  • 经历而为,无法转发会直接丢弃
  • 无序传播
  • 不可靠,无情的发送机器

0x1 IP包头的结构

  • 注解
    1. 版本:固定为4
    2. 包头长度:一般为20
    3. 服务类型:不用了解
    4. 报文长度:本IP报文有多长
    5. 标识符:用来识别是否为同一IP报文,分片了的IP报文的标识符都一致
    6. 标志位:
      • 0 : 保留(无意义)
      • 0 :DF位 为1不允许。为0允许。 尽力而为、、
      • 0 :MF位 为1还有后续分片。为0表示自己是最后一个
    7. 分段偏移量:偏移量:用前一个分片的偏移量+携带数据量得到下个报文的偏移量
    8. 存活时间TTL:用来防止路由环路,每到下一跳减一
    9. 协议:标识上层协议。如TCP协议号6,UDP协议号17
    10. 包头校验和:用来检测这个包头是否完整

0x2 MTU?

  • 最大传输单元 最大为1500
    • 网络层:
    • IP包头 + IP报文
    • 20      1480
    • 数据链路层:
    • 目的mac  源mac  类型  data  FCS
    •     6       6       2   1500   4
  • 只有数据再出接口时才会考虑MTU,如果小于MTU直接通过,大于MTU需要分片或者丢弃。

0x3 IP分片?

  • why?IP分片
    • 报文大于接口的MTU无法发送
  • what?IP分片
    • IP分片就是把大于MTU的数据包分片
  • how?IP分片
    • 分片的IP包的数据量最大只能 MTU-20 1480
    • 分片的包头继承于被分片的IP包头(通过标识符)

0x4 一些小疑问?

  • 如何判断是否需要分片?
    • 查看DF位,为1不允许,为0允许
  • 如何判断包是否需要重组?
    • 标识符相同的需要重组
  • 设备收到被分片的包如何排序?
    • 用前一个分片的偏移量+携带数据量得到下个报文的偏移量
  • 重组何时结束
    • 查看标志位的MF位。为1还有后续分片,为0表示自己是最后一个

0x5 TCP协议特点

  1. 面向连接:建立连接,传输数据,断开连接,全双工通信
  2. 提供有序数据传输:SEQ机制
  3. 可靠:超时重传机制
  4. 高质量:通过滑动窗口实现流量控制

0x6 TCP包头的结构

  1. 序号:TCP把要在一个连接上发送的数据分成若干报文段,然后给每个报文段指派一个序号,序号就是该报文段第一个字节的编号。
  2. 确认号:期望接收到的下一个字节的编号。
    • 只有编码位的ACK位为1时确认号才有效
    • ACK = 序号+数据量
  3. 报文长度:整个报文的长度
  4. 预留:保留用处
  5. 编码位:
    • FIN: 结束标志;为1时,请求断开连接。
    • SYN:同步标志;为1时,请求建立连接。
    • RST:复位标志;为1时,请求重新建立TCP连接。
    • PSH:通知接收端立即将数据交给用户进程,不要停留在缓存,等待更多的数据。
    • ACK:确认标志;确认号有效位,表明该数据包包含确认信息。
    • URG:紧急标志;紧急指针有效位,与16位紧急指针配合使用。
  6. 窗口:滑动窗口
  7. 校验和:检查报文格式是否正确
  8. 紧急指针:当一个报文被读取时,优先读取那部分的内容

0x7 TCP三次握手

  • TCP连接建立——TCP MSS
  • TCP MSS是TCP的一个重要选项,TCP数据分段的最大长度,该 参数在三次握手时发给对方。类似MTU

0x7 TCP四次挥手

0x8 超时重传

  • 再传输过程中设置了一个RTT值,如果超过了这个RTT值还没收到回复的ACK就进行重装
  • 超时重传表现为TCP协议的可靠性

0x9 滑动窗口

  • TCP为每个方向的数据传送都使用两个窗口(发送窗口和接收窗口),共4个窗口。
  • TCP通过强制发送方和接收方不断调整窗口大小,来实现流量控制。
  • 设置win值,如果遇到拥塞会将win值减半,通畅后会慢慢增加
  • 滑动窗口是TCP的流量控制机制->表现为高质量

0xA 如何保证TCP的有序性

  • 接受方的的按照序列号有效处理

0xB UDP协议特点

  • 无连接的,数据传输之前不需要建立连接。
  • 不可靠的,发送端不管接收端是否能收到数据。
  • 只有校验和机制,只能做简单的差错控制。
  • 没有流量控制机制。
  • 包头小,开销低,传输效率高TCP包头为20,UDP包头为8字节。

0xC UDP的伪IP头部

  • UDP需要使用伪IP头部进行校验,因为UDP的包头太短了