理解 Linux网络栈(1):Linux 网络协议栈简单总结( 二 )
TCP 协议栈的大致处理过程如下图所示:
文章插图
TCP 栈简要过程:
- tcp_sendmsg 函数会首先检查已经建立的 TCP connection 的状态 , 然后获取该连接的 MSS , 开始 segement 发送流程 。
- 构造 TCP 段的 playload:它在内核空间中创建该 packet 的 sk_buffer 数据结构的实例 skb , 从 userspace buffer 中拷贝 packet 的数据到 skb 的 buffer 。
- 构造 TCP header 。
- 计算 TCP 校验和(checksum)和 顺序号 (sequence number) 。TCP 校验和是一个端到端的校验和 , 由发送端计算 , 然后由接收端验证 。 其目的是为了发现TCP首部和数据在发送端到接收端之间发生的任何改动 。 如果接收方检测到校验和有差错 , 则TCP段会被直接丢弃 。 TCP校验和覆盖 TCP 首部和 TCP 数据 。 TCP的校验和是必需的
- 发到 IP 层处理:调用 IP handler 句柄 ip_queue_xmit , 将 skb 传入 IP 处理流程 。
- UDP 将 message 封装成 UDP 数据报
- 调用 ip_append_data() 方法将 packet 送到 IP 层进行处理 。
网络层的任务就是选择合适的网间路由和交换结点 ,确保数据及时传送 。 网络层将数据链路层提供的帧组成数据包 , 包中封装有网络层包头 , 其中含有逻辑地址信息- -源站点和目的站点地址的网络地址 。 其主要任务包括 (1)路由处理 , 即选择下一跳 (2)添加 IP header (3)计算 IP header checksum , 用于检测 IP 报文头部在传播过程中是否出错 (4)可能的话 , 进行 IP 分片 (5)处理完毕 , 获取下一跳的 MAC 地址 , 设置链路层报文头 , 然后转入链路层处理 。
IP 头:
文章插图
IP 栈基本处理过程如下图所示:
文章插图
- 首先 , ip_queue_xmit(skb)会检查skb->dst路由信息 。 如果没有 , 比如套接字的第一个包 , 就使用ip_route_output()选择一个路由 。
- 接着 , 填充IP包的各个字段 , 比如版本、包头长度、TOS等 。
- 中间的一些分片等 , 可参阅相关文档 。 基本思想是 , 当报文的长度大于mtu , gso的长度不为0就会调用 ip_fragment 进行分片 , 否则就会调用ip_finish_output2把数据发送出去 。 ip_fragment 函数中 , 会检查 IP_DF 标志位 , 如果待分片IP数据包禁止分片 , 则调用 icmp_send()向发送方发送一个原因为需要分片而设置了不分片标志的目的不可达ICMP报文 , 并丢弃报文 , 即设置IP状态为分片失败 , 释放skb , 返回消息过长错误码 。
- 接下来就用 ip_finish_ouput2 设置链路层报文头了 。 如果 , 链路层报头缓存有(即hh不为空) , 那就拷贝到skb里 。 如果没 , 那么就调用neigh_resolve_output , 使用 ARP 获取 。
功能上 , 在物理层提供比特流服务的基础上 , 建立相邻结点之间的数据链路 , 通过差错控制提供数据帧(Frame)在信道上无差错的传输 , 并进行各电路上的动作系列 。 数据链路层在不可靠的物理介质上提供可靠的传输 。 该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等 。 在这一层 , 数据的单位称为帧(frame) 。 数据链路层协议的代表包括:SDLC、HDLC、PPP、STP、帧中继等 。
实现上 , Linux 提供了一个 Network device 的抽象层 , 其实现在 linux/net/core/dev.c 。 具体的物理网络设备在设备驱动中(driver.c)需要实现其中的虚函数 。 Network Device 抽象层调用具体网络设备的函数 。
- 设计模式6之代理模式
- 退休主任医师的网络医生经验:一天最多能看20人 很要耐心
- Nginx服务器屏蔽与禁止屏蔽网络爬虫的方法
- 监控摄像头被黑!Mirai僵尸网络再作乱物联网设备成重灾区
- 在图上发送消息的神经网络MPNN简介和代码实现
- Linux培训完能到什么水平,之后还需要学习哪些技术?
- 如何使用 lshw 查看 Linux 设备信息
- 网络安全:如何使用MSFPC半自动化生成强大的木码?「下集」
- 人工智能驱动的零接触网络在5G世界中的作用
- AMD Radeon图形驱动占到了Linux内核的10.5%