数据在网络中是如何传输的

数据传输的整个过程总结为四个词就是创建、连接、发送、断开 。每个交互过程都会进行详细说明,耐心往下看哦 。
交互过程如下图所示:

数据在网络中是如何传输的

文章插图
 
套接字如何创建的协议栈内部结构
数据在网络中是如何传输的

文章插图
 
如上图所示,整个请求交互过程分为了几个部分,首先最上层就是应用程序,接着往下是 Socket 库 。
再下面就是操作系统的内部了,这里面就包括了协议栈,协议栈上半部分为 TCP 和 UDP ,它们都是负责数据的收发,只是一个需要 连接,一个不需要连接可以直接收发数据,这两者的详细区别我会在后期文章单独讲解,这里大家先了解下就行 。
协议栈的下半部分是 IP 协议,用来真正将数据转变为网络包进行实际数据传送的媒介 。
IP 下面就是网卡驱动程序,用来控制网卡硬件 。
认识套接字在协议栈内部有一块用来存放控制信息的内存空间,这里面记录了需要连接的对象 IP 地址、端口号、进行状态等信息 。
而套接字本身其实只是一个概念,实际并没有这样一个东西,这个概念如果非要赋予它一个实体,那控制信息可以认为就是它的实体 。
在发送数据时,我们需要看下套接字要进行连接的对象 IP 地址和端口号;发送数据之后,套接字里面会记录发送数据经过了多长时间,如果发送收到响应,也会进行记录 。
我们来实际看下 套接字 都有哪些信息,可以在你电脑的控制台输入 netstat 命令进行查询:
数据在网络中是如何传输的

文章插图
 
  • Proto: 表示协议类型 。这里是 tcp ,如果用到了 udp 就会显示为 udp 。
  • Local Address : 本机的 IP 地址 。
  • Foreign Address : 通信对象的 IP 地址
  • state : 通信状态 。ESTABLISHED 表示完成连接,CLOSE_WAIT 表示等待关闭,还有一个状态也很常见,LISTENING:等待对方连接 。
当浏览器通过 Socket 库向协议栈发出 socket 调用时,协议栈就会根据申请执行创建套接字的操作 。
协议栈首先会分配一个存放套接字的内存空间,然后往里面存入控制信息,这样套接字就创建好了 。
连接服务器创建好套接字后,浏览器会调用 connect,协议栈就会将本地的套接字和服务器的套接字进行连接 。
连接就是通信双方互相交换控制信息,连接操作所交换的控制信息是根据通信规则来确定的,只要双方根据规则进行连接,就能建立起连接关系,完成数据收发的准备 。
控制信息控制信息一般可以分为两类,一类是客户端和服务器相互联系时交换的控制信息,这个信息是两者建立连接、数据收发、断开连接整个通信过程都需要的信息,一般这些内容是通过 TCP 协议进行定义的 。这些信息会被添加进网络包的开头,因此也叫作头部,以太网和 IP 协议也有自己的控制信息,这个信息也叫头部,为了进行区分,我们分别叫作 TCP 头部、以太网头部、IP 头部 。
数据在网络中是如何传输的

文章插图
 
这里罗列了部分 TCP 头部的信息,仅供参考 。
控制信息还有一类,是保存在套接字里的,应用程序传递的信息和从通信对象接受的信息都会保存在这里,以及数据收发操作的执行状态也会在这里面 。
连接操作的实际过程连接操作的第一步就是在 TCP 模块处创建表示连接控制信息的头部 。当 TCP 头部创建好后,TCP 模块会将信息传递给 IP 模块委托其进行发送 。IP 执行发送后,网络包会通过网络到达服务器,服务器上的 IP 模块将接收到的数据传递给 TCP 模块,TCP 模块根据头部信息找到对应的套接字,套接字中会写入相应的信息,然后将状态改为正在连接 。
于此同时,在返回响应时,会将 ACK 控制位设为 1,代表已接收到网络包 。服务器 TCP 模块会将响应消息通过 IP 模块向客户端做出响应 。
客户端接收到响应后,其 IP 模块将信息传递给 TCP 模块,然后通过 TCP 头部信息确认连接是否成功,SYN 等于 1 就代表成功,客户端还会将 ACK 设置为1 并发回给服务器,服务器收到这个包后才算连接操作真正的完成 。
建立连接后,就可以随时进行收发数据了,在调用 close 之前,连接会一直存在 。
收发数据收发数据的触发操作是应用程序发起的,通过调研 write,指定发送数据的长度 。


推荐阅读