linux的网络模型
????????TCP/IP网络模型:应用层,传输层,网络层,网络接口层
- 应用层:负责像用户提供一组应用层序,必须http,ftp,dns等
- 传输层:负责端到端的通信,比如TCP,UDP等
- 网络层:负责网络包的封装,寻址和路由,比如IP,ICMP等
- 网络接口层:负责网络包再物理网络中的传输,比如MAC寻址,错误侦测以及通过网卡传输网络帧等
OSI模型与TCP/IP模型的区别
Linux网络栈
? ? ? ? 再进行网络传输的时候,数据包会按照协议栈,对上一层发来的数据包进行逐层处理,然后封装上该层的协议头,再发给下一层
? ? ? ? 网络包再每一层的处理逻辑,都取决于各层的网络协议,比如再应用层,一个提供REST API的应用,可以使用HTTP协议,把它需要传输的JSON数据封装到HTTP协议中,然后传递给TCP层.
?
? ? ? ? ?简单的理解就是:传输层再应用数据前加了TCP头,网络层再TCP头前面又加了IP头,而网络接口层又在IP头前面加了帧头.当然他们都是更具特定的协议格式进行添加!
? ? ? ? 如果传输的数据交大会如何处理?
? ? ? ? 再物理传输层中网络接口配置的最大传输单元是1500(也是linux的默认值,简称MTU),一旦网络包超过这个值,就会再网络中进行分片,确保每次发送到包不超过这个值,当然这个值越大也就代表需要分片的次数越少,同时网络的吞吐能力也就越强
? ? ? ? MTU
linux中IP网络栈的示意图????????
- 应用层:需要通过系统调用,来跟套接字进行互动
- TCP,UDP,IP,链路层:就是传输层,网络层和网络接口层
- 网卡:网卡驱动程序和物理传输设备,也就是接受或者发送网络包的基础设备.(内核通过系统设备与网卡进行交互),特别注意,网卡的数据读取和发送,都是通过硬中断来处理,而协议栈中的大部分逻辑都是通过,软中断来处理
网络包的接收流程
- 当网络帧到达网卡后,网卡会通过DMA方式,吧这个网络包放到收包队列中.然后通过硬中断,告诉中断处理器已经收到了网络包
- 网卡中断程序会为网络帧分配内核数据结构(sk_buff),并将其拷贝到sk_buff缓冲区中,然后再通过软中断,通知内核收到了新的网络帧.
- 内核协议栈从缓冲区中取出网络帧,并通知网络协议栈,从下到上逐层处理这个网络帧
? ? ? ? 网络帧的处理过程
- 在链路层检查报文的合法性,找出上层协议的类型(比如 IPv4 还是 IPv6),再去掉帧头、帧尾,然后交给网络层。
- 网络层取出 IP 头,判断网络包下一步的走向,比如是交给上层处理还是转发。当网络层确认这个包是要发送到本机后,就会取出上层协议的类型(比如 TCP 还是 UDP),去掉 IP 头,再交给传输层处理。
- 传输层取出 TCP 头或者 UDP 头后,根据 [ 源 IP、源端口、目的 IP、目的端口 ]?四元组作为标识,找出对应的 Socket,并把数据拷贝到 Socket 的接收缓存中。
- 最后应用程序就可以使用socket接口,读取新接受的数据了
网络包的发送流程
? ? ? ? 网络包的发送过程,其实正好与接受方式相反
- 应用程序调用Socket API 发送网络包,但是由于是系统调用,所以会陷入到内核态的套接字层中,套接字层会把数据包放到Socket发送缓冲区中
- 网络协议栈从Socket发送缓冲区中,取出数据包,再按照TCP/IP栈,从上到下处理,给各个层增加对应的协议头,并执行路由,确认下一跳IP,同时也会按照MTU进行分片
- 分片后的网络包,再发送到网络接口层,进行物理地址寻址(MAC地址),然后添加帧头和帧尾,放到发包队列中,然后会通过软中断程序告知驱动程序,发包程序中又新的网络栈需要发送
- 驱动程序会通过DMA,从发包队列中读取出网络帧,并通知物理网卡将其发送出去
? ? ? ?
????????
????????
|