Keen的博客

记录所思、所想、所遇

欢迎来到我的个人站~


网络是怎样连接的(二)- 协议栈、网卡

0 探索线路

jpg jpg

2 协议栈、网卡

围绕着“创建套接字 ——> 连接服务器 ——> 发送数据 ——> 接收数据 ——> 断开连接”来讲解

2.1 创建套接字

2.1.1 协议栈内部结构

jpg

浏览器、邮件等一般应用程序收发数据用TCP;
DNS查询等收发较短的控制数据用UDP。

IP层中包含ICMP协议(用于告知网络包传送过程中产生的错误以及各种控制消息)和ARP协议(用于根据IP地质查询相应的以太网MAC地址)

IP层以下是网卡驱动程序负责控制网卡硬件,更下面是网卡,对网线中的电或光信号执行发送和接收操作

2.1.2 套接字对于协议栈的作用

套接字实体,包含IP地址和端口号(源和目标),以及控制信息(包括是否收到响应、多长时间了、是否重试了等)。协议栈根据套接字存储的信息,判断下一步的行动。

windows中netstat命令,展示了所有套接字: jpg

2.1.3 调用socket时的操作

jpg

2.2 连接服务器

2.2.1 连接的含义

连接,就是客户端和服务器相互交换套接字控制信息(比如IP地址、端口号等)

2.2.2 控制信息头部

jpg TCP头部格式: jpg

2.2.3 连接操作的实际过程

(1)首先,客户机跟服务器需要交换控制信息(包括双方的IP地址端口号等),结束后,客户机的头部SYN比特置1。等待连接状态切换为正在连接状态
(2)服务器的SYN比特置1,ACK比特置1,回包给客户机
(3)当客户机收到服务器的套接字信息后,检查SYN是否为1,如果为1表示连接成功,正在连接状态切换为连接成功状态
(4)客户机将ACK置1,返回给服务器,告知对方已收到回包

2.3 收发数据

2.3.1 HTTP请求消息交给协议栈

上层应用通过write传递一段二进制序列给协议栈,协议栈不会立刻发送出去,而是将数据存放在内部的发送缓冲区中,并等待应用程序的下一段数据。当数据累积到一定量,才会进行发送。

累积数据的长度决定因素:
(1)MTU(最大传输单元)。在以太网中一般是1500 Bytes,包含包头长度。MSS(最大分段大小)是MTU-len(包头)
(2)时间。协议栈内部有一个计时器,达到这个时间后,即使包大小不到MTU,依旧发送
(3)应用程序可以指定选项:不等待填满缓冲区直接发送(浏览器一般是如此)
jpg

2.3.2 对较大的数据进行拆分

包太大,TCP会将包拆分成小包发送 jpg

2.3.3 使用ACK号确认网络包已收到

发送方说:“现在发送的是从第1字节开始的部分,一共有1460字节”
接收方回复说:“到第1461字节之前的数据,我已经都收到了”。ACK号是1461 jpg

数据双向传输:
jpg

连接操作 + 收发操作:
jpg

2.3.4 动态调整ACK号等待时间(超时时间)

TCP采用动态调整等待ACK号返回的方法,在数据发送过程中,持续测量ACK号返回时间。返回变慢,则增长等待时间;否则,缩短等待时间

2.3.5 使用窗口有效管理ACK号

一个简单的异步调用过程,在等待ACK号这段时间内,继续发送后续的一系列包。
一个问题:如果一直收不到ACK号,却依旧一直发送后续的包,会导致发送包频率超过接收方能处理能力的情况。 jpg

因此,需要采用滑动窗口的方式,来动态平衡发送和接收频率。具体做法:接收方需要告诉发送方自己最多能接收多少数据(比如此刻队列已快满了,最多能接收的数据就比较少),发送方根据这个大小来发送数据。 jpg

更新窗口大小的时机:接收方从缓冲区中取出数据给应用程序之后,需要告知发送方。通常会将ACK包和更新窗口大小的包合并在一起发送,会有一个等待时间,不是立刻发送,这样也可以省略中间过程。

2.3.7 接收HTTP响应请求

协议栈会检查收到的数据块和TCP头部的内容,判断是否有数据丢失,如果没有问题,则返回ACK号。然后将数据copy到应用程序内存

2.4 从服务器断开并删除套接字

2.4.1 数据发送完毕后断开连接

jpg

2.4.2 删除套接字

