网络综述
1. 网络模型
OSI 7 层模型 | TCP/IP 4 层模型 | 协议 |
---|---|---|
应用层 | ||
表示层 | ||
会话层 | 应用层 | HTTP,FTP等 |
传输层 | 传输层 | TCP,UDP |
网络层 | 网络层 | IP |
数据链路层 | ||
物理层 | 网络接口层 | MAC |
2. 协议
协议 | 协议名 | 协议概述 |
---|---|---|
DNS | 域名解析协议 | 将域名指向 IP,便于人们记忆 |
DHCP | 动态主机配置协议 | 局域网自动分配 IP |
FTP | 文件传输协议 | 远程文件共享 |
HTTP | 超文本传输协议 | 简单请求-响应 |
HTTPS | 安全超文本传输协议 | http + ssl |
ICMP | internet控制信息协议 | 传输网络本身的消息 |
SMTP | 简单邮件传送协议 | 基于 FTP 的邮件服务 |
NAT | 网络地址转换 | 使用少量 IP来代表更多的节点 |
STUN | NAT会话穿越应用程序 | 穿越 NAT 的简单 UDP 传输 |
TCP | 传输控制协议 | 面向连接,可靠的,基于字节流传输层通信协议 |
UDP | 用户数据报协议 | 无连接的报文交换协议 |
2.1. DNS
DNS(Domain Name Server) 域名服务器, 将域名指向 IP,人们通过注册的域名可以方便地访问到网站的一种服务.
以在linux 下 chrome 浏览器地址栏中输入www.baidu.com
为例,内部流程为:
- 查询本地DNS 缓存
a. chrome 本地缓存chrome://net-internals/#dns
b./etc/init.d/nscd
DNS缓存服务
c. hosts 文件/etc/resolv.conf
- 向
Local DNS
服务器(每台 PC 都会有)请求解析域名, Local DNS
服务器迭代的向上一级域名服务器查找直至到根域名服务器- 根域名服务器会解析根域名部分, 把顶级的域名的记录返回给
LDNS
LDNS
服务器向 二级域名服务器进行访问请求,找到一条A 记录
,会把A 记录
返回给LDNS
LDNS
收到A 记录
将其缓存到本地,并把其返回给客户端.- 客户端使用解析的
IP
访问源站.
2.1.1. A 记录和 CNAME
- A 记录 域名解析 IP 地址
- CNAME 域名解析域名, 在需要将多个域名映射到同一个 IP 时,可以将一个域名做 A 记录指向 IP,其他域名做 CNAME 指向该域名.
2.1. DHCP
DHCP(动态主机配置协议)是一个局域网的网络协议.指由服务器控制一段 IP 地址范围,客户机登录服务器时就可以自动获得服务器分配的 IP 地址和子网掩码.
流程:
- 客户端在局域网内发起一个 DHCP Discover 包,
- 可用的DHCP服务器接收到 Discover 包后,通过发送 DHCP offer 包基于客户端应答,告诉它可以提供的 IP 地址
- 客户端收到 Offer 包之后,发送 DHCP Request 包请求分配 IP
- DHCP 服务器发送 Ack 数据包,确认.
2.3. NAT
解决使用私有 IP 来直接访问互联网的问题,使用专用的 NAT 路由器,将私有 IP 转换为全球 IP 地址.解决了全球网络 IP 数量不足的问题,提供了宽带共享和安全
按照NAT 端口映射方式分类
- 全锥形 NAT
一旦内部主机端口对(iAddr:iPort)被NAT网关映射到(eAddr:ePort),所有后续的(iAddr:iPort)报文都会被转换为(eAddr:ePort);任何一个外部主机发送到(eAddr:ePort)的报文将会被转换后发到(iAddr:iPort)。 - 限制锥形 NAT
一旦内部主机端口对(iAddr:iPort)被映射到(eAddr:ePort),所有后续的(iAddr:iPort)报文都会被转换为(eAddr:ePort);只有 (iAddr:iPort)向特定的外部主机hAddr发送过数据,主机hAddr从任意端口发送到(eAddr:ePort)的报文将会被转发到(iAddr:iPort)。 - 端口限制锥形 NAT
一旦内部主机端口对(iAddr:iPort)被映射到(eAddr:ePort),所有后续的(iAddr:iPort)报文都会被转换为(eAddr:ePort);只有(iAddr:iPort)向特定的外部主机端口对(hAddr:hPort)发送过数据,由 (hAddr:hPort)发送到(eAddr:ePort)的报文将会被转发到(iAddr:iPort)。 - 对称性NAT
NAT网关会把内部主机“地址端口对”和外部主机“地址端口对”完全相同的报文看作一个连接,在网关上创建一个公网“地址端口对”映射进行转换,只有收到报文的外部主机从对应的端口对发送回应的报文,才能被转换。即使内部主机使用之前用过的地址端口对去连接不同外部主机(或端口)时,NAT网关也会建立新的映射关系。
2.4. TCP
TCP(Transmission Control Protocol)传输控制协议,面向连接的、可靠的、基于字节流的传输层通信协议.
TCP 首部结构
- 16 位 源端口号
- 16 位 目的端口号
- 32 位 序号
- 32 位 确认序号
- 4 位 首部长度
- 6 位 保留
- 6 位 标志位, URG(紧急指针),ACK(确认),PSH(立即从 TCP 缓冲区读走), RST(复位),SYN(同步), FIN(结束)
- 16 位 窗口大小
- 16 位 校验和
- 16 位 紧急指针
- 选项
- 数据
2.4.1 三次握手和四次挥手
2.4.2 拥塞控制
由慢开始、拥塞避免、快重传、快恢复四个核心算法组成 拥塞窗口(cwnd),其大小取决于网络的拥塞控制,并且动态地在变化
- 慢开始 指数增长cwnd大小
- 拥塞避免 线性增长cwnd大小
- 快重传 接收方收到失序的报文段发送重复确认,发送方收到3个重复确认就认为前面的已经丢失,不必等待超时重传处罚
- 快恢复 收到3个重复确认后,发送方认为网络很可能没有拥塞,ssthresh减半,把cwnd设为ssthresh,并直接执行拥塞避免算法
- 初始时cwnd大小为1,并执行慢开算法,指数增长大小,
- 当cwnd超过设置值(ssthresh),执行拥塞避免算法,线性增长拥塞窗口
- 当网络拥塞时将ssthresh设置为当前一半,并将cwnd置为1
- 如果收到 3 个重复的确认,就不必等待其之前未确认的包超时直接重复
- 且因为收到 3 个重复的确认,可以认为网络没有拥塞,将ssthresh减半,把cwnd设为ssthresh,并直接执行拥塞避免算法
2.4.3 TIME_WAIT
即主动关闭TCP 连接的一方在连接断开后,连接状态在进入2MSL 的 TIME_WAIT 状态后在进入 CLOSE 状态.理由如下
- 确保最后一个确认报文能够到达. 如果没能到达被动关闭的一方会再次发送 FIN 请求释放连接,这有一定的概率终结掉再次建立的连接(如果没有 TIME_WAIT 的话).
- 让本连接发送的所有报文在网络中消失,防止新的连接收到旧的报文.
2.5 HTTP
http 请求格式
- 请求行:
请求方法
+URL
+协议版本
- 请求头部:
头部字段名: 值
- 请求正文
http 响应格式
- 响应行:
协议版本
+状态码
+状态
- 响应头部:
头部字段名: 值
- 响应正文
2.5.1 HTTP 1.1 流水线
在一个 TCP 连接上可以传送多个 HTTP 请求和响应,减少了建立和关闭连接的消耗和延迟.但服务端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容.
2.5.2 HTTP 2.0
特点:
- 引入二进制分帧层介于 HTTP 应用层和 TCP 传输层之间,并分别构建头信息帧和数据帧.
- 首部压缩: 对 header 压缩,并在两端维护索引表,用于记录出现过的 header,传输对应键名就可以找到对应的值
- 多路复用: 每一个 TCP 连接里有多个流, 交错传输的帧最后组装成完整的数据
- 请求优先级: 优化帧的交错和传输顺序
- 服务器推送: 主动向客户端推送需要但未请求的东西
2.5.3 HTTPS
即 HTTP + SSL
https流程:
- 客户端发送请求,告诉服务端自己支持的加密算法
- 服务端向客户端发送自己的证书(公钥, 网站地址, 证书颁发机构,失效日期等)
- 客户端验证证书合法性
- 生成对称加密秘钥,使用服务端公钥加密后传输给服务端
- 服务端使用私钥解密得到对称加密公钥.
- 后续使用该秘钥加密传输
https 证书
由可信机构颁发的多层级的证书,使用上级机构证书的公钥加密其颁发的证书得到数字指纹,然后对本机证书的公钥进行数字摘要算法,与数字指纹对比,相同则代表安全.