Skip to content

小林Coding笔记

TIP

本篇记录了本人阅读《小林Coding网络篇》的笔记

笔记可能比较繁杂,有什么记什么

可能需要停一下, 我发现边看边记效率太低了, 先整体看完再说比较好

跳转到小林coding

1. 应用层是工作在操作系统中的用户态,传输层及以下则工作在内核态。

2. TCP 相比 UDP 多了很多特性,比如流量控制、超时重传、拥塞控制等,这些都是为了保证数据包能可靠地传输给对方。

3. IP 协议的寻址作用是告诉我们去往下一个目的地该朝哪个方向走,路由则是根据「下一个目的地选择路径。寻址更像在导航,路由更像在操作方向盘。

IP地址的网络号

4. 域名是以“句点.”分隔开的,越靠右的位置表示其层级越高。实际域名最后还有一个点

比如www.server.com实际是www.server.com. , 最后一个 . 表示跟域名

DNS 树状结构

根域的 DNS 服务器信息保存在互联网中所有的 DNS 服务器中。这样一来,任何 DNS 服务器就都可以找到并访问根域 DNS 服务器了,因此,客户端只要能够找到任意一台 DNS 服务器,就可以通过它找到根域 DNS 服务器,然后再一路顺藤摸瓜找到位于下层的某台目标 DNS 服务器。

5.域名解析的工作流程

  1. 客户端首先会发出一个 DNS 请求,问 www.server.com 的IP 是啥,并发给本地 DNS 服务器(也就是客户端的 TCP/IP 设置中填写的 DNS 服务器地址)。
  2. 本地域名服务器收到客户端的请求后,如果缓存里的表格能找到 www.server.com,则它直接返回 IP 地址。如果没有,本地 DNS 会去问它的根域名服务器:“老大,能告诉我 www.server.com 的 IP 地址吗?"根域名服务器是最高层次的,它不直接用于域名解析,但能指明一条道路。
  3. 根 DNS 收到来自本地 DNS 的请求后,发现后置是 .com,说:"www.server.com 这个域名归 .com 区域管理”,我给你.com 顶级域名服务器地址给你,你去问问它吧。
  4. 本地 DNS 收到顶级域名服务器的地址后,发起请求问“老二, 你能告诉我 www.server.com 的IP 地址吗?
  5. 顶级域名服务器说:“我给你负责 www.server.com 区域的权威 DNS 服务器的地址,你去问它应该能问到”。
  6. 本地 DNS 于是转向问权威 DNS 服务器:“老三,www.server.com对应的IP是啥呀?"server.com 的权威 DNS 服务器,它是域名解析结果的原出处。为啥叫权威呢?就是我的域名我做主。
  7. 权威 DNS 服务器査询后将对应的 IP 地址 x.X.Xx告诉本地 DNS。
  8. 本地 DNS 再将 IP 地址返回客户端,客户端和目标建立连接。

域名解析的工作流程

那是不是每次解析域名都要经过那么多的步骤呢?

不是,还有缓存。

浏览器会先看自身有没有对这个域名的缓存,如果有,就直接返回,如果没有,就去问操作系统,操作系统也会去看自己的缓存,如果有,就直接返回,如果没有,再去 hosts 文件看,也没有,才会去问「本地DNS 服务器」。

6. DNS获取到IP后,HTTP的传输工作交给了操作系统中的 协议栈

协议栈分别承担不同工作,上面的部分向下委托工作, 下面的部分收到委托以后工作并执行

img

应用程序(浏览器)通过调用 Socket 库,来委托协议栈工作。协议栈的上半部分有两块,分别是负责收发数据的 TCP 和 UDP 协议,这两个传输协议会接受应用层的委托执行收发数据的操作。

协议栈的下面一半是用IP 协议控制网络包收发操作,在互联网上传数据时,数据会被切分成一块块的网络包,而将网络包发送给对方的操作就是由IP 负责的。

此外IP中还包括 ICMP协议和ARP 协议。

  • ICMP 用于告知网络包传送过程中产生的错误以及各种控制信息。
  • ARP 用于根据 IP 地址查询相应的以太网 MAC 地址。

IP 下面的网卡驱动程序负责控制网卡硬件,而最下面的网卡则负责完成实际的收发操作,也就是对网线中的信号执行发送和接收操作。

7. 可靠传输TCP

首先,源端口号目标端口号 是不可少的,如果没有这两个端口号,数据就不知道应该发给哪个应用。

接下来有包的 序号,这个是为了 解决包乱序 的问题。

还有应该有的是 确认号,目的是 确认发出去对方是否有收到。如果没有收到就应该重新发送,直到送达这个是为了解决丢包的问题

接下来还有一些 状态位 。例如 SYN 是发起一个连接,ACK 是回复,RST 是重新连接,FIN 是结束连接等。TCP 是面向连接的,因而双方要维护连接的状态,这些带状态位的包的发送,会引起双方的状态变更。

还有一个重要的就是 窗口大小。TCP 要做 流量控制,通信双方各声明一个窗口(缓存大小),标识自己当前能够的 处理能力,别发送的太快,撑死我,也别发的太慢,饿死我。

除了做流量控制以外,TCP还会做 拥塞控制,对于真正的通路堵车不堵车,它无能为力,唯一能做的就是控制自己,也即 控制发送的速度。不能改变世界,就改变自己嘛。

8. TCP三次握手建立连接

TCP 三次握手

  • 一开始,客户端和服务端都处于 CLOSED 状态。先是服务端主动监听某个端口,处于 LISTEN 状态然后客户端主动发起连接 SYN,之后处于 SYN-SENT 状态:
  • 服务端收到发起的连接,返回SYN,并且 ACK 客户端的 SYN,之后处于 SYN-RCVD 状态。
  • 客户端收到服务端发送的 SYNACK 之后,发送对 SYN 确认的 ACK,之后处于 ESTABLISHED 状态,因为它一发一收成功了,
  • 服务端收到 ACKACK 之后,处于 ESTABLISHED 状态,因为它也一发一收了

所以三次握手 目的保证双方都有发送和接收的能力

9. 如何查看TCP的连接状态

TCP 连接状态查看

10. TCP分割数据

MTU 与 MSS

如果 HTTP 请求消息比较长, 超过了 MSS 的长度, 这时 TCP 就需要把 HTTP 的数据拆解成一块块的数据发送, 而不是一次性发送全部

  • MSS : 一个网络包的最大长度, 以太网中一般是 1500 字节

  • MSS : 除去 IP 和 TCP 头部以后, 一个网络包所能容纳的 TCP 数据的最大长度

    数据包分割

11. 假设客户端有多个网卡, 就会有多个 IP 地址, 那么 IP 头部的源地址应该选择哪个?

需要根据 路由表 规则,判断由哪一个网卡作为源地址 IP

路由规则判断

遍历的, 将 发送的IP路由表 中每一条条目的 地址掩码 进行 按位与 计算, 把得到的结果 和 Destination 比较, 一致则匹配成功

0.0.0.0 表示 默认网关, 如果其他所有条目都无法匹配, 则会匹配此条

技术漫游

本站访客数 人次 本站总访问量