服务器的接受操作
作者:互联网
网卡将接收到的信号转化成数字信息
网卡接收到信号,将其转化为数字信息
- 信号的格式随传输速率的不同而不同
- 根据包末尾的帧校验序列(FCS)来校验错误,然后与包末尾的FCS值进行比较,如果两者不一致,则可能是因为噪声等影响导致信号失真,数据产生了错误,这时接收的包是无效的,因此需要丢弃。
- 检查MAC头部中的接收方MAC地址,看看这个包是不是发给自己的。以太网的基本工作方式是将数据广播到整个网络上,只有指定的接收者才接收数据,如果接收者不是自己,那么需要丢弃这个包。
- 网卡通过中断将网络包到达的事件通知给CPU
- CPU会暂停当前的工作,并切换到网卡的任务。网卡驱动会开始运行,从网卡缓冲区中将接收到的包读取出来,根据MAC头部的以太类型字段判断协议的种类,并调用负责处理该协议的软件。这里,以太类型的值应该是表示IP协议,因此会调用TCP/IP协议栈,并将包转交给它。
IP模块的接收操作
- 检查IP头部:IP模块首先会检查IP头部的格式是否符合规范,然后检查接收方IP地址,看包是不是发给自己的。当服务器启用类似路由器的包转发功能时,对于不是发给自己的包,会像路由器一样根据路由表对包进行转发
- 检查IP头部的协议号字段。如果协议号为06(十六进制),则将包转交给TCP模块;如果是11(十六进制),则转交给UDP模块。
TCP如何处理连接包
- 当TCP头部中的控制位SYN为1时,表示这是一个发起连接的包,TCP模块会执行接受连接的操作,需要先检查包的接收方端口号,并确认在该端口上有没有与接收方端口号相同且正在处于等待连接状态的套接字。如果指定端口号没有等待连接的套接字,则向客户端返回错误通知的包。
- 如果存在等待连接的套接字,则为这个套接字复制一个新的副本,并将发送方IP地址、端口号、序号初始值、窗口大小等必要的参数写入这个套接字中,同时分配用于发送缓冲区和接收缓冲区的内存空间。然后生成代表接收确认的ACK号,用于从服务器向客户端发送数据的序号初始值,表示接收缓冲区剩余容量的窗口大小,并用这些信息生成TCP头部,委托IP模块发送给客户端
- 这个包到达客户端之后,客户端会返回表示接收确认的ACK号,当这个ACK号返回服务器后,连接操作就完成了。
- 服务器端的程序应该进入调用accept的暂停状态,当将新套接字的描述符转交给服务器程序之后,服务器程序就会恢复运行。
TCP模块如何处理数据包
- TCP模块会检查收到的包对应哪一个套接字。根据IP头部中的发送方IP地址和接收方IP地址,以及TCP头部中的接收方端口号和发送方端口号共4种信息,找到上述4种信息全部匹配的套接字。
- 根据套接字中保存的上一个序号和数据长度计算下一个序号,并检查与收到的包的TCP头部中的序号是否一致。如果两者一致,就说明包正常到达了服务器。TCP模块会从包中提出数据,并存放到接收缓冲区中,与上次收到的数据块连接起来。
- 当收到的数据进入接收缓冲区后,TCP模块就会生成确认应答的TCP头部,并根据接收包的序号和数据长度计算出ACK号,然后委托IP模块发送给客户端
- 程序会调用Socket库的read来获取收到的数据
- TCP模块在完成接收操作的同时,就会执行将数据转交给应用程序的操作。
- 检查HTTP请求消息的内容,并根据请求的内容向浏览器返回相应的数据。
TCP模块的断开操作
- 在TCP协议的规则中,断开操作可以由客户端或服务器任何一方发起。在HTTP1.0中,是服务器先发起断开操作。
- 服务器程序会调用Socket库的close, TCP模块会生成一个控制位FIN为1的TCP头部,并委托IP模块发送给客户端。当客户端收到这个包之后,会返回一个ACK号。接下来客户端调用close,生成一个FIN为1的TCP头部发给服务器,服务器再返回ACK号。
- 当断开操作完成后,套接字会在经过一段时间后被删除。
标签:IP,TCP,模块,操作,服务器,接受,接收,接字,客户端 来源: https://blog.csdn.net/AnitaSun/article/details/117394321