等待重传完毕后,才删除套接字,一般等待几分钟

2.4.3 TCP整体流程

jpg

2.5 IP与以太网的包收发操作

2.5.1 包的基本知识

jpg

其中以太网部分的MAC头,可以替换为无限局域网、ADSL、FTTH等头,代替以太网帮助IP协议来传输网络包。

jpg

2.5.2 生成包含接收方IP地址的IP头部

IP头部格式: jpg 协议栈内有一张IP表(路由表),由此路由表决定某个IP包应该选择哪个网卡发送。这个表是预先设定的,所以只要根据目标地址,协议栈就能自动选择使用哪个网卡发送数据包了。 jpg 浏览器中HTTP请求消息,都是通过TCP来传输的。

2.5.3 生成以太网用的MAC头部

实际在底层,以太网是通过MAC地址来定位当前主机和目标主机的。 jpg

2.5.4 通过ARP查询目标路由器的MAC地址

若需要发送以太网包到对方,是需要知道对方以太网包的MAC地址的。
在以太网中,可以通过广播方式,将包发给连在同一以太网的所有设备,ARP就是利用广播查询。 jpg 为防止漫天的ARP包在飞跃,协议栈缓存了ARP包结果。 jpg jpg

之所以采用MAC地址来作为以太网的真正寻址方式,是为了可扩展其他方式来发送网络包,而非只有IP寻址方式,比如IPv4和IPv6的不同编码都能转化为MAC地址发包。

2.5.5 以太网的基本知识

多态计算机能通信的技术,称为以太网。信号只会流到MAC地址指定的设备。以太网规定,两台设备之间的网线距离不能超过100米,这个距离内极少发生错误。 jpg

2.5.6 IP包转换成电或光信号发送出去

网卡中的ROM保存着全世界唯一的MAC地址,也有一些特殊的方法,网卡驱动模块从命令或配置中读取MAC地址。(难道不会与别人的MAC地址碰撞?) jpg

2.5.7 给网络包再加3个控制数据

主要是报头、起始帧分解符、末尾帧校验序列 jpg

2.5.8 向集线器或交换机发送网络包

集线器是半双工模式(需要首先判断网线中是否有其他设备发送的信号,避免信号碰撞)
交换机是全双工模式(发送和接收可以同时进行,不会发生碰撞)

2.5.9 接收返回包

网卡连接着扩展总线中的中断线,当包到达,会触发中断信号。中断信号通过中断控制器连接到CPU,CPU就会暂时挂起当前处理任务,切换到操作系统的中断处理程序,网卡在安装的时候,就分配了中断号(即插即用规范,自动分配中断号),与网卡驱动绑定,因此中断信号最后会分发到网卡驱动。
网卡驱动执行流程:
(1)通过MAC头部中的以太类型字段判断协议类型(大多数使用TCP/IP,还有NetWare中使用的IPX/SPX、Mac中使用的AppleTalk等)
(2)根据协议类型,分配到不同协议栈(例如IP协议,会交给TCP/IP协议栈;AppleTalk协议,就会交给AppleTalk协议栈)
(3)协议栈进一步解包后,决定交给哪一个应用程序

2.5.10 协议栈处理

TCP/IP协议栈处理过程:
(1)IP模块检查IP头部、确认格式正确;
(2)IP模块查看接收方IP地址,应该与客户端网卡的地址一致
(3)不是自己的IP时,IP模块会发送ICMP消息将错误告知发送方
(4)IP正确时,IP模块会将分片的原始包进行重组
(5)TCP模块会根据TCP头部中的接收方和发送方的端口号来查找对应的套接字
(6)TCP模块找到套接字后,会根据套接字中记录的通信状态,执行响应的操作(如果是数据包,则填充到缓冲区;如果是控制包,则返回响应控制包) jpg

2.6 UDP协议的收发操作

2.6.1 不需要重发的数据用UDP发送更有效

TCP会针对每一个小包进行出错校验重传,还会发送一堆建立连接和断开的控制包。而使用UDP,不需要重传。

2.6.2 适合使用UDP

(1)控制短数据
DNS查询之类的控制短数据,适合UDP。没有滑动窗口机制,也没有重传机制,遇到错误直接丢包。由应用程序检测错误,并决定重传。 jpg

(2)音频和视频数据
实时性要求高,发送不及时会导致卡顿,错过播放时机,重传机制意义不大。另外,缺少包问题也不大。

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少