【基础夯实】TCP/IP 协议是怎么控制数据收发
网址输入到页面完整显示,对于此问题,粗略的解释可以分为以下几个步骤:
- 客户端通过 HTTP 协议对数据进行一次包装
- 通过 DNS 服务器(本地无缓存)解析网址的 ip 地址
- 通过 TCP 协议与目标 IP 建立连接,二次包装的数据包在网线和路由器完成传递
- 返回结果经过浏览器的绘制和渲染,完成页面的构建
对于第三点 TCP/IP 协议是怎么来控制数据在网络中的传递一知半解,最近查阅相关网络方面的书籍才彻底搞懂其原理。
数据收发概览
应用程序发起网络请求后,数据的收发实际是委托给 Socket 库来完成,其操作大致可以分为以下4个阶段:
- 创建套接字(创建套接字阶段)
- 将管道连接到服务器端的套接字上(连接阶段)
- 收发数据(通信阶段)
- 断开管道并删除套接字(断开阶段)
下图是这四个阶段的图例:
Socket
库是一组编程接口(API),用于在不同计算机之间通过网络进行双向通信。它是由操作系统层面提供的,允许应用程序创建网络连接并收发数据。Socket
库抽象了底层的网络细节,使得程序员可以通过一组标准的函数调用来实现网络通信,而无需直接处理复杂的网络协议细节。
Socket
库提供了创建、配置和管理socket的一系列函数,其中包括 socket()
,connect()
,write()
,read()
和 close()
等方法
Socket 完成数据的收发过程是通过协议栈来完成,协议栈的内部及所处位置如下图所示
图中最上层是应用程序,它们会将收发数据等工作委派给 Socket 库来完成,Socket库包括解析器,解析器用来向DNS服务器发出查询。
第二层就是操作系统内部,协议栈位于该层。协议栈有两部分,上半部分是 TCP 和 UDP 协议,主要用来控制数据连接。下半部分是 IP 协议,控制网络包收发的操作。在互联网上传送数据时,数据会被切分成一个一个的网络包A,而将网络包发送给通信对象的操作就是由IP来负责的。此外,IP中还包括 ICMPA 协议和 ARPB 协议。ICMP 用于告知网络包传送过程中产生的错误以及各种控制消息,ARP 用于根据IP地址查询相应的以太网MAC地址。
创建套接字
协议栈是根据套接字中记录的控制信息来工作的
调用 <描述符> = socket(<使用的ip>,<流模式>,...)
方法(伪代码)后,在协议栈内部会创建一块用于存放控制信息的内存空间,这里记录了用于控制通信操作的控制信息,例如通信对象的IP地址、端口号、通信操作的进行状态等,可以说这些控制信息就是套接字的实体,或者说存放控制信息的内存空间就是套接字的实体。在Windows中可以用netstat命令显示套接字内容: