# 网络基础
# 五层因特网协议栈
从客户端发出http请求到服务器接收,中间会经过一系列的流程:从应用层的发送http请求,到传输层通过三次握手建立tcp/ip连接,再到网络层的ip寻址,再到数据链路层的封装成帧,最后到物理层的利用物理介质传输。服务端的接收就是反过来的步骤。
- 应用层(dns,http):DNS解析成IP并发送http请求;
- 传输层(tcp,udp):建立tcp连接(三次握手);
- 网络层(IP,ARP):IP寻址;
- 数据链路层(PPP):封装成帧;
- 物理层(利用物理介质传输比特流):物理传输(然后传输的时候通过双绞线,电磁波等各种介质)。
其实也有一个完整的OSI七层框架,与之相比,多了会话层、表示层。 OSI七层框架:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
# DNS查询流程
如果浏览器url输入的是域名,需要进行dns解析成IP,大致流程:
- 浏览器有缓存,直接使用浏览器缓存;否则使用本机缓存;再没有的话就是用host;
- 如果本机没有,就向本地dns域名服务器查询(递归),本地dns域名服务器再(迭代)从根域到二级到主机域名一层层查询到对应的IP,最后(递归)返回给本机。
注意:dns解析是很耗时的,因此如果解析域名过多,会让首屏加载变得过慢,可以考虑dns-prefetch优化。
域名组成
域名分为三部分: 主机名 + 公司名 + com(cn 等等),当然还有更复杂的,但是一般第一个 www 就是主机名,所以 news.sina.com、sport.sina.com 中的 news、sport 都属于主机名。
顶级域名有国家顶级域名(cn、jp、us),国际顶级域名(com、gov、org、net)
.com 顶级域名
baidu.com 一级域名
www.baidu.com 二级域名
bbs.baidu.com 二级域名
tieba.baidu.com 二级域名
# tcp/ip
# TCP、UDP的工作原理
- http的本质就是tcp/ip请求,tcp将http长报文划分为短报文,通过三次握手与服务端建立连接,进行可靠传输。
- tcp与udp都属于传输层协议,用来确认传输是否可靠:
- tcp是传输控制协议,是
可靠传输
,保证传输的数据一定不丢; - udp是用户数据报协议,更快但
不可靠
,可能会丢失数据。
- tcp是传输控制协议,是
# TCP和UDP的区别
- TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接。
- TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。
- TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道。
- TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的。UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)。
- TCP首部开销20字节;UDP的首部开销小,只有8个字节。
- 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信。
- 基于TCP协议的应用层协议:http、ftp、telnet、smtp;
- 基于UDP协议的应用层协议:dns、rip、tftp;
# TCP如何保证可靠性
- 在传递数据之前,会有三次握手来建立连接。
- 将数据截断为合理的长度;
- 发送端在没有收到响应时,会超时重发;
- 对于收到的请求,给出确认响应;
- 校验出包有错,丢弃报文段,不给出响应,发送端会超时重发数据;
- 对失序数据进行重新排序,然后才交给应用层;
- 对于重复数据,能够丢弃重复数据;
- TCP 提供
流量控制
,使用可变大小的滑动窗口协议,防止较快主机致使较慢主机的缓冲区溢出;- TCP的流量控制(滑动窗口协议,可变大小),主要就是遵循滑动窗口协议,返回的ACK中会包含自己的接收窗口的大小(ack+wind),并且利用大小来控制发送方的数据发送。
- TCP 还能提供
拥塞控制
。当网络拥塞时,减少数据的发送。- TCP的拥塞控制(应对”网络风暴“),为了在发送端调节所要发送的数据量,定义了一个“拥塞窗口”,并通过4个算法做调解(1.慢启动、2.拥塞避免、3.快重传、4.快恢复)
- 什么是网络风暴呢?TCP通过定时器采样了往返时延,从而计算重传超时时间。但如果网络时延突然增加,造成丢包,TCP为了保证可靠传输会重传数据,进而造成更严重的拥塞,更多时延和丢包的恶性循环,这就是“网络风暴”
# 三次握手与四次挥手
(抽象三次握手
,序列号是SYN,确认码是ACK):
- 1)客户端:hello,你是server么?(客户端发送序列号X;服务端接收序列号X);
- 2)服务端:hello,我是server,你是client么(服务端发送序列号Y,确认码X+1;客户端接收序列号Y,确认码X+1);
- 3)客户端:yes,我是client(客户端发送确认码Y+1,服务端接收确认码Y+1)。 建立连接成功后,接下来就正式传输数据.
为什么三次握手
三次握手的最主要目的是保证连接是双工的
,可靠更多的是通过重传机制来保证的。
然后,待到断开连接时,需要进行四次挥手
(因为是全双工的,所以需要四次挥手,抽象四次挥手):
- 1)主动方:我已经关闭了向你那边的主动通道了,只能被动接收了;
- 2)被动方:收到通道关闭的信息;
- 3)被动方:那我也告诉你,我这边向你的主动通道也关闭了;
- 4)主动方:最后收到数据,之后双方无法通信;
# tcp/ip的并发限制
浏览器对同一域名下并发的tcp连接是有限制的(2-6个不等)
,而且在http1.0中往往一个资源下载就需要对应一个tcp/ip请求,所以针对这个瓶颈,又出现了很多的资源优化方案,但随着http2.0发展,这些都没什么用了。
# get和post的区别
get和post虽然本质都是tcp/ip,但两者除了在http层面外,在tcp/ip层面也有区别:
get会产生一个tcp数据包,post两个
:- get请求时,浏览器会把headers和data一起发送出去,服务器响应200(返回数据);
- post请求时,浏览器先发送headers,服务器响应100 continue,浏览器再发送data,服务器响应200(返回数据)。
- 这里的区别是specification(规范)层面,而不是implementation(对规范的实现)。