《网络是怎样连接的》读书笔记 -2

第二章  协议栈、网卡

1 创建套接字

1.1 协议栈的内部结构

最上层是网络应用程序,也就是浏览器、电子邮箱客户端等,它们收发数据的操作是共通的

之后是Socket库,它的工作过程第一章有介绍

再之后是操作系统,包括协议栈。

协议栈的上半部分分为TCP协议收发数据部分和UDP协议收发数据部分

下半部分是IP协议控制网络包收发的部分,包括ICMP协议(告知网络包传输过程中的错误)以及ARP协议(用于查询IP地址对应的MAC地址)

最底层为网卡驱动程序以及网卡,负责完成实际的收发操作

1.2 配套字的实体是通信控制信息

协议栈内部有一块用于存放控制信息的内存空间(包括通信对象IP地址、端口号、通信操作的进行状态)

套接字记录了用于控制通信操作的各种控制信息,协议栈需要根据这些信息判断下一步行动

下图是windows的套接字内容:

1.3 调用socket时的操作

创建套接字阶段,应用程序调用socket申请创建套接字,协议栈根据应用程序的申请执行创建套接字的操作

协议栈首先分配用于存放套接字的内存空间。套接字刚创建时,数据收发操作还没有开始,需要再套接字内存空间内写入表示这一状态的控制信息

之后将套接字的描述符告知应用程序

收到描述符后,应用程序向协议栈进行收发数据委托时会使用这个描述符。描述符已经记录了通信双方的信息以及通信状态,只要确定了描述符,协议栈就可以知道相关的信息

2 连接服务器

2.1 连接是什么意思

套接字刚创建完成时,里面没有任何数据,无法得知通信对象,协议栈无法按照要求发送数据。因此需要将IP地址和端口号等信息输入给协议栈

服务器端也会创建套接字,并且应用程序也不知道通信对象是谁,所以需要客户端向服务器端告知必要信息

2.2 负责保护控制信息的头部

控制信息可以大致分为两类:

第一类时客户端与服务器相互联络时交换的控制信息。

这些信息不仅连接时需要,数据收发和断开操作在内的其他通信过程也需要

这些信息会被添加再客户端与服务器之间传递的网络包开头,因此被称为TCP头部

第二类是保存在套接字中,用来控制协议栈操作的信息。应用程序传来的信息和从通信对象接收到的信息、收发数据操作的执行状态都会保存在这里。

2.3 连接操作的实际过程

应用程序提供服务器IP地址和端口号给TCP模块。之后TCP模块会与服务器的TCP模块交换控制信息,包含以下步骤:

客户端先创建一个包表示开始数据收发操作的控制信息头部,从而找到服务器的套接字

之后将头部的控制位SYN设置为1,并设置适当的序号和窗口大小

TCP头部创建好后会将信息传递给IP模块并委托它进行发送,之后服务器收到网络包并进行相关处理,将网络包返回到客户端,通过IP模块抵达TCP模块,TCP模块识别SYN是否为1判断连接是否成功,这时回想套接字写入服务器的IP地址、端口号等信息(之前套接字中并不包含这些信息)

最后将ACK比特设置为1并返回服务器,告诉服务器刚才的响应已经收到。

3 收发数据

3.1 将HTTP消息传递给协议栈

协议栈不关心应用程序传来的数据是什么内容

协议栈在收到数据后会将数据放在内部的缓冲区并等待应用程序的下一段数据。

如果一收到数据就发送会发送大量的小包,具体积累多少再发送根据操作系统有所不同

MTU:一个网络包的最大长度,以太网中一般为1500字节

MSS:去除头部后,一个网络包能容纳的TCP数据最大长度

协议栈综合判断时间和数据长度来决定何时发送

3.2 对较大的数据进行拆分

如果发送缓存区的数据超过MSS长度,则以MSS长度为单位进行数据拆分,拆分的数据块放入单独网络包中,并在每块数据前加上TCP头部

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

TCP在发送数据时会将每一块数据在完整数据中的开始位置写在在TCP头部,接收方还会计算数据块的长度,通过这些信息接收方可以知道数据有没有遗漏,并将已经接收了多少字节写入TCP头部的ACK号发送给发送方。通过这个方式,发送方可以确认对方是否接收完整数据。

