Linux操作系统原理—内核网络协议栈


Linux操作系统原理—内核网络协议栈
本文插图
封装:当应用程序用 TCP 协议传送数据时 , 数据首先进入内核网络协议栈中 , 然后逐一通过 TCP/ip 协议族的每层直到被当作一串比特流送入网络 。 对于每一层而言 , 对收到的数据都会封装相应的协议首部信息(有时还会增加尾部信息) 。 TCP 协议传给 IP 协议的数据单元称作 TCP 报文段 , 或简称 TCP 段(TCP segment) 。 IP 传给数据链路层的数据单元称作 IP 数据报(IP datagram) , 最后通过以太网传输的比特流称作帧(Frame) 。
Linux操作系统原理—内核网络协议栈
本文插图
分用:当目的主机收到一个以太网数据帧时 , 数据就开始从内核网络协议栈中由底向上升 , 同时去掉各层协议加上的报文首部 。 每层协议都会检查报文首部中的协议标识 , 以确定接收数据的上层协议 。 这个过程称作分用 。
Linux操作系统原理—内核网络协议栈
本文插图
协议栈的全景图
Linux操作系统原理—内核网络协议栈
本文插图
协议栈的分层结构
Linux操作系统原理—内核网络协议栈
本文插图
Linux操作系统原理—内核网络协议栈
本文插图
逻辑抽象层级:
物理层:主要提供各种连接的物理设备 , 如各种网卡 , 串口卡等 。
链路层:主要提供对物理层进行访问的各种接口卡的驱动程序 , 如网卡驱动等 。
网路层:是负责将网络数据包传输到正确的位置 , 最重要的网络层协议是 IP 协议 , 此外还有如 icmp , ARP , RARP 等协议 。
传输层:为应用程序之间提供端到端连接 , 主要为 TCP 和 UDP 协议 。
应用层:顾名思义 , 主要由应用程序提供 , 用来对传输数据进行语义解释的 “人机交互界面层” , 比如 HTTP , SMTP , FTP 等协议 。
【文章福利】需要C/C++ Linux服务器架构师学习资料加群812855908(资料包括C/C++ , Linux , golang技术 , Nginx , ZeroMQ , MySQL , Redis , fastdfs , MongoDB , ZK , 流媒体 , CDN , P2P , K8S , Docker , TCP/IP , 协程 , DPDK , ffmpeg等)
Linux操作系统原理—内核网络协议栈
本文插图
协议栈实现层级:
硬件层(Physical device hardware):又称驱动程序层 , 提供连接硬件设备的接口 。
设备无关层(Device agnostic interface):又称设备接口层 , 提供与具体设备无关的驱动程序抽象接口 。 这一层的目的主要是为了统一不同的接口卡的驱动程序与网络协议层的接口 , 它将各种不同的驱动程序的功能统一抽象为几个特殊的动作 , 如 open , close , INIT 等 , 这一层可以屏蔽底层不同的驱动程序 。