深入理解协议栈的内部结构——创建和连接

1.上期问题的答案

在TCP协议的情况下,如果服务端在客户端发送数据之前出现故障,客户端会尝试建立TCP连接。如果服务端无法响应,客户端会收到连接超时错误。如果客户端在服务端发送数据之后出现故障,通常服务端会尝试重新发送数据,直到客户端确认接收。如果重发数据次数达到上限,服务端会关闭这个连接。

2.本期主题

上一章我们讲解了套接字在建立连接,收发数据,关闭连接的作用。本章我们会讲解协议栈更深层次的内容,并且我们会讲解在TCP下协议栈的socket操作和connect操作。

3.协议栈的概貌

其中上层的部分会委派工作给下层的执行,上层的部分不需要知道下层的部分是如何实现的。最上面的一层是应用层,他们会将收发数据的工作委派给下层的部分完成。而下面一层就是Socket库,其中就包括我们第二章所讲的解析器,它的工作原理我们之前也讲解过了。

再下面就是协议栈了,协议栈的上半部分是TCP和UDP,TCP是有连接的,而UDP是无连接的,而协议栈的下半部分是用IP协议控制网络包收发操作。IP中还包括ICMP协议和ARP协议,ICMP协议用于告知传送过程中的错误以及控制消息,ARP是用来查询以太网MAC的地址。

IP下面就是网卡驱动器负责控制网卡,最下面就是网卡了,负责完成实际的收发操作。

4.通信控制信息

4.1通信控制信息——套接字

在协议栈的内部有一块用于存放控制信息的内存空间,而这些内存空间可以说就是套接字的实体。而协议栈工作的时候就需要看这部分的控制信息,如通信对象的IP地址,端口号。在发送数据后,如果对方一直不返回消息,那么我们需要等待一段时间后重新发送数据,而记录发送数据后过了多长的时间也是控制信息需要做的事情。

4.2查看套接字内部信息

在命令行输入netstat可以显示套接字内容,例如第一行0.0.0.0:135,外部地址也是0.0.0.0,这代表双方的通信还没有开始,IP地址还没确认。

这里我们显示的是外部的地址,状态和PID,其中PID是进程标识符,而外部的地址中的端口号443代表HTTPS连接的端口号,而80是HTTP连接的端口号。

5.协议栈的工作

5.1调用soeket

在与服务端连接之前,应用程序会通过调用socket申请创建套接字。首先协议栈会分配用于存放套接字所需要的内存空间,因为还没有进行连接,所以套接字的内容还是空的,协议栈会给套接字写入初始状态的控制信息,至此,套接字创建完毕。之后需要把套接字的描述符告诉应用程序,在之后的收发数据中,应用程序就需要把这个描述符提供给协议栈,协议栈可以直接从套接字中获取通信对方的信息,应用程序不用每次都告诉协议栈通信对方的信息了。

5.2连接服务器

连接服务器实际上就是socket调用connect,连接的本质是通信双方交换控制信息。为什么要进行连接?

在套接字创建完后,里面并没有通信对方的IP地址和端口号,只有应用程序知道,在调用connect后,应用程序就会把这些消息传递给协议栈了。

而服务器那边,因为在系统启动时就会创建套接字来等待客户端的连接,但是服务端根本不知道客户端的IP地址和端口号,执行connect可以让客户端向服务端告知必要的信息。

除此之外执行connect操作后,用于临时存放收发数据的内存空间,也叫缓存区,也是这个时候调用的。

5.2.1控制信息的头部

控制信息可以分为两类,第一类就是客户端和服务端联络时交换的控制信息,它被放在网络包的开头TCP,IP,以太网都有它们各自的控制信息,TCP最常见的头部格式如图所示

发送方端口号发送网络包的程序的端口号
接收方端口号网络包的接收方程序的端口号
ACK号接受方告知发送方接收方已经收到了多少数据
数据偏移量表示数据部分的起始位置
校验和用来检查数据是否出现错误

还有另一种控制信息,它被保存在了套接字中,协议栈会根据这些消息来执行每一步的操作。

接下来我们进行连接操作。

应用程序会提供服务器的IP地址和端口号,这些消息会进入到协议栈中的TCP模块,之后TCP模块会和服务器的TCP模块交换控制信息。首先客户端会创建一个包含控制信息的头部,然后把SYN值设为1,这可以理解为连接状态,然后把包传递给IP模块并进行发送。服务器的IP模块会接收到数据并给TCP。TCP会提取数据中的记录和端口号,并把套接字改为正在连接状态,并把客户端的IP地址和端口号存起来。服务端的TCP模块也会和客户端一样创建信息,并把ACK设为1,这表示接收到数据,这是为了防止网络中数据有时并不会成功传递,通信双方需要确认对方是否收到了数据。在客户端收到了服务端响应的数据后,套接字会把服务端的IP地址,端口号等信息写入,并把状态改为连接成功。最后一步,客户端还会返回ACK为1,也就是接受数据成功的信息发送给服务端,至此connect操作完成。

6.思考题

如果客户端connect操作时,服务端对应的端口号不接受连接,那么会发生什么呢?

往期内容

用通俗易懂的话理解HTTP

DNS与IP地址的那些事

协议栈发送数据

 

  • 25
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值