网络连接过程 套接字 协议栈 的一些理解3
-
包的基础知识
TCP模块在执行连接,收发,断开各阶段的操作时,会委托IP模块将数据封装成包发送给通信对象。
-
包的构成:头部 + 数据,往分层模型下走,每一层都对上一层打包,将上一层数据包作为数据,加上自己这层协议的头部
-
包的传递:出了终端,发送端到接收端的过程是转发接力实现的,中转设备中有个表,按控制头信息中的目的地发往对应的设备,见下图:
客户端内IP协议通过给到的服务器IP地址写入IP头部,IP协议通过这一地址查找到包的传输方向,从而找到下一个路由器R1,然后IP协议会委托以太网协议将包传输过去,操作是将R1的MAC地址写入MAC头部,以太网协议就知道下一目的地了。
这里的以太网也可以替换成其他如无线局域网WLAN,ADSL,FTTH等其他通信技术,这里体现了分层上实现的解耦的灵活性。
-
-
包收发操作概览
-
TCP模块会在数据块前面加上TCP的头,传递给IP模块,与此同时,TCP将目的地IP地址给到IP模块。
-
IP模块接收委托后会将TCP模块的数据当作数据内容,再在前面添加IP头部(主要是起始目的地的IP地址)和MAC头部(主要是起始设备的MAC地址),这样包就封装好了。IP模块加了两个头。
-
再交给网卡,网卡转为电信号或光信号发送出去。
-
-
IP模块的打包过程
主要是起始地址的数据,IP头的起始IP地址,MAC头的起始MAC地址
-
通过本机的路由表,查到路由ip,拿到本地的出口网卡ip和出口网卡的MAC,IP头部就封装好了。
-
通过ARP,子网内通过路由ip查到路由MAC(当然有缓存就不用ARP,直接返回路由MAC),目的设备MAC就有了,把MAC头就封装好了。
问题:怎么以太网的MAC头部也在IP模块封装?
解释:如果在交给网卡之前就打好包,网卡就只要把包发出去就好了。网卡可以不管是IP包还是ARP包或是ICMP包,他只用执行发送操作。这样就实现了网卡可以支持各种类型的包。
-
-
以太网的类型
- 集线器:广播形式,消息来了整个子网都收到了,根据接收MAC头,不是自己的消息就丢弃了,是自己的消息就接收。
- 交换机:消息只发送给目标MAC地址,其他设备不会收到此消息。
-
IP包转为电信号
-
网卡驱动拿到IP模块封装的包,复制到网卡内的缓冲区,然后发送到MAC模块
-
MAC模块将包从缓冲区取出,并在开头加上报头和起始帧分解符,在末尾加上帧校验序列码
- 报头是为了确定包发送的信号频率
- 起始帧分界符(SFD)即标记这后面是数据包了
- 帧校验码(FCS)是为了检测数据是不是完整的,类似哈希算法,如果中间数据变了,计算出来的FCS与给的FCS对不上,表示数据错了。
-
将上面的数据从二进制转为电信号
101010……这样的二进制转为电信号就是电压电流的变化了,发送端发出了一个电磁波,接收端接收一个电磁波。
**问题:**面对一连串的01010111100的二进制转换而来的电信号,怎么确定每个比特间的界限。
如上图a,现实中是没有分隔虚线和101011……这些标识的,只有一条电磁波曲线,怎么能确定一个波峰中有多少个1,这就是界限的问题。
**解决:**就是发送时加了一条时钟信号(固定频率),如上图b。把这个界限按表中规则加了进去,得到了c。接收时,上面图2.24报头中记录的就是这段信号的时钟频率b,通过分析波形我们能得到b,所以通过 c 和 b,我们就能得到 a 了,再通过SFD,我们就拿到了数据包。再通过FCS就确定了数据包有没有损坏。
-