网络模型
OSI模型:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
应用层:负责给应用程序提供统一的接口
表示层:负责把数据转换成兼容另一个系统能识别的格式
会话层:负责建立、管理和终止表示层实体之间的通信会话
传输层:负责端到端的数据传输
网络层:负责数据的路由、转发、分片
数据链路层:负责数据的封帧和差错检测,以及MAC寻址
物理层:负责在物理网络中传输数据帧
TCP/IP:应用层、传输层、网络层、网络接口
应用层:负责向用户提供一组应用程序,HTTP、DNS、FTP等
传输层:负责端到端的通信,比如TCP、UDP等
网络层:负责网络包的封装、分片、路由、转发,比如IP,ICMP等
网络接口层:负责网络包在物理网络中的传输、比如网络包的封帧、MAC寻址、差错检测、以及通过网卡传输网络帧等
Linux网络协议栈
【数据在每一层的封装格式】
在以太网中,规定的最大传输单元MTU是1500字节,就是单次传输的最大IP包大小。
【协议栈】
- 应用程序通过系统调用来跟Socket层进行数据交互。
- Socket层的下面就是传输层、网络层和网络接口层。
- 最下面的一层就是网卡驱动程序和硬件网卡设备。
Linux接收包的过程
- 网卡收到网络包,通过DMA技术将网络包放入到Ring Buffer中。通过中断或者NAPI机制(中断+轮询poll)来通知操作系统。【网卡硬件中断+软中断处理】
- 将数据从Ring Buffer中拷贝到内核struct sk_buff缓冲区中,准备交给协议栈处理。
- 先进入网络接口层,若报文合法,找出上层的协议,是IP4或者IP6,去除帧头和帧尾,交给网络层。
- 网络层取出IP包,判断网络下一步的走向(是交给上层处理还是转发出去),如果是给本机,查看IP头中的协议类型是TCP还是UDP,取出IP头,交给传输层。
- 传输层,取出TCP或者UDP头,根据四元组找到对应的socket,并把数据拷贝到socket的接收缓存区。
- 应用层程序调用socket接口,从内核的socket接收缓冲区中读取新到来的数据到应用层数据缓冲区。
发送包过程与接收包过程相反