你好,这是《网络是怎样连接的》的第3篇读书笔记,第二章《用电信号传输TCP/IP》后半部分:IP与以太网的包收发操作。
先看下经典的TCP/IP四层模型:

通常,下层模块支撑上层应用,也就是说网络互联层IP模块向上支撑传输层的TCP和UDP应用,或者说TCP应用调用IP模块实现数据收发。
 
1.包的收发 
TCP模块在执行连接、收发、断开等各阶段操作时,都需要委托IP模块将数据封装成包发送给通信对象。包包括头部和数据两部分,头部包含目的地址等控制信息,可以理解为快递包裹的面单,头部的后面就是要发送给对方的数据,相当于快递包裹里面的货物。

IP模块发送包的时候,会添加两个头部: 
1)MAC头部:以太网用的头部,包含接收方的MAC地址;
2)IP头部:IP用的头部,包含接收方的IP地址。

2.IP头部:包含接收方IP地址
IP模块接收TCP模块的委托,负责包的收发工作,首先会生成IP头部附加在TCP头部的前面,IP头部包含的内容如下所示:

IP头部的“接收方IP地址”填写通信对象的IP地址,发送方IP地址需要判断发送所使用的网卡,并填写网卡的IP地址。
如果计算机有多个网卡,怎么决定由哪个网卡发送呢?看完下图,你就明白了。

 
3.MAC头部:基于以太网 
IP模块在生成IP头部之后,会在它前面添加MAC头部,MAC头部是以太网使用的头部,包含了接收方和发送方的MAC地址等信息。

在以太网中,有一种叫做广播的方法,刻意把包发给连接在同一以太网中的所有设备。ARP就是利用广播对所有设备提问:“XX这个IP是谁的?如果是你的,请把你的网卡MAC地址告诉我。”然后就会收到目标IP的回答:“这个IP地址是我的,我的MAC地址是XXXX。”

 
4.将包转成电信号或者光信号发出去 
IP生成的网络包只是存放在内容中的一串数字信息,没有办法直接发送给对方。因此,我们需要将数字信息交给网卡转换为电信号或者光信号,才能在网上传输。

网卡驱动从IP模块取包之后,会将其复制到网卡的缓冲区,然后向MAC模块发送发送包的指令。MAC模块将包从缓冲区取出,并在开头记上报头和起始帧分界符,在末尾加上用于检测错误的FCS(帧校验序列)。

最后,在数据信号之外再发送一组用来区分比特间隔的时钟信号,把数据信号和时钟信号叠加后发送出去。接收方检测到时钟信号周期变化,采用和发送数据叠加过程相反的方式从数据信号中读取相应的电压和电流值,将其转换成为0、1。

5.接收返回包传给TCP 
接收操作的第一步是不管什么信号全部收进来再说,然后,通过报头的波形同步时钟,然后遇到起始帧分界符时开始将后边的信号转换成数字信息。这个操作和发送时刚好相反,PHY模块先开始工作,然后再轮到MAC模块。 
首先,PHY模块会将信号转换成通用格式并发送给MAC模块,MAC模块在从头开始将信号转为数字信息,存放到缓冲区。当到达信号的末尾时候还需要检查FCS,如果是错误报直接丢弃。如果FCS没有问题,接下来就看一下MAC头部中接收方MAC地址与网卡的MAC地址是否一致,以判断是否是自己的,如果不是则直接丢弃。如果是自己的,则将包放入缓冲区,接下来网卡会通知计算机收到了一个包。 
通知采用中断机制 。首先,网卡向扩展总线中的中断信号线发送信号,该信号线通过计算机中的中断控制器连接到CPU。当产生中断信号时,CPU会暂时挂起正在处理的任务,切换到操作系统中的中断处理程序。然后,中断处理程序会调用网卡驱动执行相应的接收操作。 
IP模块先开始工作,第一步是检查IP头部,如果接收方IP地址和网卡的地址一致,检查确认之后就可以接收这个包了。IP模块工作结束后,接下来包会交给TCP模块,TCP模块会根据IP头部中的接收方和发送方IP地址,以及TCP头部中的接收方和发送方端口号来查找对应的套接字。找到对应的套接字之后,就可以根据套接字中记录的通信状态执行相应操作。如果包的内容是应用程序数据,则返回确认接收的包,并将数据放入缓冲区,等待应用程序来读取;如果是建立或者断开连接的控制包,则返回相应的响应控制包,并告知应用程序建立和断开连接的操作状态。
 

