小林Coding笔记
1. 应用层是工作在操作系统中的用户态,传输层及以下则工作在内核态。
2. TCP 相比 UDP 多了很多特性,比如流量控制、超时重传、拥塞控制等,这些都是为了保证数据包能可靠地传输给对方。
3. IP 协议的寻址作用是告诉我们去往下一个目的地该朝哪个方向走,路由则是根据「下一个目的地选择路径。寻址更像在导航,路由更像在操作方向盘。

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

根域的 DNS 服务器信息保存在互联网中所有的 DNS 服务器中。这样一来,任何 DNS 服务器就都可以找到并访问根域 DNS 服务器了,因此,客户端只要能够找到任意一台 DNS 服务器,就可以通过它找到根域 DNS 服务器,然后再一路顺藤摸瓜找到位于下层的某台目标 DNS 服务器。
5.域名解析的工作流程
- 客户端首先会发出一个 DNS 请求,问 www.server.com 的IP 是啥,并发给本地 DNS 服务器(也就是客户端的 TCP/IP 设置中填写的 DNS 服务器地址)。
- 本地域名服务器收到客户端的请求后,如果缓存里的表格能找到 www.server.com,则它直接返回 IP 地址。如果没有,本地 DNS 会去问它的根域名服务器:“老大,能告诉我 www.server.com 的 IP 地址吗?"根域名服务器是最高层次的,它不直接用于域名解析,但能指明一条道路。
- 根 DNS 收到来自本地 DNS 的请求后,发现后置是 .com,说:"www.server.com 这个域名归 .com 区域管理”,我给你.com 顶级域名服务器地址给你,你去问问它吧。
- 本地 DNS 收到顶级域名服务器的地址后,发起请求问“老二, 你能告诉我 www.server.com 的IP 地址吗?
- 顶级域名服务器说:“我给你负责 www.server.com 区域的权威 DNS 服务器的地址,你去问它应该能问到”。
- 本地 DNS 于是转向问权威 DNS 服务器:“老三,www.server.com对应的IP是啥呀?"server.com 的权威 DNS 服务器,它是域名解析结果的原出处。为啥叫权威呢?就是我的域名我做主。
- 权威 DNS 服务器査询后将对应的 IP 地址 x.X.Xx告诉本地 DNS。
- 本地 DNS 再将 IP 地址返回客户端,客户端和目标建立连接。

那是不是每次解析域名都要经过那么多的步骤呢?
不是,还有缓存。
浏览器会先看自身有没有对这个域名的缓存,如果有,就直接返回,如果没有,就去问操作系统,操作系统也会去看自己的缓存,如果有,就直接返回,如果没有,再去 hosts 文件看,也没有,才会去问「本地DNS 服务器」。
6. DNS获取到IP后,HTTP的传输工作交给了操作系统中的 协议栈
协议栈分别承担不同工作,上面的部分向下委托工作, 下面的部分收到委托以后工作并执行

应用程序(浏览器)通过调用 Socket 库,来委托协议栈工作。协议栈的上半部分有两块,分别是负责收发数据的 TCP 和 UDP 协议,这两个传输协议会接受应用层的委托执行收发数据的操作。
协议栈的下面一半是用IP 协议控制网络包收发操作,在互联网上传数据时,数据会被切分成一块块的网络包,而将网络包发送给对方的操作就是由IP 负责的。
此外IP中还包括 ICMP协议和ARP 协议。
- ICMP 用于告知网络包传送过程中产生的错误以及各种控制信息。
- ARP 用于根据 IP 地址查询相应的以太网 MAC 地址。
IP 下面的网卡驱动程序负责控制网卡硬件,而最下面的网卡则负责完成实际的收发操作,也就是对网线中的信号执行发送和接收操作。
7. 可靠传输TCP
首先,源端口号 和 目标端口号 是不可少的,如果没有这两个端口号,数据就不知道应该发给哪个应用。
接下来有包的 序号,这个是为了 解决包乱序 的问题。
还有应该有的是 确认号,目的是 确认发出去对方是否有收到。如果没有收到就应该重新发送,直到送达这个是为了解决丢包的问题
接下来还有一些 状态位 。例如 SYN 是发起一个连接,ACK 是回复,RST 是重新连接,FIN 是结束连接等。TCP 是面向连接的,因而双方要维护连接的状态,这些带状态位的包的发送,会引起双方的状态变更。
还有一个重要的就是 窗口大小。TCP 要做 流量控制,通信双方各声明一个窗口(缓存大小),标识自己当前能够的 处理能力,别发送的太快,撑死我,也别发的太慢,饿死我。
除了做流量控制以外,TCP还会做 拥塞控制,对于真正的通路堵车不堵车,它无能为力,唯一能做的就是控制自己,也即 控制发送的速度。不能改变世界,就改变自己嘛。
8. TCP三次握手建立连接

- 一开始,客户端和服务端都处于
CLOSED状态。先是服务端主动监听某个端口,处于LISTEN状态然后客户端主动发起连接SYN,之后处于SYN-SENT状态: - 服务端收到发起的连接,返回
SYN,并且ACK客户端的SYN,之后处于SYN-RCVD状态。 - 客户端收到服务端发送的
SYN和ACK之后,发送对SYN确认的ACK,之后处于ESTABLISHED状态,因为它一发一收成功了, - 服务端收到
ACK的ACK之后,处于ESTABLISHED状态,因为它也一发一收了
所以三次握手 目的 是 保证双方都有发送和接收的能力。
9. 如何查看TCP的连接状态

10. TCP分割数据

如果 HTTP 请求消息比较长, 超过了 MSS 的长度, 这时 TCP 就需要把 HTTP 的数据拆解成一块块的数据发送, 而不是一次性发送全部
MSS : 一个网络包的最大长度, 以太网中一般是 1500 字节
MSS : 除去 IP 和 TCP 头部以后, 一个网络包所能容纳的 TCP 数据的最大长度

11. 假设客户端有多个网卡, 就会有多个 IP 地址, 那么 IP 头部的源地址应该选择哪个?
需要根据 路由表 规则,判断由哪一个网卡作为源地址 IP

遍历的, 将 发送的IP 与 路由表 中每一条条目的 地址掩码 进行 按位与 计算, 把得到的结果 和 Destination 比较, 一致则匹配成功
0.0.0.0 表示 默认网关, 如果其他所有条目都无法匹配, 则会匹配此条