之前探索了了生成HTTP请求消息、委托操作系统发送消息等步骤。接下来将研究操作系统中的
协议栈是如何处理数据发送请求的。这里先简单介绍下主要内容。创建套接字
从应用程序收到委托后,协议栈通过TCP协议收发操作的数据可以分成4个阶段。首先是创建套接字,在这个阶段,我们将介绍协议栈的内部结构、套接字的字体,以及创建套接字的过程。
目的就是为了解套接字是到底是什么样的一个东西。
协议栈是根据套接字中记录的控制信息来工作的。 创建套接字时,首先分配一个套接字所需的内存空间,然后向其中写入初始状态。
![网络是怎样连接的 -- 用电信号传输TCP/IP数据(概述)](http://p2.ttnews.xyz/loading.gif)
连接服务器
接下来是客户端套接字向服务器套接字进行连接的阶段。
“连接”具体是进行怎样的操作,在这个过程中协议到底是如何工作的。以及客户端与服务器是如何进行交互的。
通信操作中使用的控制信息分为两类 (1)头部中记录的信息 (2)套接字(协议栈中的内存空间)中记录的信息 连接操作的第一步是在TCP模块处创建表示连接控制信息的头部 通过TCP头部中的发送方和接收方端口号可以找到要连接的套接字
![网络是怎样连接的 -- 用电信号传输TCP/IP数据(概述)](http://p2.ttnews.xyz/loading.gif)
收发数据
两端的套接字完成连接之后,就进入收发消息的阶段。
在这个阶段,协议栈会将从应用程序收到的数据切成小块并发送给服务器,考虑到通信过程中可能会出错导致网络包丢失,协议栈还需要确认切分出的每个包是否已经送到服务器,对于没有送达的包要重新发送一次。
通过“序号”和“ACK号”可以确认接收方是否收到了网络包。
从服务器断开连接并删除套接字
断开操作的本质是当消息收发完成后客户端和服务器相互确认的过程,但这个过程并不只是相互确认并删除套接字那么简单。
如果接收缓冲区中还有剩余的已接收数据,则这些数据会被传递给应用程序。
IP与以太网的包收发操作
协议栈会与网卡进行配合,将数据切分成小块并封装成网络包,再将网络包转换成电信号或者光信号发送出去。
无论要收发的包是控制包还是数据包,IP对各种类型的包的收发操作都是相同的。 IP模块根据路由表Gateway栏的内容判断应该把包发送给谁。 查询MAC地址需要使用ARP. 网卡中保存的MAC地址会由网卡驱动程序读取并分配给MAC模块。
用UDP协议收发数据的操作
TCP协议有很方便的功能,比如网络包出错丢失时可以重发,因此很多应用程序都是使用TCP协议来收发数据的,但这些方便的功能也可有帮倒忙的时候,在这种情况下我们还有另一种叫UDP的协议。