TCP/IP

TCP/IP

Posted by nomadli on August 2, 2016

总览

  1. 四层协议族:链路(SLIP、ARP、RARP)、网络(IP、ICMP、IGMP)、传输(TCP、UDP)、应用(Telnet、FTP、SMTP、SNMP)

链路层

  1. ip包 目的IP 源IP 类型(0800ip数据、0806ARP、8035RARP) 数据(>=46字节) CRC
  2. Serial Line IP(SLIP) 串口或调制解调器 0xc0开始和结尾 中间为ip包 如果ip包邮0xc0用 0xdb 0xdc取代,如果有0xdb 用0xdb 0xdd取代, CSLIP压缩协议 40字节->3-5字节
  3. PPP 点对点协议 0x7e开始结束 地址(0xff) 控制(0x03) 协议(0x0021IP数据、0xc021链路控制LCP、0x8021网络控制NCP) ip包 CRC 数据遇到0x7e 用 ox7d 0x5e转义 遇到0x7d 连续两个0x7d 0x5d转义
  4. MTU 最大传输单元 兼顾响应时间和有效数据比率
  5. ARP ip->mac地址转换

网络层

  1. IP协议 不可靠、无连接、路由选择、分片、组装
  2. IP包 4bit版本、4bit头长度、8bit类型(最小时延、最大吞吐、最高可靠、最小费用)、16bit总长度、16bit标识、3bit标志、13bit偏移、8bitTTL、8bit协议、16bit头crc、32bit源IP、32bit目的IP、选项、数据
  3. ICMP 包在IP包内 IP头ICMP报文(类型_代码(0_0ping应答、3_0网络不可达、3_1主机不可达、3_2协议不可达、3_3端口不可达、3_4需要分片、3_5源站选路失败、3_6目的网络不认识、3_7目的主机不认识、3_8源主机被隔离、3_9母的网络被禁止、3_10目的主机被禁止、3_11服务类型网络不可达、3_12服务类型主机不可达、3_13被过滤、3_14主机越权、3_15优先权中止、4_0源端被关闭、5_0网络重定向、5_1主机重定向、5_2服务类型和网络重定向、5_3服务类型和主机重定向、8_0ping请求、9_0路由器通告、10_0路由请求、11_0传输生存时间为0、11_1数据报组装期间生存时间为0、12_0坏IP头、12_1IP头缺必须选项、13_0时间戳请求、14_0时间戳应答、17_0地址掩码请求、18_0地址掩码应答)、校验、内容)
  4. IGMP 包在IP包内 IP头IGMP报文(4bit版本、4bit类型(1多薄路由器查询、2主机报告报文)、8字节占位、16bit校验、32bit组地址)
  5. RIP选路协议 包含在UDP包中 IP头UDP头RIP报文

传输层

  1. UDP与IP包一对一 IP头、UDP头(12bit伪头、16bit源端口、16bit目的端口、16bit长度、16bit校验)、UDP数据
  2. TCP 面向连接、可靠、字节流服务。IP头、TCP头(12位伪头、16bit源端口、16bit目的端口、32bit序号、32bit确认序号、4bitTCP头长、6bit保留、(6bit标志,URG紧急指针、ACK确认序号、PSH紧急数据、RST重建连接、SYN同步序号、FIN完成发送)、16bit窗口大小、16bit校验、16bit紧急偏移、选项(0选项结束、1无操作、2最大报文长度、3窗口扩大因子、8时间戳))、TCP数据。SYN=1发起连接 SYN=1ACK=1确认序号及窗口大小 ACK=1确认序号。FIN=1中断连接 ACK确认 发送文件结束符 FIN=1 ACK=1
  3. 广播、多播只能用于UDP
  4. setsockopt SOL_SOCKET SO_KEEPALIVE 设置TCP自有心跳(默认2小时超时,发送5次)
  5. setsockopt SOL_SOCKET TCP_KEEPIDLE 设置TCP超时时长次数
  6. setsockopt SOL_SOCKET TCP_KEEPINTVL 设置TCP心跳间隔
  7. setsockopt SOL_SOCKET TCP_KEEPCNT 设置TCP心跳丢失次数

网卡名

  1. lo 回环接口(loop back) 或者 本地主机(localhost)
  2. gif 通用 IP-in-IP隧道(RFC2893)
  3. stf 6to4连接(RFC3056)
  4. en 以太网或802.11接口
  5. fw IP over FireWire(IEEE-1394)
  6. p2p Point-to-Point 协议
  7. awdl airdrop peer to peer
  8. bridge 第2层桥接
  9. vlan 虚拟局域网络在
  10. pdp_ip 蜂窝数据连接

tap/tun

  • 虚拟网络设备
  • tap 以太网设备,操作第二层数据包如以太网数据帧
  • tun 网络层设备,操作第三层数据包比如IP数据封包
  • go
  • go
  • win

卸载类型

  • Checksum Offload
    • IPHeader Checksum,UDP Checksum,TCP Checksum,CRC等
  • 分散/聚集(SGL)
    • 系统将socket头和数据位置传给驱动 DPU计算校验和
  • TCP 分段卸载 (TSO) - TCP Segmentation Offload
    • 使用 TCP 协议发送大数据包。使用NIC来处理分段,然后将TCP、IP和数据链路层协议头添加到每个分段。
    • 系统提高socket头模板、数据位置<64K, DPU分隔并计算校验和
  • UDP 碎片卸载 (UFO) - UDP Fragmentation Offload
    • 使用UDP协议发送大数据包。使用 NIC 将大型 UDP 数据报的 IP 分段处理为 MTU 大小的数据包。
    • 系统提高socket头模板、数据位置<64K, DPU分隔并计算校验和
  • 通用分段卸载 (GSO) - Generic Segmentation Offload
    • 使用 TCP 或 UDP 协议发送大数据包。如果 NIC 无法处理分段/碎片,GSO 会绕过 NIC 硬件执行相同的操作。这是通过尽可能晚地延迟分段来实现的,例如,当数据包由设备驱动程序处理时。
  • 大量接收卸载 (LRO) - Large Receive Offload
    • 使用 TCP 协议。所有传入数据包在收到时都会重新分段,从而减少系统必须处理的分段数量。它们可以在驱动程序中或使用 NIC 进行合并。LRO 的一个问题是它倾向于重新分段所有传入数据包,通常会忽略标头和其他可能导致错误的信息的差异。当启用 IP 转发时,通常无法使用 LRO。LRO 与 IP 转发相结合可能会导致校验和错误。/proc/sys/net/ipv4/ip_forward如果设置为 1, 则启用转发。
  • 通用接收卸载 (GRO) - Generic Receive Offload
    • 使用 TCP 或 UDP 协议。在对数据包进行重新分段时,GRO 比 LRO 更加严格。例如,它检查每个数据包的 MAC 标头,这些标头必须匹配,只有有限数量的 TCP 或 IP 标头可以不同,并且 TCP 时间戳必须匹配。重新分段可以由 NIC 或 GSO 代码处理。
  • TOE(TCP 卸载引擎)
    • 传输层及以下完全由硬件完成(传输、网络 + 本身就是硬件实现的 链路、物理)
  • XOE (TCP/UPD/ICMP/IGMP/ARP/MAC 卸载引擎)
    ethtool -k en0 #查看en0网卡的卸载能力, [fixed]表示参数无法修改
    ethtool --show-offload en0
    ethtool --offload en0 rx on tx on