实际通信中,序号是以一个随机数开始的,开始发送时会将SYN设置为1并发送给服务器,目的就是将序号的初始值高速服务器

实际工作过程如图所示:

通过这一机制,可以确认双方是否接收到了某个包,如果没有收到就重发

3.4 根据网络包的平均往返时间调整ACK号等待时间

当网络繁忙时ACK返回变慢,需要将等待时间延长,如果等待时间太长,包重传会有很大的延迟,导致网速变慢

为此TCP采取了动态调整等待时间的方法,根据ACK返回号的所需时间来调整等待时间

3.5 使用窗口有效管理ACK号

为了增大传输效率,TCP采用华东窗口的方式来管理数据发送和ACK号的操作。即在发送一个包后不等ACK号返回就直接发后续的包

如果采用滑动窗口的方法,可能会出现发送包的频率超过接收方处理能力的情况,可通过下面的方式避免:

首先接收方告知发送方自己最多能接收多少数据,然后发送方根据这个值对数据的发送进行控制。即发送方通过TCP头部的窗口字段将可接受的收发量告知对方

3.6 ACK与窗口合并

更新窗口大小的时机时接收方从缓存区去除数据传递给应用程序的时候

ACK号的更新实际时接收方收到数据的时候,如果确认内容无问题就要返回ACK号

如果每收到一个包就回复ACK号和窗口大小,会导致接受方给发送方的包大小太多

因此接收方在发送ACK号和窗口号时会等待一段时间,在此期间可能出现其他通知可以合并到一起发运

3.7 接收HTTP响应消息

对于服务器的响应消息,浏览器需要接收操作,这一操作也需要协议栈参与

首先协议栈会尝试从接收缓存区取数据传递给应用程序,但此时响应消息还没有返回,因此接收缓存区没有数据,此时协议栈会将此工作暂时挂起,等数据返回后在执行接收操作

协议栈接收数据的大致过程:首先检查TCP头部的内容,判断有没有数据丢失,没有会ACK号,将数据块暂存在接收缓冲区中,并将数据块按顺序连接还原成原始数据,最后将数据交给应用程序。

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

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

数据发送完毕的一方会发起断开过程,不同的应用程序会选择不同的断开时间

协议栈允许任何一方先发起断开流程

以服务器一方发起断开过程为例:

首先,服务器使用Socket库的close程序。然后,服务器的协议栈会生成包含断开信息的TCP头部,即将FIN设置为1。之后协议栈委托IP模块向客户端发送数据,同时服务器的套接字会记录下断开操作的相关信息。

当客户端收到服务器发来的FIN为1的TCP头部后,客户端的套接字会将操作状态设置为断开操作状态,并向服务器端返回一个ACK号,之后等待应用程序来取数据。此时应用程序会调用close来结束数据的收发操作,这是客户端也会生成FIN为1的TCP包,委托IP将其发送给服务器。一段时间后服务器返回ACK号,通信结束。

4.2 删除套接字

为了防止误操作,通信结束后套接字不会被立刻删除,而是会等待一段时间

误操作的例子:

客户端返回的ACK号丢失,服务器会重发一次FIN,此时如果客户端套接字删除,那么如果新的套接字被分配了之前的端口号,此时FIN正好送达,新套接字会执行断开操作

由于包重传的操作大致要几分钟,因此一般等待几分钟后删除套接字

TCP的整体流程见下图:

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

5.1 包的基本知识

包由头部和数据两部分构成,头部包含目的地址等信息

发送方的网络设别会负责创建包,创建包的过程就是生成含有正确控制信息的头部,然后再附加上要发送的数据,之后包会被发往最近的网络转发设备,网络转发设备会根据头部的信息判断是要发往哪里。此过程使用了一张表,记录了每一行地址需要发往的方向。

路由器更具目标地址判断下一个路由器的位置

集线器在子网中将网络包传输到下一个路由

IP协议根据目标地址判断下一个IP转发设别的位置

子网中的以太网协议将包传输到下一个转发设备

TCP/IP包包含以下两个头部:

MAC头部:用于以太网协议

IP头部:用于IP协议

这两种头部具有不同的作用:

发送方将服务器的IP地址写入IP头部,IP协议委托以太网协议将包传输过去。此时IP协议会查找下一个路由器的MAC地址并将此地址写入MAC头部,这样以太网协议知道要把包发到哪个路由器

