For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
Linux编程开发技术随着互联网的不断发展而被越来越多的程序员掌握,今天我们就通过案例分析来简单了解一下,Linux编程网络信息传递方法分享。
网络协议栈处理
传输层处理
接着数据来到了传输层
传输层主要看 tcp_write_xmit 函数,这个函数处理了传输层的拥塞控制、滑动窗口相关的工作
该函数会根据发送窗口和最大段大小等因素计算出本次发送的数据大小,然后将数据封装成 TCP 段并发送出去
如果满足窗口要求,设置 TCP 头然后将数据传到更低的网络层进行处理
在传输层中,内核主要做了两件事:
复制一份数据(skb)
为什么要复制一份出来呢?因为网卡发送完成之后,skb 会被释放掉,但 TCP 协议是支持丢失重传的
所以在收到对方的 ACK 之前必须要备份一个 skb 去为重传做准备
实际上一开始发送的是 skb 的拷贝版,收到了对方的 ACK 之后系统才会把真正的 skb 删除掉
封装 TCP 头
系统会根据实际情况添加 TCP 头封装成 TCP 段
这里需要知道的是:每个 skb 内部包含了网络协议中的所有头部信息,例如 MAC 头、IP 头、TCP/UDP 头等
在设置这些头部时,内核会通过调整指针的位置来填充相应的字段,而不是频繁申请和拷贝内存
image
比如说在设置 TCP 头的时候,只是把指针指向 skb 的合适位置。后面再设置 IP 头的时候,在把指针挪一挪就行
这种方式利用了 skb 数据结构的链表特性可以避免内存分配和数据拷贝所带来的性能开销,从而提高数据传输的效率
网络层处理
数据离开了传输层之后,就来到了网络层
网络层主要做下面的事情:
路由项查找:
根据目标 IP 地址查找路由表,确定数据包的下一跳( ip_queue_xmit 函数)
IP 头设置:
根据路由表查找的结果,设置 IP 头中的源和目标 IP 地址、TTL(生存时间)、IP 协议等字段
netfilter 过滤:
netfilter 是 Linux 内核中的一个框架,用于实现数据包的过滤和修改
在网络层,netfilter 可以用于对数据包进行过滤、NAT(网络地址转换)等操作
skb 切分:
如果数据包的大小超过了 MTU(最大传输单元),需要将数据包进行切分成多个片段,以适应网络传输,每个片段会被封装成单独的 skb
数据链路层处理
当数据来到了数据链路层之后,会有两个子系统协同工作,确保数据包在发送和接收过程中能够正确地对数据进行封装、解析和传输
邻居子系统
管理和维护主机或路由器与其它设备之间的邻居关系
邻居子系统里会发送 arp 请求找邻居,然后把邻居信息存在邻居缓存表里,用于存储目标主机的 MAC 地址
当需要发送数据包到某个目标主机时,数据链路层会首先查询邻居缓存表,以获取目标主机的 MAC 地址,从而正确地封装数据包(封装 MAC 头)
网络设备子系统
网络设备子系统负责处理与物理网络接口相关的操作,包括数据包的封装和发送,以及从物理接口接收数据包并进行解析
网络设备子系统不但处理数据包的格式转换,如在以太网中添加帧头和帧尾,以及从帧中提取数据
还负责处理硬件相关的操作,如发送和接收数据包的时钟同步、物理层错误检测等
到达网卡发送队列
接着网络设备子系统会选择一个合适的网卡发送队列并把 skb 添加到队列中(绕过软中断处理程序)
然后,内核会调用网卡驱动的入口函数 dev_hard_start_xmit 来触发数据包的发送
在一些情况下,邻居子系统还会将 skb 数据包添加到软中断队列(softnet_data)上,并触发软中断(NET_TX_SOFTIRQ)
这个过程是为了将 skb 数据包交给软中断处理程序进行进一步处理和发送。软中断处理程序会负责实际的数据包发送
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加抖音太原达内IT培训学习了解。