1.OSI TCP/IP模型简介
先简单介绍一下计算机网络的基础之基础,OSI模型以及实际应用中常用的TCP/IP模型。
OSI模型 | TCP/IP模型 | 作用 | 常用协议 |
---|---|---|---|
应用层 (Application Layer) | 应用层 (Application Layer) | 为应用程序提供网络服务接口,处理高层数据传输 | HTTP, FTP, SMTP, DNS, Telnet |
表示层 (Presentation Layer) | (合并到应用层) | 负责数据格式转换、加密、解密、压缩 | SSL, TLS, JPEG, MPEG |
会话层 (Session Layer) | (合并到应用层) | 管理应用程序之间的会话,建立、维持和终止通信会话,表示的是应用程序与应用程序的连接 | NetBIOS, RPC |
传输层 (Transport Layer) | 传输层 (Transport Layer) | 提供端到端的传输服务,负责可靠性和流量控制 | TCP, UDP |
网络层 (Network Layer) | 网络层 (Internet Layer) | 负责路由选择和数据包在不同网络之间的传输,表示的是传播的路径 | IP (IPv4, IPv6), ICMP, IGMP |
数据链路层 (Data Link Layer) | 网络接口层 (Network Interface Layer) | 负责数据帧的传输,提供节点之间的可靠连接 | 以太网, PPP, ARP, RARP |
物理层 (Physical Layer) | 网络接口层 (Network Interface Layer) | 负责比特流的物理传输,通过物理媒介进行数据传输。表示的是物理性质。如光纤的性能 | Ethernet (物理层方面), IEEE 802.11 |
协议
应用层协议
常用的浏览器使用的HTTP协议,文件传输使用的FTP协议,进行域名解析的DNS协议都是在这一层。这里讲解一下DNS协议,下文会讲到HTTP协议。
DNS域名解析流程
浏览器检查缓存:
- 用户在浏览器中输入网址(例如,
www.example.com
)。- 浏览器首先检查本地缓存中是否有该域名对应的IP地址(通常是临时存储的DNS记录),如果有,则直接使用此IP地址,解析过程结束。
操作系统缓存检查:
- 如果浏览器缓存中没有找到,操作系统会检查自己的DNS缓存(这一级别通常是在操作系统层面存储的DNS记录)。
- 如果操作系统缓存中有对应的IP地址,也会直接使用此IP地址,解析过程结束。
查询本地DNS服务器:
- 如果操作系统缓存中没有对应的记录,浏览器会向本地配置的DNS服务器(通常是由互联网服务提供商(ISP)提供的DNS服务器)发送DNS请求,询问该域名对应的IP地址。
本地DNS服务器检查缓存:
- 本地DNS服务器会先检查自己缓存中是否有该域名对应的IP地址。如果有,则返回IP地址给浏览器,解析过程结束。
向根DNS服务器发起请求:
- 如果本地DNS服务器的缓存中没有该域名的记录,它会向DNS系统的根DNS服务器发起查询请求。根DNS服务器不直接提供域名的IP地址,但它会返回顶级域(例如
.com
)的DNS服务器地址。查询顶级域DNS服务器:
- 本地DNS服务器接收到根DNS服务器返回的顶级域(例如
.com
)DNS服务器的地址后,会向该顶级域DNS服务器发起查询,询问该域名(example.com
)的权威DNS服务器地址。查询权威DNS服务器:
- 顶级域DNS服务器返回的是
example.com
的权威DNS服务器的地址。本地DNS服务器接收到后,再向这个权威DNS服务器发起请求,询问具体的子域名(例如www.example.com
)的IP地址。权威DNS服务器返回IP地址:
- 权威DNS服务器返回该域名(例如
www.example.com
)的实际IP地址给本地DNS服务器。缓存并返回IP地址:
- 本地DNS服务器接收到权威DNS服务器的回复后,将域名与IP地址的映射关系缓存一段时间(根据TTL值),并将IP地址返回给发起请求的浏览器。
建立连接:
- 浏览器收到IP地址后,使用该IP地址向服务器发起TCP连接(如通过HTTP或HTTPS协议),并开始与目标服务器的通信。
传输层协议
TCP
主要是TCP协议以及UDP协议,先看一下TCP协议。
TCP头20个字节,包括源端口 目的端口 序列号 确认序号等,是可靠的,需要建立连接的协议。
讲到TCP协议,必不可少的是建立连接的三次握手和四次挥手。
三次握手
简单而言,客户端向服务器端发送SYN数据包,客户端进入SYN-SENT状态,服务器端回SYN和ACK数据包,然后服务器端从LISTEN状态进入SYN-RCVD状态,客户端发送ACK数据包然后进入ESTABLISHED状态,服务器端接收ACK包进入ESTABLISHED状态。
四次挥手
客户端发送FI9N数据包,进入FIN_WAIT_1状态,服务端接收FIN数据包,进入Close_wa状态,然后向客户端发送ACK数据包,客户端接收ACK数据包进入FIN_WAIT_2状态。服务端需要确认客户端有没有接收到数据包,再发送一个FIN和ACK数据举报,进入LAT_ACK状态,然后客户端接收数据包,进入TIME_WAIT状态,并向服务端发送ACK数据包,表示自己接收到了数据包,进入TIME_WAIT(计时等待状态),服务端接收数据包,服务端和客户端关闭连接。
UDP
UDP头是8个字节,包括源端口 目的端口 UDP长度 校验和,是不可靠的,不需要建立连接的协议。需要注意的是TCP和UDP都是不安全的协议,安全的协议是HTTPS,这里会在后文中介绍。
网络层协议
IP协议
这里主要介绍IP协议,和TCP一样,首部也是20个字节,有源IP地址和目的IP地址,但是没有源端口和目的端口。
ICMP(Internet Control Message Protocol) 报文控制协议
在进行网络测试用到的ping命令就是用的ICMP报文控制协议,看目标可不可达。
- ICMP Echo Request:源主机发送一个 ICMP Echo Request(ping 请求)到目标主机,测试其连通性。
- ICMP Echo Reply:目标主机接收到 ping 请求后,发送 ICMP Echo Reply(ping 响应)回源主机。
- 结果:源主机接收到响应后,可以计算往返时间(Round-Trip Time, RTT),以判断连接质量。
数据链路层
ARP协议 RARP协议
ARP协议就是将IP映射成MAC地址,RRAP就是MAC映射成MAC地址。
源主机向局域网内的主机广播"IP未192.168.1.2的MAC地址是多少”,局域网内的IP地址不为192.168.1.2的主机会丢弃这个报文,IP地址符合的主机会解析这条报文,并将“IP地址为192.168.1.2的主机的MAC地址为XXX”单播出去,这样的源主机就获得了目标主机的MAC地址,并缓存这条记录。
PPP协议
ppp就是点对点协议,也就是一台主机只与一台主机进行通信。详细来说就是用于在两个直接连接的节点之间传输数据的通信协议,广泛应用于拨号连接、DSL、ISDN等场景下的广域网(WAN)连接。它支持多种网络层协议,并提供了认证、加密、压缩等功能。这里不再过多赘述,详细可上网搜索。
物理层
物理层考的比较少。
HTTP/HTTPS
这里需要将HTTP/HTTPS单独讲,因为是一个涉及范围相对较大的知识点,同事可以把OSI模型串起来。以在浏览器中输入baidu.com这个网址为例,讲一下实际会发生什么。
域名解析
- 客户端应用层发送报文”baidu.com的IP地址是多少"
- 传递到传输层,加上TCP头,20字节,操作系统分配一个源端口,加上一个目的端口53
- 传递到网络层,加上IP头,20字节,获取本机IP地址作为源IP地址,还有目的IP192.168.3.4.
- 操作系统看到源IP地址和目的IP地址不在一个网段内,这时数据报文就要给网关192.168.3.1们也就是路由器LAN口的IP地址。
- 传递到链路层,加上帧头,通过ARP协议通过IP地址获取MAC地址,假如目的IP地址未为192.168.3.4。那么将广播“请问192.168.3.1的IP地址是多少”,局域网内的主机收到请求,检查IP地址是否与本机一致,不一致则丢弃包,网关也就是路由器的LAN口接收请求,发现与IP地址一致,将自己的MAC地址单播发送给客户端。客户端发送报文,局域网内所有主机都会收到报文,只有路由器LAN口的MAC地址与报文的MAC地址一致,然后网上网络层传输;
- 网络层收到数据包后,检查源IP地址和目的IP地址,将私有IP转为公网IP,并将端口改掉,将记录存到NAT表中。
- 从路由器WAN口发出去的IP为公网IP,向根DNS服务器发起请求,查询缓存中是否有域名相应IP地址,如果没有,则通过权威DNS服务器一层一层递归返回数据报文“baidu.com的IP地址是xx.xxx.xx"。
- 路由器在LAN口将数据报文广播发出去。客户端查询IP地址是字节,博取数据链路层的帧头,给网络层,网络层查看IP地址,剥去IP头传给传输层。
- 传输层解析端口,再给DNS客户端,这时候DNS就知道IP地址了
HTTP如何传输大文件
HTTP存在的问题
因为建立连接要三次握手,四次挥手,需要3个RTT,获取资源需要2个RTT,这样就会浪费60%的时间资源。HTTP1.x引入了cookie解决无状态的问题,HTTP2主要解决性能问题,主要解决两个问题:包头过大,队列阻塞。
包头过大,使用HPACK算法,客户端和服务端共同维护一张表,压缩和解压缩就是查表和更新表达的操作。将请求方法/状态码等变成头字段的形式,除此之外,还会用哈夫曼编码来压缩整数和字符串。HTTP1.x是请求应答模式,HTTP2.x是采用的二进制分帧和流式传播来解决这个问题。
流式传播,在里面流动了一串有先后顺序的数据帧。这些数据帧按照次序组装起来就是HTTP1里的请求报文和响应报文。HTTP2可以在一个TCP连接上用。
HTTP/HTTPS对比
HTTP | HTTPS |
明文传输 | 使用到了SSL和HTTP,数据传输过程是加密的,安全性较好 |
端口,TCP 80 | 端口 TCP 443 |
响应速度较快 只需要TCP三次握手建立连接,客户端和服务器只需要交换三个包 | 除了TCP的三个包,还需要ssl握手的9个包,一共是12个包 |
耗费资源较少 | 建立在SSL/TLS之上的HTTP协议,比较耗费资源 |
无额外费用 | 需要申请CA证书,有额外费用 |
HTTPS的安全性
https主要是提供对网站服务器的身份验证,保护交换数据的隐私和安全性。这里还需介绍堆成加密和非对称加密的概念。
对称加密就是发送方和接收方都是一个密钥,非对称加密就是发送方和接收方的密钥不一致,常分为公钥和私钥,公钥是可分享给他人的密钥,私钥就是不可分享给他人,私有的密钥。