你好,这是《网络是怎样连接的》的第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头部中的接收方和发送方端口号来查找对应的套接字。找到对应的套接字之后,就可以根据套接字中记录的通信状态执行相应操作。如果包的内容是应用程序数据,则返回确认接收的包,并将数据放入缓冲区,等待应用程序来读取;如果是建立或者断开连接的控制包,则返回相应的响应控制包,并告知应用程序建立和断开连接的操作状态。
 

最新文章

  1. Spring Trasnaction管理(3)- 事务嵌套
  2. Tomcat 内存溢出对应解决方式
  3. android Log 等级以及在Android Studio 的Logcat中过滤方法
  4. 【BZOJ】【1855】【SCOI2010】/【HDOJ】【3401】股票交易
  5. dojo 三 类和继承 dojo/_base/declare
  6. 1015: [JSOI2008]星球大战starwar - BZOJ
  7. sublime text 使用
  8. hdoj1754 I Hate It【线段树区间最大值维护+单点更新】
  9. WPF 自定义 MessageBox (相对完善版)
  10. 5分钟快速入门 - Less
  11. VC获取并修改计算机屏幕分辨率
  12. java中 & ^ ~ 的运算
  13. date、sleep和usleep命令
  14. pandas数据清洗策略1
  15. git 包教包会
  16. 【Dalston】【第五章】API服务网关(Zuul) 上
  17. Iterator 与ListIterator的区别
  18. lamp安装总结
  19. Django模板变量的使用
  20. 《Python》 生成器和列表推导式

热门文章

  1. Java_Web之JSTL和EL
  2. css3基础篇二
  3. google浏览器 打印A4 最大宽度和高度px
  4. Python中join函数和os.path.join用法
  5. Vue2 封装的 Quill 富文本编辑器组件 Vue-Quill-Editor
  6. android studio: 为现有项目添加C++支持
  7. scrapy爬虫--10分钟入门
  8. Vue select默认选中第一个
  9. eas之dep的前置脚本和后置脚本
  10. python 各个地方导航(方便查询,持续更新!)