type
status
date
slug
summary
tags
category
icon
password
计算机网络系列(一):基础篇
网络模型
国际标标准化组织制定的标准网络模型是
OSI网络模型
,一共有七层:- 应用层,负责给应用程序提供统一的接口
- 表示层,负责把数据转换成兼容另一个系统能识别的格式
- 会话层,负责建立、管理和终止表示层实体之间的通信会话
- 传输层,负责端到端的数据传输
- 网络层,负责数据的路由、转发、分片
- 数据链路层,负责数据的封帧和差错检测,以及 MAC 寻址
- 物理层,负责在物理网络中传输数据帧
由于 OSI 模型实在太复杂,提出的也只是概念理论上的分层,并没有提供具体的实现方案。事实上,我们比较常⻅,也比较实用的是四层模型,即
TCP/IP网络模型
,Linux 系统正是按照这套网络模型来实现网络协议栈的。一共有四层:- 应用层,负责向用户提供一组应用程序,比如 HTTP、DNS、FTP 等
- 传输层,负责端到端的通信,比如 TCP、UDP 等
- 网络层,负责网络包的封装、分片、路由、转发,比如 IP、ICMP 等
- 网络接口层,负责网络包在物理网络中的传输,比如网络包的封帧、 MAC 寻址、差错检测,以及通过网卡传 输网络帧等
网络协议栈
在TCP/IP网络模型里面,数据在每一层都会经过一次包装
- 传输层:给应用数据前面增加了 TCP 头,单位为
segment
。
- 网络层,给 TCP 数据包前面增加了 IP 头,单位为
packet
。
- 网络接口层,给 IP 数据* 包前后分别增加了帧头和帧尾,单位为
frame
。
Linux系统收发网络
Linux接收网络包的过程
如果每当网卡收到一个网络包,就触发一个中断告诉操作系统,会造成cpu频繁中断。Linux 内核在 2.6 版本中引入了 NAPI 机制,它是混合「中断和轮询」的 方式来接收网络包,它的核心概念就是不采用中断的方式读取数据,而是首先采用中断唤醒数据接收的服务程序, 然后 poll 的方法来轮询数据。
- 当有网络包到达时,通过 DMA 技术,将网络包放入到 Ring Buffer,触发中断。
- 网卡发起硬件中断,于是会执行网卡硬件中断处理函数,中断处理函数处理完需要「暂时屏蔽中断」,然后唤醒「软中断」来轮询处理数据,直到没有新数据时才恢复中断。
- 「软中断」从 Ring Buffer 中拷⻉数据到内核 struct sk_buff 缓冲区,作为一个网络包交给网络协议栈进行逐层处理。
- 进入网络接口层,在这一层会检查报文的合法性,如果不合法则丢弃,合法则会找出该网络包的上层协议的类型,比如是 IPv4,还是 IPv6,接着再去掉帧头和帧尾,然后交给网络层。
- 进入网络层,则取出 IP 包,判断网络包下一步的走向,比如是交给上层处理还是转发出去。当确认这个网络包要发送给本机后,就会从 IP 头里看看上一层协议的类型是 TCP 还是 UDP,接着去掉 IP 头,然后交给传输层。
- 进入传输层,取出 TCP 头或 UDP 头,根据四元组「源 IP、源端口、目的 IP、目的端口」 作为标识,找出对应的Socket,并把数据拷⻉到 Socket 的接收缓冲区。
- 进入应用层,应用层程序调用 Socket 接口,从内核的 Socket 接收缓冲区读取新到来的数据到应用层。
Linux发送网络包的过程
发送网络包的流程正好和接收流程相反:
- 首先,应用程序会调用 Socket 发送数据包的接口,由于这个是系统调用,所以会从用户态陷入到内核态中的 Socket 层,Socket 层会将应用层数据拷⻉到 Socket 发送缓冲区中。然后网络协议栈从 Socket 发送缓冲区中取出数据包,并按照 TCP/IP 协议栈从上到下逐层处理。
- 进入传输层,如果使用的是 TCP 传输协议发送数据,那么会在传输层增加 TCP 包头。
- 进入网络层,网络层会给数据包增加 IP 包,然后通过查询路由表确认下一跳的 IP,并按照 MTU 大小进行分片。
- 进入网络接口层,过 ARP 协议获得下一跳的 MAC 地址,然后增加帧头和帧尾,放到发包队列中。
- 触发软中断告诉网卡驱动程序,这里有新的网络包需要发送,最后驱动程序通过 DMA,从发 包队列中读取网络包,将其放入到硬件网卡的队列中,随后物理网卡再将它发送出去。
IEEE 802标准
IEEE 802 指IEEE标准中关于局域网和城域网的一系列标准。更确切的说,IEEE 802标准仅限定在传输可变大小数据包的网络。其中最广泛使用的有以太网、令牌环、无线局域网等。这一系列标准中的每一个子标准都由委员会中的一个专门工作组负责。
IEEE 802中定义的服务和协议限定在OSI模型的最低两层(即物理层和数据链路层)。事实上,IEEE 802将OSI的数据链路层分为两个子层,分别是逻辑链路控制(LLC, Logical Link Control)和介质访问控制(MAC, Media Access Control),如下所示:
- 数据链路层
- 逻辑链路控制子层
- 介质访问控制子层
- 物理层
现有标准
- IEEE 802.1:高层局域网协议(Bridging (networking) and Network Management)
- IEEE 802.2:逻辑链路控制(Logical link control)
- IEEE 802.3:以太网(Ethernet)
- IEEE 802.4:令牌总线(Token bus)
- IEEE 802.5:令牌环(Token-Ring)
- IEEE 802.6:城域网(MAN, Metropolitan Area Network)
- IEEE 802.7:宽带TAG(Broadband LAN using Coaxial Cable)
- IEEE 802.8:光纤分布式数据接口(FDDI)
- IEEE 802.9:综合业务局域网(Integrated Services LAN)
- IEEE 802.10:局域网网络安全(Interoperable LAN Security)
- IEEE 802.11:无线局域网(Wireless LAN & Mesh)
- IEEE 802.12:需求优先级(Demand priority)
- IEEE 802.13:(未使用)
- IEEE 802.14:电缆调制解调器(Cable modems)
- IEEE 802.15:无线个人网(Wireless PAN)
- IEEE 802.15.1:无线个人网络(WPAN, Wireless Personal Area Network)
- IEEE 802.15.4:低速无线个人网络(LR-WPAN, Low Rate Wireless Personal Area Network)
- IEEE 802.16:宽带无线接入(Broadband Wireless Access)
- IEEE 802.17:弹性封包环传输技术(Resilient packet ring)
- IEEE 802.18:无线电管制技术(Radio Regulatory TAG)
- IEEE 802.19:共存标签(Coexistence TAG)
- IEEE 802.20:移动宽频无线接入(Mobile Broadband Wireless Access)
- IEEE 802.21:媒介独立换手(Media Independent Handover)
- IEEE 802.22:无线区域网(Wireless Regional Area Network)
- IEEE 802.23:紧急服务工作组(Emergency Services Working Group),2010年3月新发布
- Author:mcbilla
- URL:http://mcbilla.com/article/e3fec341-7e36-446c-81e9-e004bf281c88
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts