您好!
欢迎来到京东云开发者社区
登录
首页
博文
课程
大赛
工具
用户中心
开源
首页
博文
课程
大赛
工具
开源
更多
用户中心
开发者社区
>
博文
>
计算机网络之从四层模型看网络是怎么连接的
分享
打开微信扫码分享
点击前往QQ分享
点击前往微博分享
点击复制链接
计算机网络之从四层模型看网络是怎么连接的
自猿其说Tech
2021-03-16
IP归属:未知
498440浏览
计算机编程
大家好, 今天来分享一个关于计算机网络的知识点——网络到底是怎么连接的? 话不多说,直接开车 ### 浏览器生成消息且发送 ------------ 发送一个消息的总体流程如下 ![](//img1.jcloudcs.com/developer.jdcloud.com/79d7ec2b-8b9a-4a13-aa8a-008f297309a020210315164219.png) #### 生成HTTP请求消息 举个栗子,当我们在浏览器输入https://www.jdl.cn/img/service.843585b7.png网络地址的时候 浏览器首先会对URL进行解析 https:表示访问数据源的机制,也就是协议 www.jdl.cn: web服务器名称 img :表示目录名 service.843585b7.png:表示文件名 然后就要生成HTTP消息了,它大概长这样 ![](//img1.jcloudcs.com/developer.jdcloud.com/09a71fee-bc81-475a-9987-675a67f2669d20210315164304.png) 这些字段具体内容是什么可以参考这篇文章五千来字小作文,是的,我们是有个HTTP。 #### DNS域名解析为IP地址 浏览器生成了这个HTTP消息后,它要往哪里发送呢?当然是服务器啦,所以就要解析这个域名对应的是哪台服务器,IP地址是什么,因为IP地址不好记,所以才有了对应的域名,便于我们人类记忆。 浏览器会检查缓存有没有这个域名对应的ip地址 操作系统会检查缓存(就是我们平常说的hosts文件) 操作系统会发送给本地区的DNS服务器,让它帮忙解析下 DNS服务器接受来自客户端的查询,包括以下三个内容 域名: 服务器,邮件服务器的名称 Class: 在最早设计DNS时,DNS在互联网以外的其他网络中的应用也被考虑到了,而Class就是用来识别网络信息的,不过如今除了互联网就没有其他网络了,因此Class的值永远代表互联网的IN 记录类型: 表示域名对应何种记录类型 A记录时,域名直接对应IP地址 CNAME时,此域名对应其他域名 MX时,表示域名对应的是邮件服务器 对于不同的记录类型,响应数据也不一样 ![](//img1.jcloudcs.com/developer.jdcloud.com/3563589c-0ef4-40ad-ae29-a9da056b487620210315164412.png) #### 域名的层次结构 越靠右层次越高,从右向左一级一级的划分 : 例如 www.jdl.cn 就是cn->jdl->www 具有这种层次结构的域名信息都会注册到DNS服务器中,而每个域都是作为一个整体来处理的 客户端和DNS服务器交互流程大概如下 上级DNS服务器中要注册其下级域的DNS服务器IP地址,然后上级DNS服务器IP地址要注册到更上一级的DNS服务器中,此次类推 根域的DNS服务器信息保存到互联网中所有的DNS服务器中,这样的话,所有的DNS服务器都会找到根域,然后一级一级的往下找,直到找到自己想要的那个域名 分配给根域的IP地址仅有13个,就是顶级域名(com,cn等)对应的ip地址 ![](//img1.jcloudcs.com/developer.jdcloud.com/ee18432b-4947-434f-bfcb-abe76da26edc20210315164436.png) 具体交互就是下面这样 ![](//img1.jcloudcs.com/developer.jdcloud.com/b10f617a-a573-4177-9d6c-936fa86ed00d20210315164500.png) 但是一台服务器存不下这么多,所以一般都是DNS服务器大接力来寻找这个ip地址,图如下 ![](//img1.jcloudcs.com/developer.jdcloud.com/277cfc4b-12cc-4748-a3df-5b5c89f7c8b520210315164517.png) 客户端找到最近的DNS服务器,查找www.jdl.cn的信息,可是最近的DNS服务器没有这个信息,就转发到了根域服务器下,经过判断发现是cn的顶级域名的,于是根域DNS服务器会返回它所管理的cn域中的DNS服务器的ip地址,接下来,最近的这个DNS服务器又回去访问com域名的服务器,以此类推,最终会找到 www.jdl.cn这个服务器的IP地址 #### 委托协议栈发送消息 知道了IP地址后,就可以委托操作系统内部的协议栈向这个目标IP地址发送消息了 ![](//img1.jcloudcs.com/developer.jdcloud.com/e4d8e4ab-9101-4446-9bdf-0d26cad023f320210315164657.png) 协议栈的内部结构 ![](//img1.jcloudcs.com/developer.jdcloud.com/fc7b0b89-8ba7-4e90-aa5c-420f1ec6b1f320210315164718.png) 浏览器、邮件等一般应用程序收发数据时用TCP DNS查询等收发较短的控制数据用UDP ### 网络分层 ![](//img1.jcloudcs.com/developer.jdcloud.com/a890a694-c208-4c8a-a162-49a8c5a818a620210315164820.png) ------------ #### 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协议 ### 客户端服务器传递数据流程 ------------ ![](//img1.jcloudcs.com/developer.jdcloud.com/c4e4f89a-6f50-468e-8016-98b7f3f6a9ce20210315164928.png) 一个数据包从客户端到服务端中间经过每一层都需要加工处理 客户端这边需要不断的给数据包添加头部 服务端这边需要不断的拆分这个数据包 #### 三次握手 当两台计算机要传递数据的时候,一定要先连接,得经过TCP三次握手吧(仅仅指指走TCP协议需要连接的),我们平常都说TCP连接要经过三次握手,我们就来看一下到底什么是TCP三次握手,如图所示 ![](//img1.jcloudcs.com/developer.jdcloud.com/8f599db4-f559-4d54-9ffe-f28af893ab2920210315165006.png) 客户端要发送的时候,主动从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数据包拆分 ![](//img1.jcloudcs.com/developer.jdcloud.com/74c415a2-bf81-44a9-b5ad-b4ab271d418e20210315165726.png) 一般HTTP请求消息不会太长,一个网络包就能装的下 发送缓冲区中的数据如果超过MSS的长度,就会被以MSS长度进行拆分放进单独的网络包中 MTU(Maximum Transmission Unit): 一个网络包的最大长度,以太网中一般是1500字节 MSS(Maximum Segment Size): 除去头部之后,一个网络包所容纳的TCP数据的最大长度 ### 传输层 ------------ 然后上面应用层的这个网络包再加上TCP头部 #### TCP报文格式 ![](//img1.jcloudcs.com/developer.jdcloud.com/8213cbee-29ff-4e72-9c9f-f00a5e2f5e3520210315165906.png) 源端口号(16位): 发送网络包的端口号 目的端口号(16位): 网络包的接受方的端口号 序号(发送数据的顺序编号)(32位): 发送方告知接收方已经收到了所有数据的第几个字节 确认序号(接收数据的顺序编号)(32位): 接收方告知发送方接收方已经收到了所有数据的第几个字节 头部长度(4位): 表示数据的起始部分,数据偏移量 保留(6位): 该字段为保留,现在未使用 控制位(6位): 该字段中的每个比特位分别表示以下通信控制的含义 URG: 表示紧急指针字段有效 ACK: 表示接收数据序号字段有效,一般表示数据已被接收方收到 PSH: 表示通过flush操作发送的数据 RST: 强制断开连接,用于异常中断的情况 SYN: 发送方和接收方相互确认序号,表示连接操作 FIN: 表示断开操作 窗口大小(16位): 接收方告知发送方窗口大小(即无需等待确认可一起发送的数据) 校验和(16位): 用来检查是否出现错误 紧急指针(16位): 表示应急处理的数据位置 可选字段(可变长度): 除了上面的固定头部字段外,还可以添加可选字段,但除了连接操作外,很少使用可选字段 还记得三次握手提到过的各种序号吗,就是这个报文里的属性 ### 网络层 ------------ 然后上面这个网络包再加上IP头部 IP报文格式 ![](//img1.jcloudcs.com/developer.jdcloud.com/620b1485-c9fb-4b4c-9f8f-0e67166a2b6b20210315170038.png) 版本号(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数据包 ![](//img1.jcloudcs.com/developer.jdcloud.com/84d947ee-87a7-497e-9049-7b54de2e804c20210315170149.png) 接收方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,那么则会丢弃这个消息并不去理会。 ![](//img1.jcloudcs.com/developer.jdcloud.com/5f5542dc-f7a0-4d4d-8239-32056507f9ce20210315170248.png) 如果每次都去广播的话,那么网络中就会增加很多ARP包,所以为了提高效率,我们有ARP缓存在内存中。查询之前先去查询ARP缓存。 当目的地的IP地址对应的MAC地址变了的话,那么这个MAC缓存就会出问题,所以为了避免这种问题发生,这个缓存几分钟后会被删除,非常简单粗暴。 静态ARP: 手工维护,不会自动失效 动态ARP: 会过段时间自动失效(文中说的就是它) IP 模块负责添加如下两个头部: MAC头部: 以太网用的头部,包含MAC地址 IP头部: IP用的头部,包含IP地址 ### 总体数据包 ------------ 这个时候的数据包变成了这个样子 ![](//img1.jcloudcs.com/developer.jdcloud.com/a569a4c1-7be9-449b-948c-d7b3783c260820210315170326.png) MTU(Maximum Transmission Unit): 一个网络包的最大长度,以太网中一般是1500字节 MSS(Maximum Segment Size): 除去头部之后,一个网络包所容纳的TCP数据的最大长度 然后这数据包,沿着网卡出去,到集线器,路由器一顿传输(中间涉及到电信号转换等等),到达服务端那边,再一层一层的扒皮(前往中说过,一层一层的拆分数据包) ### 断开连接 ------------ #### 四次挥手 两台计算机最后连接结束后要断开连接,进行四次挥手 ![](//img1.jcloudcs.com/developer.jdcloud.com/3818324e-79ee-4c69-82ac-e71f49fc2a2820210315170424.png) 其实三次握手,四次挥手还有好多好多知识点要说,像什么为什么握手需要三次,而挥手需要四次啦这些问题,以后小杰会单独和大家聊这个,记得收看呀 原文链接:https://mp.weixin.qq.com/s/F96PnjvI5z6_gLA6oqew5g (五千来字的小作文,是的,我们是有一个HTTP)原文链接:https://mp.weixin.qq.com/s/c6xdYQf-NLcuW_f3EsnmZg ------------ ###### 自猿其说Tech-JDL京东物流技术发展部 ###### 作者:中台技术部-邢焕杰 ![](//img1.jcloudcs.com/developer.jdcloud.com/d27d9f63-2dfd-4288-ace4-9459d8daaa1320210316091109.png)
原创文章,需联系作者,授权转载
上一篇:在线数据迁移,数字化时代的必修课 —— 京东云数据迁移实践
下一篇:AAAI 2021论文:利用深度元学习对城市销量进行预测(附论文下载)
相关文章
Taro小程序跨端开发入门实战
Flutter For Web实践
配运基础数据缓存瘦身实践
自猿其说Tech
文章数
426
阅读量
2149964
作者其他文章
01
深入JDK中的Optional
本文将从Optional所解决的问题开始,逐层解剖,由浅入深,文中会出现Optioanl方法之间的对比,实践,误用情况分析,优缺点等。与大家一起,对这项Java8中的新特性,进行理解和深入。
01
Taro小程序跨端开发入门实战
为了让小程序开发更简单,更高效,我们采用 Taro 作为首选框架,我们将使用 Taro 的实践经验整理了出来,主要内容围绕着什么是 Taro,为什么用 Taro,以及 Taro 如何使用(正确使用的姿势),还有 Taro 背后的一些设计思想来进行展开,让大家能够对 Taro 有个完整的认识。
01
Flutter For Web实践
Flutter For Web 已经发布一年多时间,它的发布意味着我们可以真正地使用一套代码、一套资源部署整个大前端系统(包括:iOS、Android、Web)。渠道研发组经过一段时间的探索,使用Flutter For Web技术开发了移动端可视化编程平台—Flutter乐高,在这里希望和大家分享下使用Flutter For Web实践过程和踩坑实践
01
配运基础数据缓存瘦身实践
在基础数据的常规能力当中,数据的存取是最基础也是最重要的能力,为了整体提高数据的读取能力,缓存技术在基础数据的场景中得到了广泛的使用,下面会重点展示一下配运组近期针对数据缓存做的瘦身实践。
最新回复
丨
点赞排行
共0条评论
自猿其说Tech
文章数
426
阅读量
2149964
作者其他文章
01
深入JDK中的Optional
01
Taro小程序跨端开发入门实战
01
Flutter For Web实践
01
配运基础数据缓存瘦身实践
添加企业微信
获取1V1专业服务
扫码关注
京东云开发者公众号