2019独角兽企业重金招聘Python工程师标准>>>

      大家都知道ISO七层协议从下往上依次为:

物理层--》》数据链路层-》》网络层-》》传输层-》》会话层-》》表示层-》》应用层

各层之间是怎样工作的呢?为了加深理解,下面以一个具体的数据包来解释一下。

发送:

  1. 应用程序调用系统调用,将数据发送给socket。

  2. socket检查数据类型,调用相应的send函数。

  3. send函数检查socket状态、协议类型,传给传输层。

  4. tcp/udp(传输层协议)为这些数据创建数据结构,加入协议头部,比如端口号、检验和,传给下层(网络层)。

  5. ip(网络层协议)添加ip头,比如ip地址、检验和,如果数据包大小超过了mtu(最大数据包大小),则分片;ip将这些数据包传给链路层链路层写到网卡队列,网卡调用响应中断驱动程序,发送到网络。

接收:

  1. 数据包从网络到达网卡,网卡接收帧,放入网卡buffer,在向系统发送中断请求。

  2. cpu调用相应中断函数,这些中断处理程序在网卡驱动中。

  3. 中断处理函数从网卡读入内存,交给链路层。

  4. 链路层将包放入自己的队列,置软中断标志位。

  5. 进程调度器看到了标志位,调度相应进程。

  6. 该进程将包从队列取出,与相应协议匹配,一般为ip协议,再将包传递给该协议接收函数。

  7. ip层对包进行错误检测,无错,路由结果,packet被转发或者继续向上层传递,如果发往本机,进入链路层
    链路层再进行错误侦测,查找相应端口关联socket,包被放入相应socket接收队列

  8. socket唤醒拥有该socket的进程,进程从系统调用read中返回,将数据拷贝到自己的buffer,返回用户态。

以上是一个客户端发起一个完整的数据包的全部流程,下面说明在底层的DNS转换和使用的一些主要协议:

DNS请求流程

  1. PC1要访问www.google.com,需要先知道对应IP地址。
    域名只起助记作用,互联网访问通过IP进行。
    比方,DNS是公民身份信息库,ip是身份证号,域名是该身份证号对应的人名。
    当然,这个比方不是很恰当,域名也必须唯一的,与ip对应。

  2. 于是,PC1需要像DNS请求,查找www.google.com对应的ip,即发送dns请求:
    PC1查找dns,发现不在同一个网络,不同网段需要网关转发。
    但是,PC1需要先发送给网关,就需要先知道网关ip。
    网关用于连接不同网络,并且有自己的IP,PC1需要知道网关ip。于是,通过ARP请求,像内网广播网关ip,网关回复mac地址。
    PC1得到了网关的mac地址,将ip包封装到以太网帧,发送给网关。

  3. 网关收到该以太网帧,需要转交给dns服务器。同样,网关可能需要发送ARP请求,得到dns的mac地址。

  4. dns服务器收到请求,将www.google.com的ip发送给网关,网关再根据NAT会话表项,将目的ip转换成PC1的,再发送给PC1(此过程可能同样需要ARP请求)。

  5. PC1收到了目的ip,再可以通过类似上面的方式发送请求(目的ip再可以直接填上获取的ip)。
    其中:
    ARP==>将ip广播,目的主机响应,反馈mac地址。

  6. NAT==>在一个网络内部,自定义合法的ip地址。内网各主机通过内网通讯;与外网通过NAT转换,变成外网合法ip。这样,将内网与外网隔离,各个网络有自己的ip,既可以重叠,又可以通过少数几个ip与外网通讯,在ip大量缺乏的现代,节省了很多。

转载于:https://my.oschina.net/u/143244/blog/304306

