0%

计算机网络(一)

协议栈

指的是操作系统中的网络控制软件

套接字

套接字的实体就是通信控制信息,在协议栈的内部有一块专门用于存储控制信息的内存空间,具体是什么呢?通信对象的IP、端口号、通信状态等。协议栈是根据套接字中记录的控制信息来工作的。在终端使用netstat命令显示套接字内容

上图的每一行实际上就相当于一个套接字,拿一个具体的来说

1
TCP    192.168.101.101:53369  39.137.107.210:https   ESTABLISHED     11844

PID为11844的程序正在使用IP地址为192.168.101.101的网卡与IP地址为39.137.107.210的对象进行通信,http指代特定端口,53369是本机使用的端口。

通信操作中使用的控制信息分为两类。

(1)头部中记录的信息

(2)套接字(协议栈中的内存空间)中记录的信息

通信过程

创建套接字

创建套接字时,首先分配一个套接字所需的内存空间,然后向其 中写入初始状态。

连接服务器

创建套接字后,应用程序调用connect,随后协议栈将本地的套接字与服务器的套接字进行连接。这里的连接指的是通信双方交换控制信息。客户端会将IP地址和端口号等信息告知服务器。

连接的具体操作

1
connect(< 描述符 >, < 服务器 IP 地址和端口号 >, …)

客户端会创建一个包含表示开始数据收发操作的控制信息头部,其中最重点的部分是接收方和发送方的端口号。

随后头部的SYN会被设置为1表示连接。到此TCP头部创建好了,接下来TCP模块会将信息传递给IP模块。IP模块负责执行网络包的收发操作,网络包经IP模块通过网络到达服务器,服务器的IP模块将接收到的数据传递给TCP模块,服务器的TCP模块根据TCP头部信息找到端口号对应的套接字。接下来服务器的TCP模块工作流程和上述客户端工作流程相同。网络包到达客户端后会通过IP模块到达TCP模块,并通过头部信息确认连接是否成功,如果SYN为1则代表成功,这时会向套接字中写入服务器的IP地址和端口号等信息。

我们可以认为连接完毕后有一个管子将客户端和服务器的两个套接字连接起来了,往后通过这根管子收发数据。连接操作完成后控制流被交回到应用程序。

收发数据

连接完成后进入收发阶段。应用程序首先会调用write将要发送的数据交给协议栈,协议栈收到数据后执行发送操作。

协议栈并不是已收到数据就进行发送操作的,这样会产生大量的小网络包,导致网络效率下降。通常会累计一定的数据长度才会发送。说到长度,有两个比较重要的参数:

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

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

如果数据长度很大,则会被拆分会若干个块

确认信息是否到达

通过“序号”和“ACK 号”可以确认接收方是否收到了网络包。

ACK号:与头部相对距离。

断开并删除套接字

客户端应用程序调用close断开到戒子,结束数据收发操作。