IP与以太网的包收发操作的更多相关文章

  1. TCP/IP协议的数据传输过程详解——IP与以太网的包收发操作

    MTU:一个网络包的最大长度,以太网中一般是1500字节:(含有头部长度,包括IP头部,TCP头部,不包括MAC头部) MSS:除去头部后,一个网络包所能容纳的TCP的数据的最大长度 下图为TCP/I ...

  2. 在 shell 脚本获取 ip、数字转换等网络操作

    在 shell 脚本获取 ip.数字转换等网络操作 ip 和数字的相互转换 ip转换为数字 :: function ip2num() { local ip=$1 local a=$(echo $ip ...

  3. 标准的TCP/IP工业以太网-EtherNet/IP

    标准的TCP/IP工业以太网-EtherNet/IP                            徐智穹以太网具有传输速度高.兼容性好.应用广泛等方面的优势,支持几乎所有流行的网络协议,其中 ...

  4. 网络数据包收发流程(四):协议栈之packet_type

    进入函数netif_receive_skb()后,skb正式开始协议栈之旅.先上图,协议栈大致过程如下所示:跟OSI七层模型不同,linux根据包结构对网络进行分层.比如,arp头和ip头都是紧跟在以 ...

  5. 网络数据包收发流程(三):e1000网卡和DMA

    一.硬件布局每个网卡(MAC)都有自己的专用DMA Engine,如上图的 TSEC 和 e1000 网卡intel82546.上图中的红色线就是以太网数据流,DMA与DDR打交道需要其他模块的协助, ...

  6. js获取访问IP、地区、、当前操作浏览器

    js获取IP.地区.当前操作浏览器有什么用呢? 我的回答是用处很多,比如现在的异地登录和对用户常用浏览器做数据分析等. 源代码如下:index.html <!DOCTYPE html> & ...

  7. mysql设置指定ip访问,用户权限相关操作

    基础语法GRANT priv_type ON database.table TO user[IDENTIFIED BY [PASSWORD] 'password'] [,user [IDENTIFIE ...

  8. 网络数据包收发流程(二):不配置NAPI的情况

    一.no NAPI 数据结构不配置NAPI的时候,网络设备不使用自己的napi_struct结构,所有网络设备驱动都使用同一个napi_struct,即cpu私有变量__get_cpu_var(sof ...

  9. Python 第九篇:队列Queue、生产者消费者模型、(IO/异步IP/Select/Poll/Epool)、Mysql操作

    Mysql操作: grant select,insert,update,delete on *.* to root@"%" Identified by "123456&q ...

随机推荐

  1. OpenCV:Adaboost训练时数据扩增

    更准确的模型需要更多的数据,对于传统非神经网络机器学习方法,不同的特征需要有各自相符合的数据扩增方法. 1.   在使用opencv_traincascade.exe 过程中,图像读取在 classi ...

  2. AI不与人为敌

    业界广为流传着一句话:有多少人工就有多少智能. 其实还应该有一句话:有多少付出就因该有多少回报.公正是世界永恒的话题. 一.人工智能还是人工愚蠢 科技从来没有善恶,也不会杀人,愚蠢的人比聪明的人做的错 ...

  3. Java:Java 队列的遍历

    Java队列到底有没有可以遍历的功能呢?暂且试一下吧 参考链接:stl容器遍历测试 1.LinkedList实现简单遍历 for(Iter =LocTimesSerials.size()-1; iSe ...

  4. 【sqli-labs】 less42 POST -Error based -String -Stacked(POST型基于错误的堆叠查询字符型注入)

    Forgot your password? New User click here? 看源码,可以发现和less 24不同的一点在于password字段没有进行转义处理 那就对password字段进行 ...

  5. Git更新代码

    此次更新,创建新的文件与文件夹,并且删除了原有文件 通过“git status” 命令查看当前变更.通过变更信息可以看出,删除了test_case.py文件.这个删除只是在项目目录下进行删除,Git对 ...

  6. 前端工具gulp2

    var gulp = require('gulp'); var less = require('gulp-less'); var htmlmin = require('gulp-htmlmin'); ...

  7. MySQL创建临时表

    drop TEMPORARY table if EXISTS temp_table; create TEMPORARY table temp_table( id int not null, usern ...

  8. 利用python暴力破解压缩文件密码

    import randomimport sysimport zipfileimport timefrom threading import Threadfrom multiprocessing imp ...

  9. Font Awesome使用方法

    Font Awesome(中文站点)是一套为Bootstrap而创造的图标字体库及CSS框架,在业界享有盛誉. FA包含了常规web开发所需要用到的几乎所有图标,并且免费授权使用,只需要下载即可.所有 ...

  10. 洛谷 P1383 codevs 3333 高级打字机

    题目描述 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序,支持如下3种操作: 1.T x:在文章末尾打下一个小写字母x.(t ...