网络数据包发送接收全过程相关推荐

  1. 计算机无线连接无法发送数据,网络受限,无法正常上网,数据包发送接收正常,求高手支招...

    网络受限,无法正常上网,数据包发送接收正常,求高手支招 一开机就收到1500左右的数据包 网络受限制或无连接 求高手解答 外面租的房子,隔壁24小时开BT 迅雷 还有PPSTREAM之类的P2P 本来 ...

  2. Linux内核网络数据包发送(四)——Linux netdevice 子系统

    Linux内核网络数据包发送(四)--Linux netdevice 子系统 1. 前言 2. `dev_queue_xmit` and `__dev_queue_xmit` 2.1 `netdev_ ...

  3. Linux内核网络数据包发送(二)——UDP协议层分析

    Linux内核网络数据包发送(二)--UDP协议层分析 1. 前言 2. `udp_sendmsg` 2.1 UDP corking 2.2 获取目的 IP 地址和端口 2.3 Socket 发送:b ...

  4. Linux内核网络数据包发送(一)

    Linux内核网络数据包发送(一) 1. 前言 2. 数据包发送宏观视角 3. 协议层注册 4. 通过 socket 发送网络数据 4.1 `sock_sendmsg`, `__sock_sendms ...

  5. Linux网络 - 数据包的接收过程

    Linux网络 - 数据包的接收过程 嵌入式Linux中文站 嵌入式Linux中文站 微信号 emblinux 功能介绍 嵌入式Linux中文站提供专业嵌入式Linux开发技术资讯 Table of ...

  6. Linux内核网络数据包发送(三)——IP协议层分析

    Linux内核网络数据包发送(三)--IP协议层分析 1. 前言 2. `ip_send_skb` 3. `ip_local_out` and `__ip_local_out` 3.1 netfilt ...

  7. linux receive函数,Linux网络 - 数据包的接收过程

    的方式写入到指定的内存地址,该地址由网卡驱动分配并初始化.注: 老的网卡可能不支持DMA,不过新的网卡一般都支持. 3: 网卡通过硬件中断(IRQ)通知CPU,告诉它有数据来了 4: CPU根据中断表 ...

  8. Linux内核中网络数据包的接收-第一部分 概念和框架

    与网络数据包的发送不同,网络收包是异步的的.由于你不确定谁会在什么时候突然发一个网络包给你.因此这个网络收包逻辑事实上包括两件事: 1.数据包到来后的通知 2.收到通知并从数据包中获取数据这两件事发生 ...

  9. linux手动注入网络数据_Linux网络 - 数据包的接收过程

    本文将介绍在Linux系统中,数据包是如何一步一步从网卡传到进程手中的. 如果英文没有问题,强烈建议阅读后面参考里的两篇文章,里面介绍的更详细. 本文只讨论以太网的物理网卡,不涉及虚拟设备,并且以一个 ...

最新文章

  1. CodeForces 631D Messenger
  2. Oracle计算时间差表达式
  3. 使用TestNG-xslt+ant来美化selenium测试报告
  4. 2017模拟计算机考试试题,2017年计算机考试四级模拟试题及答案
  5. opencv findContuors 详解
  6. 如何给域里的每台电脑分配一个***远程访问IP地址
  7. 3DMAX 捕捉功能
  8. STM32智能小车第二章 PWM调速
  9. 3D打印经验分享导航
  10. 传奇私服服务器怎么增加npc,传奇新建NPC/npc修改功能/NPC修改模版
  11. 移动端网页点击链接出现蓝色背景如何解决
  12. Failed to start LSB: Kurento Media Server daemon. kurento-media-server 启动失败的解决办法
  13. 工具1:DNS隧道检测工具BotDAD
  14. java与设计模式-观察者模式
  15. 计算机系统原理实验之BombLab二进制炸弹1、2关
  16. Windows实现微信双(多)开—微信分身
  17. 显卡告别3D游戏迈向通用计算时代
  18. 校招/社招/秋招/春招求职指南
  19. android bea拷贝,从Android开发中学到一些东西
  20. 测试sd卡读写速度与判断是否是扩容的假货

热门文章

  1. 图解微软ReportBuilder3连接Sql Server 2008数据库表创建报表
  2. Linux上安装php
  3. python.day01笔记
  4. 【云计算】使用nsenter进入Docker容器进行调试
  5. c语言使用zlib实现文本字符的gzip压缩与gzip解压缩
  6. Call to undefined function mysqli_connect()
  7. mysql 重置root密码
  8. linux find 文件夹下查找字符串
  9. java robot 对象_用Java Robot对象实现服务器屏幕远程监视
  10. mysql打包备份数据到_thinkPHP使用pclzip打包备份mysql数据库的方法