一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情。
往期文章
- 网络是怎样连接的(一)—— 浏览器访问 Web 服务器过程概览
- 网络是怎样连接的(二)—— 浏览器生成 HTTP 消息
- 网络是怎样连接的(三)—— 通过 DNS 服务器查询 IP 地址
- 网络是怎样连接的(四)—— DNS 服务器工作介绍
- 网络是怎样连接的(五)—— 委托操作系统进行收发消息过程概览
- 网络是怎样连接的(六)—— 协议栈内部探索步骤
- 网络是怎样连接的(七)—— 协议栈的内部结构
- 网络是怎样连接的(八)—— 探索套接字
前言
创建套接字之后,应用程序(浏览器)就会调用 connect 方法,随后协议栈会将本地的套接字与服务器的套接字进行连接。
那么问题来了,以太网的网线一直是连接的状态,我们并不需要来回插拔网线,那么这里的“连接”到底是什么意思呢?
搞清这个问题非常的重要,我们只有明白了连接的目的是什么,我们才能更理解传输的数据内容、结构等等这样设计的原因。
今天,让我们一起来探索下,连接连的到底是个什么东西。
先上结论
连接实际上是通信双方交换控制信息,在套接字中记录这些必要信息并准备数据收发的一连串操作。
连接的目的
1. 把服务器的 IP 地址、端口号等信息告知协议栈
套接字刚刚创建完成的时候,里面并没有存放任何数据,也不知道通信的对象是谁。在这个状态下,即便应用程序要求发送数据,协议栈也不知道数据应该发送给谁。
浏览器可以根据网址来查询服务器的 IP 地址,而且根据规则也知道应该使用 80 号端口,但只有浏览器知道这些必要的信息是不够的,因为在调用 Socket 创建套接字时,这些信息并没有传递给协议栈。
因此,我们需要把服务器的 IP 地址和端口号等信息告诉协议栈。
2. 客户端向服务端传递开始通信请求
看完了客户端,我们再来看看服务端是什么样。服务器上也会创建套接字,但服务器上的协议栈和客户端一样,只创建套接字是不知道应该和谁通信的。
而且,和客户端不同的是,在服务器上,连应用程序也不知道自己的通信对象是谁,这样下去永远也没法开始通信。于是,我们需要让客户端向服务器告知必要的信息,比如“我想和你开始通信,我的 IP 地址是 xxx.xxx. xxx.xxx,端口号是 yyyy。”
可见,客户端向服务器传达开始通信的请求,也是连接操作的目的之一。
连接是什么意思
从上面的例子我们可以看出,连接实际上是通信双方交换控制信息,在套接字中记录这些必要信息并准备数据收发的一连串操作。
对于交换控制信息,其实我们应该有一定了解了,比如告知协议栈服务器的 IP 地址、端口号,建立连接请求等。除此之外还有其他的一些控制信息,在后面涉及到的时候我们会一一介绍。连接操作所交换的控制信息是根据通信规则来确定的,只要根据规则执行连接操作,双方就可以的到必要的信息从而完成数据收发的准备。
对于后半句话 在套接字中记录这些必要信息并准备数据收发的一连串操作,其实是当执行数据收发操作时,我们还需要一块用来临时存放要收发的数据的内存空间,这块内存空间称为缓冲区,它也是在连接操作的过程中分配的。
这就是连接的具体含义。
参考文章
- 《网络是怎样连接的》—— 户根勤