网络的传输过程会经过集线器,集线器中有一张表根据MAC地址来查出响应的传输方向

之后包会到达路由器,路由器中有一张IP协议表,根据IP地址查出要发往哪个路由器。并且还需要将下一个路由器的MAC地址写入头部

5.2 包收发操作概览

包收发的起点时TCP模块委托IP模块发送包的操作。收到委托后,IP模块会在包的前面加上包含控制信息的头部。

IP头部包含IP协议规定的、根据IP地址将包发送到目的地需要的控制信息

MAC头部包含通过以太网的局域网将包运输至最近的路由器需要的控制信息

之后封装好的包会传递给网卡,网卡将数字信号转换为电信号或者光信息,通过网线或者光纤发送出去

接收包的过程与发送的过程相反,网卡将信号转换成数字信号并传递给IP模块,IP模块将IP头部后的内容传递给TCP模块

不同于TCP模块,IP模块的收发操作都是相同的。

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

IP头部的接收方IP地址填写通信对象的IP

发送方IP地址需要判断发送使用的网卡,并填写该网卡的IP地址

判断该把包交给哪块网卡的方法:

协议栈的IP模块和路由器中负责转发的部分都是根据IP协议进行包收发操作的,因此它们判定把包发送给谁的方法是一致的:使用路由表

之后还需要填写协议号  TCP:06  UDP:17

5.4 生成以太网用的MAC头部

以太网在判断包目的地址时会使用MAC头部,包含了接收方和发送方MAC头部等信息

接收方MAC地址的确定方式:通过ARP查询目标路由器的MAC地址

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

ARP利用广播的方法查询,通过IP地址查询MAC地址

如果对方和自己在一个子网中,通过上述操作就可以得到MAC地址

为减少ARP包,开辟ARP缓存,广播前先查询缓存,为了防止IP变化,缓存会定期删除

5.6 以太网的基本知识

5.7 将IP包转换为电/光信号发送出去

网卡的内部结构如图所示:

和其他硬件一样,网卡需要初始化。启动操作系统后,驱动程序会对网卡完成初始化

网卡的ROM中保存全世界唯一的MAC地址,在初始化时生效

5.8 给网络包添加3个控制数据

网卡驱动从IP模块获取包后,将其复制到网卡缓冲区,之后向MAC模块发送发送包命令

MAC模块将包从缓冲区去除,在开头加上报头和起始帧分界符,在末尾增加用于检测错误的FCS

报头的作用时确定包的读取时机,起始帧分界符表示包起始位置

FCS用来检测包传输过程中内容是否出错,是一串32bit的序列,通过公式对包的所有内容进行计算得来,如果接收方计算出的FCS和发送方发出的FCS不同,则判定数据有误

5.9 向集线器发送网络包

发送模式分为:全双工和半双工

半双工模式需要避免信号碰撞,所以会判断网线中是否存在其他设备在发送信号,在集线器中使用

全双工模式在交换机中使用,之后介绍

网卡的MAC模块生成通用信号,由PHY(MAU)模式转换成可在网线中传输的格式,并通过网线发送出去

5.10 接收返回包

将信号全部接收 -》 通过报头的波型同步时钟,遇到起始帧分界符号后将后面的信号转换成数字信号 -》转换完成后检测FCS,不一致就丢包 -》 比对MAC地址是否相同 -》 如果一致就将包放入缓冲区中 -》网卡通知计算机收到一个包

5.11 将服务器的响应包从IP传递给TCP

假设WEB返回一个网络包 -》 网卡驱动将其交给TCP/IP进行处理 -》 检查IP头部 -》 查看接收方IP,确认接收方IP地址与客户端网卡地址是否一致 (如果不是则通过ICMP消息告知发送方)-》检测IP是否分片并重组 -》交给TCP模块进行后续处理

6 用UDP协议收发数据操作

6.1 不需要重发的数据用UDP更加高效

向DNS查询时用的就是UDP协议

为了实现可靠性,需要确认对方是否收到了发送的数据,如果没有发到还要重发一遍,所以会使用TCP协议

当数据很短时,即使没有TCP机制,也可以高效重发数据

6.2 控制用的短数据

6.3 音频和视频数据

由于音频和视频数据必须短时间内送达,并且缺失一些信息并不会有严重问题,所以使用UDP会效率更高

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值