Linux网络

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,链路层:就是传输层,网络层和网络接口层
  • 网卡:网卡驱动程序和物理传输设备,也就是接受或者发送网络包的基础设备.(内核通过系统设备与网卡进行交互),特别注意,网卡的数据读取和发送,都是通过硬中断来处理,而协议栈中的大部分逻辑都是通过,软中断来处理

网络包的接收流程

  1. 当网络帧到达网卡后,网卡会通过DMA方式,吧这个网络包放到收包队列中.然后通过硬中断,告诉中断处理器已经收到了网络包
  2. 网卡中断程序会为网络帧分配内核数据结构(sk_buff),并将其拷贝到sk_buff缓冲区中,然后再通过软中断,通知内核收到了新的网络帧.
  3. 内核协议栈从缓冲区中取出网络帧,并通知网络协议栈,从下到上逐层处理这个网络帧

        网络帧的处理过程

  • 在链路层检查报文的合法性,找出上层协议的类型(比如 IPv4 还是 IPv6),再去掉帧头、帧尾,然后交给网络层。
  • 网络层取出 IP 头,判断网络包下一步的走向,比如是交给上层处理还是转发。当网络层确认这个包是要发送到本机后,就会取出上层协议的类型(比如 TCP 还是 UDP),去掉 IP 头,再交给传输层处理。
  • 传输层取出 TCP 头或者 UDP 头后,根据 [ 源 IP、源端口、目的 IP、目的端口 ] 四元组作为标识,找出对应的 Socket,并把数据拷贝到 Socket 的接收缓存中。
  • 最后应用程序就可以使用socket接口,读取新接受的数据了

网络包的发送流程

        网络包的发送过程,其实正好与接受方式相反

  1. 应用程序调用Socket API 发送网络包,但是由于是系统调用,所以会陷入到内核态的套接字层中,套接字层会把数据包放到Socket发送缓冲区中
  2. 网络协议栈从Socket发送缓冲区中,取出数据包,再按照TCP/IP栈,从上到下处理,给各个层增加对应的协议头,并执行路由,确认下一跳IP,同时也会按照MTU进行分片
  3. 分片后的网络包,再发送到网络接口层,进行物理地址寻址(MAC地址),然后添加帧头和帧尾,放到发包队列中,然后会通过软中断程序告知驱动程序,发包程序中又新的网络栈需要发送
  4. 驱动程序会通过DMA,从发包队列中读取出网络帧,并通知物理网卡将其发送出去

       

        

        

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值