继上篇课程《浏览器消息生成》,我们这篇来简述下网络连接建立相关的一些基础知识。
1.Socket
首先,我们来看下面一张图:
在这张图中,浏览器等应用软件将请求消息传递给了操作系统。操作系统将工作交给了协议栈,也就是由TCP、UDP、IP等协议构成的网络通信软件。这里要注意一点,这些TCP、UDP、IP之类的是一种规范,真正干活的是操作系统中的socket库。
什么是Socket呢?
中文翻译是套接字,是一整套用于网络连接、数据收发、网络断开、状态检测等功能的库。
Socket库中有一个Socket结构体,里面记录了用于控制通信操作的控制信息,比如通信双方的IP地址、端口号、网络状态等。
在网络通信开始前,首先需要使用Socket库创建Socket实体,记录一些控制信息,并且经过三次握手建立连接。然后进行数据收发,最后通过四次挥手断开连接。涉及到的socket接口如下图所示:
2.连接的真正含义
在使用socket(…)函数创建套接字,记录一些控制信息后,Socket库就使用connect(…)进行网络连接操作。连接实际上就是通信双方交换控制信息,将这些信息写入到socket结构体中,比如客户端告诉服务器它的IP地址、端口号等信息。
这里所说的控制信息大体分为两类:
客户端和服务器互相联络时交换的控制信息。这些信息不仅连接时需要,包括数据收发和断开连接操作在内,这个通信过程中都需要,这些内容在TCP协议的规格中进行了定义。具体如下图所示:
这些字段是固定的,在连接、收发、断开等各个阶段,每次客户段和服务器之间进行通信时,都需要提供这些控制信息。这些信息会添加到网络包的开头,因此就有了TCP头部、UDP头部、IP头部等概念。
保存在套接字中,用来控制协议栈擦作的信息。
为了提高通信的效率,在连接建立的时候会开辟两块缓存区域,用于存放发送和接收的数据。
3.网络连接的建立过程
在使用Socket库中的connect(…)建立连接时,有以下几个步骤:
这里注意ACK号和控制位中的ACK标志。ACK号是随机生成的正整数,用于防止通信被别人轻而易举地获取。