协议栈发送消息

1.上期问题的答案

对于那些不存在的域名,DNS服务器查找后也是会缓存的。如果下次还有人查找这个域名,那么DNS服务器就可以快速响应了。当然缓存是有有效期的,当有效期过后,数据就会从缓存中删除了。

2.本期主题

在上一节中我们已经通过DNS服务器拿到了域名所对应的IP地址了,我们现在终于可以发送数据给服务端了,但是我们就直接把数据发送出去就好了吗,还需要做什么呢?

3.Socket库

在讲数据收发之前,我们先要了解什么是Socket库,库是一堆通用程序组件的集合,其他的应用程序都需要使用其中的组件。这使得别的应用程序可以减少工作量,也可以实现程序的标准化。socket也是一种库,其中包含的程序组件可以让其他的应用程序调用操作系统的网络功能。我们上一节介绍的解析器就是这个库中的一个程序组件。而我们今天将会认识到更多这个库中的组件。与查询IP地址不同的是,收发数字信息要调用的程序组件要多的多。

4.数据收发操作概览

收发数据的客户端和服务端其实中间建立了一个管道,而这个管道是双向的,客户端既可以发送数据给服务端,服务端也可以发送数据给客户端。但是这就又有一个问题了,根本没有这个管道,那我们应该怎么建立起这个管道呢。

建立管道的关键在于管道的出口和入口,这些出入口被称为套接字。我们需要先创建套接字,然后再将套接字连接起来形成管道。服务器程序一般在启动后就会自动创建套接字了,等待客户端创建套接字连接管道。客户端创建一个管道后,从该套接字延伸出管道,最后连接到服务端。

5.收发数据的各个阶段

收发数据大致可以发成四个阶段

创建套接字

建立管道

收发收据

断开管道

在每个阶段Socket库中的程序组件都会被调用来执行相关操作,但是Socket中的程序组件其实只是做委托的操作,委托协议栈完成上述操作,关于协议栈的工作原理,在我们之后的章节中会详细讲解的。

5.1创建套接字

客户端想要创建套接字,需要调用Socket库中的socket组件。在创建完一个套接字后,协议栈会返回一个描述符。描述符是用来识别不同的套接字的,因为计算机会同时进行多个数据的通信操作,所以会生成很多个套接字,那么我们就需要描述符来判断哪个套接字是这个通信操作所需要的。

5.2建立管道

我们已经成功创建了套接字,接下来我们要把两边的套接字连接起来了。应用程序通过调用Socket库中的connect的程序组件。调用connect时,需要指定描述符,服务器的IP地址,还有端口号。

描述符,可以让协议栈了解到是哪一个套接字和服务器的套接字进行连接。

IP地址,我们上一章已经讲过,只有知道了IP地址,我们才可以知道数据应该发往哪里。

端口号,可以用来定位客户端要连接服务端哪一个套接字。但是现在就有一个疑问,明明已经有了描述符了,为什么还有端口号这种东西来连接呢,会不会多此一举了。这个时候我们想到一个问题,在客户端连接服务端的时候,知不知道服务端对应的接口号的描述符是多少。这很显然是不知道的,而端口号就是为了用来让通信的另一方能够识别出套接字的机制。

那么端口号应该怎么得到呢,其实很简单。Web的端口号是80,电子邮件的端口号是25,mysql的端口号是3306,这都是事先规定好的。那么客户端的端口号怎么办呢,在协议栈进行连接操作的时候,会随机生成一个端口号,然后告诉给服务端。

5.3收发数据

在建立管道之后就是发送数据了,我们还是要通过Socket库来使用write程序组件,把我们第一讲中生成的HTTP请求消息发送给服务端。write程序组件还需要指定描述符,否则的话,write也不知道要从哪个管道发送呢。之后服务端会接受数据,解析收到的数据,然后执行响应操作,最后向客户端返回响应消息。

当消息返回后,需要执行接受消息的操作。这时候就需要read程序组件了,调用时需要存放接收的响应消息的内存地址,也就是接受缓存区,这是一块位于应用程序内部的内存空间,至此,返回消息已经转交给了应用程序。

5.4断开管道

收发数据结束后,就要断开管道了,这个时候就要调用close程序组件。发送完数据之后的服务端会主动执行断开操作,断开操作传到客户端后,套接字也会进入断开阶段。在浏览器调用read也就是接受数据的时候,会被告知发送数据已经结束,浏览器得知后也会调用close进入断开阶段。

特别注意

在上文中的断开管道操作的上,我们使用的时HTTP版本1.0,在HTTP版本1.1中服务端在发送数据后不会主动断开连接,而是可以在客户端需要执行别的操作的时候复用这个管道,因此HTTP版本1.0被称为短连接,而HTTP版本1.1被称为长连接,创建的管道可以多次利用,并且HTTP版本1.1中客户端可以主动地断开连接。

6.思考题

我们之前的假设都是以客户端和服务端都没有故障为前提的。那么如果在发送数据之前,服务端发生错误,或者发送数据后客户端发生错误,分别会发生什么问题呢?

往期内容

用通俗易懂的话理解HTTP

DNS与IP地址的那些事

  • 34
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值