共计 4578 个字符,预计需要花费 12 分钟才能阅读完成。
大家好,我是公众号:java 小杰要加油 ,
明天来分享一个对于计算机网络的知识点——网络到底是怎么连贯的?
- 话不多说,间接开车
浏览器生成音讯且发送
- 发送一个音讯的总体流程如下
生成 HTTP 申请音讯
举个栗子,当咱们在浏览器输出 https://www.jdl.cn/img/servic… 网络地址的时候
浏览器首先会对 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 数据的最大长度
- 而后这数据包,沿着网卡进来,到集线器,路由器一顿传输(两头波及到电信号转换等等),达到服务端那边,再一层一层的扒皮(返回中说过,一层一层的拆分数据包)
断开连接
四次挥手
两台计算机最初连贯完结后要断开连接,进行四次挥手
其实 三次握手 , 四次挥手 还有好多好多知识点要说,像什么为什么握手须要三次,而挥手须要四次啦这些问题,当前我会独自和大家聊这个, 记得收看呀