lesson2 简单网络连接-网络连接的建立

继上篇课程《浏览器消息生成》,我们这篇来简述下网络连接建立相关的一些基础知识。

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(…)建立连接时,有以下几个步骤:

  • 首先,客户端先创建一个包含表示开始数据收发操作的控制信息的头部。Web请求会创建如上图所示的TCP头部,包含很多字段。双方在连接中确定要通信的套接字后,然后将头部中控制位的SYN比特位设置为1,将ACK号设置适当的序号(一般是随机生成的正整数,防止被窃取)和窗口大小(根据缓冲区大小和队列中消息数来确定目前可接收的最大包的数目,避免发包过多)。将TCP头部和发送的数据整合之后,形成请求包,交给IP层进行发送。
  • 然后,在服务器接收到请求包后,根据端口号等信息,交给应用程序。由于这里是一个请求建立连接的包,服务器会将TCP中控制位的ACK比特位设置为1,同时也将控制位SYN设置为1。所以这个包既是请求包也是应答包。
  • 接着,客户端收到了服务器发来的应答包。通过控制位中SYN标志判断是否连接成功。由于这个包同时也是一个请求包,所以,客户端会再发送一个应答包给到服务器,将TCP头部控制位的ACK设置为1。

在这里插入图片描述

这里注意ACK号和控制位中的ACK标志。ACK号是随机生成的正整数,用于防止通信被别人轻而易举地获取。