网络连接总超时?从四层模型上解析网络是怎么连接的
身在信息时代,几乎人人都需使用设备访问网络上的资源。在这个过程中,建立网络连接所实现的连通性,是计算机网络最基本功能。今天,我们就来分享一个关于计算机网络的知识点 —— 网络到底是怎么连接的?
浏览器生成消息且发送
发送一个消息的总体流程如下
生成 HTTP 请求消息
举个栗子,当我们在浏览器输入https://www.jdl.cn/img/service.843585b7.png网络地址的时候,浏览器首先会对 URL 进行解析:
https:表示访问数据源的机制,也就是协议
www.jdl.cn: web 服务器名称
img :表示目录名
service.843585b7.png:表示文件名 然后就要生成 HTTP 消息了,它大概长这样
这些字段具体内容是什么可以参考这篇文章:五千来字小作文,是的,我们是有个HTTP。
DNS 域名解析为 IP 地址
浏览器生成了这个 HTTP 消息后,它要往哪里发送呢?当然是服务器啦,所以就要解析这个域名对应的是哪台服务器,IP 地址是什么,因为 IP 地址不好记,所以才有了对应的域名,便于我们人类记忆。
浏览器会检查缓存有没有这个域名对应的 ip 地址
操作系统会检查缓存(就是我们平常说的 hosts 文件)
操作系统会发送给本地区的 DNS 服务器,让它帮忙解析下 DNS 服务器接受来自客户端的查询,包括以下三个内容:
域名: 服务器,邮件服务器的名称
Class: 在最早设计 DNS 时,DNS 在互联网以外的其他网络中的应用也被考虑到了,而 Class 就是用来识别网络信息的,不过如今除了互联网就没有其他网络了,因此 Class 的值永远代表互联网的 IN
记录类型: 表示域名对应何种记录类型
A 记录时,域名直接对应 IP 地址
CNAME 时,此域名对应其他域名
MX 时,表示域名对应的是邮件服务器 对于不同的记录类型,响应数据也不一样
域名的层次结构
越靠右层次越高,从右向左一级一级的划分 : 例如 www.jdl.cn 就是 cn->jdl->www;
具有这种层次结构的域名信息都会注册到 DNS 服务器中,而每个域都是作为一个整体来处理的 客户端和 DNS 服务器交互流程大概如下;
上级 DNS 服务器中要注册其下级域的 DNS 服务器 IP 地址,然后上级 DNS 服务器 IP 地址要注册到更上一级的 DNS 服务器中,此次类推;
根域的 DNS 服务器信息保存到互联网中所有的 DNS 服务器中,这样的话,所有的 DNS 服务器都会找到根域,然后一级一级的往下找,直到找到自己想要的那个域名;
分配给根域的 IP 地址仅有 13 个,就是顶级域名(com,cn 等)对应的 ip 地址。
具体交互就是下面这样
但是一台服务器存不下这么多,所以一般都是 DNS 服务器大接力来寻找这个 IP 地址,图如下:
客户端找到最近的 DNS 服务器,查找 www.jdl.cn 的信息,可是最近的 DNS 服务器没有这个信息,就转发到了根域服务器下,经过判断发现是 cn 的顶级域名的,于是根域 DNS 服务器会返回它所管理的 cn 域中的 DNS 服务器的 IP 地址,接下来,最近的这个 DNS 服务器又回去访问 com 域名的服务器,以此类推,最终会找到 www.jdl.cn 这个服务器的 IP 地址。
委托协议栈发送消息
知道了 IP 地址后,就可以委托操作系统内部的协议栈向这个目标 IP 地址发送消息了。
协议栈的内部结构;
浏览器、邮件等一般应用程序收发数据时用 TCP;
DNS 查询等收发较短的控制数据用 UDP。
网络分层
OSI 七层模型
开放式系统互联通信参考模型(英语:Open System Interconnection Reference Model,缩写为 OSI),简称为 OSI 模型(OSI model),一种概念模型,由国际标准化组织提出,一个试图使各种计算机在世界范围内互连为网络的标准框架。定义于 ISO/IEC 7498-1。
TCP/IP 四次模型
应用层: HTTP、DNS、FTP;
传输层: TCP、UDP;
网络层: IP;
网络接口层。
TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)TCP/IP 协议不仅仅指的是 TCP 和 IP 两个协议,而是指一个由 FTP、SMTP、TCP、UDP、IP 等协议构成的协议簇, 只是因为在 TCP/IP 协议中 TCP 协议和 IP 协议最具代表性,所以被称为 TCP/IP 协议。
客户端服务器传递数据流程
一个数据包从客户端到服务端中间经过每一层都需要加工处理;
客户端这边需要不断的给数据包添加头部;
服务端这边需要不断的拆分这个数据包。
三次握手
当两台计算机要传递数据的时候,一定要先连接,得经过 TCP 三次握手吧(仅仅指指走 TCP 协议需要连接的),我们平常都说 TCP 连接要经过三次握手,我们就来看一下到底什么是 TCP 三次握手,如图所示
客户端要发送的时候,主动从 closed 状态打开,服务器启动后就一直处于监听 LISTEN 状态
客户端发送 SYN = 1,seq = x 给服务端,客户端处于 SYN_SEND 状态。
服务端收到后给客户端发送 SYN = 1,ACK =1, seq = y,ack = x+1。此时服务端处于 SYN_RCVD 状态
客户端收到后发送 ACK =1, seq = x+1,ack = y+1 给服务器,此时客户端状态是 ESTAB-LISHED
服务端收到后状态变为 ESTAB-LISHED
三次握手通过后,就代表客户端和服务端可以传递数据包进行交互啦
我们说到 SYN,ACK,seq,ack 这些又是什么呢?这些其实是 TCP 数据包里的属性,我们接着往下看(在传输层中有解释)
应用层
HTTP 数据包拆分
一般 HTTP 请求消息不会太长,一个网络包就能装的下
发送缓冲区中的数据如果超过 MSS 的长度,就会被以 MSS 长度进行拆分放进单独的网络包中
MTU(Maximum Transmission Unit): 一个网络包的最大长度,以太网中一般是 1500 字节
MSS(Maximum Segment Size): 除去头部之后,一个网络包所容纳的 TCP 数据的最大长度
传输层
上面应用层的这个网络包再加上 TCP 头部。
TCP 报文格式
源端口号(16 位): 发送网络包的端口号
目的端口号(16 位): 网络包的接受方的端口号
序号(发送数据的顺序编号)(32 位): 发送方告知接收方已经收到了所有数据的第几个字节
确认序号(接收数据的顺序编号)(32 位): 接收方告知发送方接收方已经收到了所有数据的第几个字节
头部长度(4 位): 表示数据的起始部分,数据偏移量
保留(6 位): 该字段为保留,现在未使用
控制位(6 位): 该字段中的每个比特位分别表示以下通信控制的含义
URG: 表示紧急指针字段有效
ACK: 表示接收数据序号字段有效,一般表示数据已被接收方收到
PSH: 表示通过 flush 操作发送的数据
RST: 强制断开连接,用于异常中断的情况
SYN: 发送方和接收方相互确认序号,表示连接操作
FIN: 表示断开操作
窗口大小(16 位): 接收方告知发送方窗口大小(即无需等待确认可一起发送的数据)
校验和(16 位): 用来检查是否出现错误
紧急指针(16 位): 表示应急处理的数据位置
可选字段(可变长度): 除了上面的固定头部字段外,还可以添加可选字段,但除了连接操作外,很少使用可选字段
还记得三次握手提到过的各种序号吗,就是这个报文里的属性
网络层
然后上面这个网络包再加上 IP 头部
IP 报文格式
版本号(4 比特): IP 协议版本号,目前是版本 4
头部长度(4 比特): IP 头部的长度,可选字段可导致头部长度的变化,因此这里需要指定头部的长度
服务类型(TOS)(8 比特): 表示包传输优先级。最初的协议规格里对这个参数的定义很模糊,最近 DIFFServ 规则重新定义了这个字段的用法
总长度(16 比特): 表示 IP 消息的总长度
ID 号(16 比特): 用于识别包的编号,一般为的序列号。如果一个包被 IP 分片,则所有分片都拥有相同的 ID
标志(Flag)(3 比特): 该字段有 3 个比特,其中 2 个比特有效,分别代表是否允许分片,以及当前分片是否为分片包
分片偏移量(13 比特): 表示当前包的内容为整个 IP 消息的第几个字节开始的内容
生存时间(TTL)(8 比特): 表示包的生存时间,这是为了避免网络出现回环时一个包永远在网络中打转。每经过一个路由器,这个值就会减一,减到 0 的是 hi 这个包就会被丢弃
协议号(8 比特): 协议号表示协议的类型(以下均为 16 进制)
TCP: 06
UDP: 17
ICMP: 01
头部校验和(16 比特): 用于检查错误,现在已经不在使用
发送方 IP 地址(32 比特): 网络包发送方的 IP 地址
接收方 IP 地址(32 比特): 网络包接收方的 IP 地址
可选字段(可变长度): 除了上面的固定头部字段外,还可以添加可选字段,但除了连接操作外,很少使用可选字段
然后这个网络包再加上 MAC 头部
MAC 数据包
接收方 MAC 地址(48 比特): 网络包接收方的 MAC 地址,在局域网中使用这一地址来传输网络包
发送方 MAC 地址(48 比特): 网络包发送方的 MAC 地址,接收方通过它来判断是谁发送了这个网络包
以太类型(16 比特): 使用的协议类型。下面是一些常见的类型,一般在 TCP/IP 通信中只是用 0800 和 0806 这两种。
0000-05DC: IEEE 802.3
0800 : IP 协议
0806 : ARP 协议
86DD : IPV6
MAC 地址 VS IP 地址
IP 头部前面还会加上 MAC 头部
为什么需要 MAC 数据包呢?因为在以太网的世界中,TCP/IP 这个思路是行不通的。
以太网在判断网络包目的地时和 TCP/IP 的方式不同,因此必须采用想匹配的方式才能在以太网中将包发往目的地,而 MAC 地址就是干这个的
发送方 MAC 地址:MAC 地址是写在网卡生产时写入 ROM 里的,只需要将这个值读取出来写入 MA 头部就好了
发送方的 MAC 地址还比较容易获取到,但是接收方的 MAC 地址就不太容易获取到了
ARP 广播
ARP :Addresss Resolution Protocal 地址解析协议
根据 IP 地址查询接收方 MAC 地址的时候会用到 ARP 广播
在同一个子网中,利用广播对所有设备提问 XXX 这个 ip 地址是谁的,其他设备发现自己的 ip 地址是这个 xxx 的话,那么他就会把它的 MAC 地址告诉提问者,这样就会检测到接收方的 MAC 地址了,如果发现自己的 ip 地址不是这个 XXX,那么则会丢弃这个消息并不去理会。
如果每次都去广播的话,那么网络中就会增加很多 ARP 包,所以为了提高效率,我们有 ARP 缓存在内存中。查询之前先去查询 ARP 缓存。
当目的地的 IP 地址对应的 MAC 地址变了的话,那么这个 MAC 缓存就会出问题,所以为了避免这种问题发生,这个缓存几分钟后会被删除,非常简单粗暴。
静态 ARP: 手工维护,不会自动失效
动态 ARP: 会过段时间自动失效(文中说的就是它)
IP 模块负责添加如下两个头部:
MAC 头部: 以太网用的头部,包含 MAC 地址
IP 头部: IP 用的头部,包含 IP 地址
总体数据包
这个时候的数据包变成了这个样子:
MTU(Maximum Transmission Unit): 一个网络包的最大长度,以太网中一般是 1500 字节;
MSS(Maximum Segment Size): 除去头部之后,一个网络包所容纳的 TCP 数据的最大长度;
然后这数据包,沿着网卡出去,到集线器,路由器一顿传输(中间涉及到电信号转换等等),到达服务端那边,再一层一层的扒皮(前往中说过,一层一层的拆分数据包)。
断开连接
四次挥手
两台计算机最后连接结束后要断开连接,进行四次挥手:
其实三次握手,四次挥手还有好多好多知识点要说,像什么为什么握手需要三次,而挥手需要四次啦这些问题,之后我们会单独开一篇内容和大家再深入地讲一讲,记得扫描下方二维码关注我们哟!
推荐阅读
欢迎点击【京东科技】,了解开发者社区
更多精彩技术实践与独家干货解析
欢迎关注【京东科技开发者】公众号
版权声明: 本文为 InfoQ 作者【京东科技开发者】的原创文章。
原文链接:【http://xie.infoq.cn/article/ece17a1e944e89d902c7be77c】。文章转载请联系作者。
评论