网站服务器对接要多长时间6,【网络是怎样连接的】第6章 - 请求到达web服务器,响应返回浏览器(2)...

本文详细阐述了服务器接收网络包的过程,从网卡接收电信号并转换为数字信息,到通过中断机制通知CPU,再到TCP/IP协议栈处理IP模块和TCP模块的接收操作。在TCP模块中,介绍了连接包的处理,包括确认SYN标志、检查端口号、创建套接字副本等步骤,以及数据包的处理,涉及套接字匹配、数据拼接、ACK确认等环节。最后提到了TCP断开操作的步骤,包括双方发起断开及确认过程。
摘要由CSDN通过智能技术生成

6.2 服务器的接收操作

5e7e201a7ce8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

图6.7 服务器的工作过程.png

网卡将接收到的信号转换成数字信息

到达服务器的网络包其本质是电信号或者光信号,接收信号的过程和客户端是一样的。

接收操作的第一步是网卡接收到信号,然后将其还原成数字信息。局域网中传输的网络包信号是由1和0组成的数字信息与用来同步的时钟信号叠加而成的,因此只要从中分离出时钟信号,然后根据时钟信号进行同步,就可以读取并还原出1和0的数字信息了。

服务器接收电信号的过程和客户端发送的过程相反,是从模拟信息转换为数字信息。

网卡的MAC模块将网络包从信号还原为数字信息,校验FCS并存入缓冲区。

在这个过程中,服务器的CPU并不是一直在监控网络包的到达,而是在执行其他的任务,因此CPU并不知道此时网络包已经到达了。但接下来的接收操作需要CPU来参与,因此网卡需要通过中断将网络包到达的事件通知给CPU。

接下来,CPU就会暂停当前的工作,并切换到网卡的任务。然后,网卡驱动会开始运行,从网卡缓冲区中将接收到的包读取出来,根据MAC头部的以太类型字段判断协议的种类,并调用负责处理该协议的软件。这里,以太类型的值应该是表示IP协议,因此会调用TCP/IP协议栈,并将包转交给它。

网卡驱动会根据MAC头部判断协议类型,并将包交给相应的协议栈。

IP模块的接收操作

协议栈的IP模块会检查IP头部,(1)判断是不是发给自己的;(2)判断网络包是否经过分片;(3)将包转交给TCP模块或UDP模块。

TCP模块如何处理连接包

当TCP头部中的控制位SYN为1时,表示这是一个发起连接的包(图6.7①)。这时,TCP模块会执行接受连接的操作,不过在此之前,需要先检查包的接收方端口号,并确认在该端口上有没有与接收方端口号相同且正在处于等待连接状态的套接字。如果指定端口号没有等待连接的套接字,则向客户端返回错误通知的包。

如果存在等待连接的套接字,则为这个套接字复制一个新的副本,并将发送方IP地址、端口号、序号初始值、窗口大小等必要的参数写入这个套接字中,同时分配用于发送缓冲区和接收缓冲区的内存空间。然后生成代表接收确认的ACK号,用于从服务器向客户端发送数据的序号初始值,表示接收缓冲区剩余容量的窗口大小,并用这些信息生成TCP头部,委托IP模块发送给客户端。

这个包到达客户端之后,客户端会返回表示接收确认的ACK号,当这个ACK号返回服务器后,连接操作就完成了。

这时,服务器端的程序应该进入调用accept的暂停状态,当将新套接字的描述符转交给服务器程序之后,服务器程序就会恢复运行。

如果收到的是发起连接的包,则TCP模块会(1)确认TCP头部的控制位SYN; (2)检查接收方端口号;(3)为相应的等待连接套接字复制一个新的副本;(4)记录发送方IP地址和端口号等信息。

TCP模块如何处理数据包

接下来我们来看看进入数据收发阶段之后,当数据包到达时TCP模块是如何处理的(图6.7②)。

首先,TCP模块会检查收到的包对应哪一个套接字。在服务器端,可能有多个已连接的套接字对应同一个端口号,因此仅根据接收方端口号无法找到特定的套接字。这时我们需要根据IP头部中的发送方IP地址和接收方IP地址,以及TCP头部中的接收方端口号和发送方端口号共4种信息,找到上述4种信息全部匹配的套接字。

找到4种信息全部匹配的套接字之后,TCP模块会对比该套接字中保存的数据收发状态和收到的包的TCP头部中的信息是否匹配,以确定数据收发操作是否正常。具体来说,就是根据套接字中保存的上一个序号和数据长度计算下一个序号,并检查与收到的包的TCP头部中的序号是否一致。如果两者一致,就说明包正常到达了服务器,没有丢失。这时,TCP模块会从包中提出数据,并存放到接收缓冲区中,与上次收到的数据块连接起来。这样一来,数据就被还原成分包之前的状态了。

当收到的数据进入接收缓冲区后,TCP模块就会生成确认应答的TCP头部,并根据接收包的序号和数据长度计算出ACK号,然后委托IP模块发送给客户端。

收到的数据块进入接收缓冲区,意味着数据包接收的操作告一段落了。接下来,应用程序会调用Socket库的read(图6.7③)来获取收到的数据,这时数据会被转交给应用程序。如果应用程序不来获取数据,则数据会被一直保存在缓冲区中,但一般来说,应用程序会在数据到达之前调用read等待数据到达,在这种情况下,TCP模块在完成接收操作的同时,就会执行将数据转交给应用程序的操作。

然后,控制流程会转移到服务器程序,对收到的数据进行处理,也就是检查HTTP请求消息的内容,并根据请求的内容向浏览器返回相应的数据。这一部分已经超出了TCP模块的范围,我们将在稍后探索服务器程序内部时进行介绍。

收到数据包时,TCP模块会(1)根据收到的包的发送方IP地址、发送方端口号、接收方IP地址、接收方端口号找到相对应的套接字;(2)将数据块拼合起来并保存在接收缓冲区中;(3)向客户端返回ACK。

TCP模块的断开操作

当数据收发完成后,便开始执行断开操作。这个过程和客户端是一样的,让我们简单复习一下。

在TCP协议的规则中,断开操作可以由客户端或服务器任何一方发起,具体的顺序是由应用层协议决定的。Web中,这一顺序随HTTP协议版本不同而不同,在HTTP1.0中,是服务器先发起断开操作。

这时,服务器程序会调用Socket库的close, TCP模块会生成一个控制位FIN为1的TCP头部,并委托IP模块发送给客户端。当客户端收到这个包之后,会返回一个ACK号。接下来客户端调用close,生成一个FIN为1的TCP头部发给服务器,服务器再返回ACK号,这时断开操作就完成了。HTTP1.1中,是客户端先发起断开操作,这种情况下只要将客户端和服务器的操作颠倒一下就可以了。

无论哪种情况,当断开操作完成后,套接字会在经过一段时间后被删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值