# 网络基础

# 五层因特网协议栈

从客户端发出http请求到服务器接收,中间会经过一系列的流程:从应用层的发送http请求,到传输层通过三次握手建立tcp/ip连接,再到网络层的ip寻址,再到数据链路层的封装成帧,最后到物理层的利用物理介质传输。服务端的接收就是反过来的步骤。

  1. 应用层(dns,http):DNS解析成IP并发送http请求;
  2. 传输层(tcp,udp):建立tcp连接(三次握手);
  3. 网络层(IP,ARP):IP寻址;
  4. 数据链路层(PPP):封装成帧;
  5. 物理层(利用物理介质传输比特流):物理传输(然后传输的时候通过双绞线,电磁波等各种介质)。

其实也有一个完整的OSI七层框架,与之相比,多了会话层、表示层。 OSI七层框架:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层

# DNS查询流程

如果浏览器url输入的是域名,需要进行dns解析成IP,大致流程:

  1. 浏览器有缓存,直接使用浏览器缓存;否则使用本机缓存;再没有的话就是用host;
  2. 如果本机没有,就向本地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和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如何保证可靠性

  1. 在传递数据之前,会有三次握手来建立连接。
  2. 将数据截断为合理的长度;
  3. 发送端在没有收到响应时,会超时重发;
  4. 对于收到的请求,给出确认响应;
  5. 校验出包有错,丢弃报文段,不给出响应,发送端会超时重发数据;
  6. 对失序数据进行重新排序,然后才交给应用层;
  7. 对于重复数据,能够丢弃重复数据;
  8. TCP 提供流量控制,使用可变大小的滑动窗口协议,防止较快主机致使较慢主机的缓冲区溢出;
    • TCP的流量控制(滑动窗口协议,可变大小),主要就是遵循滑动窗口协议,返回的ACK中会包含自己的接收窗口的大小(ack+wind),并且利用大小来控制发送方的数据发送。
  9. 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(对规范的实现)。
Last Updated: 9/14/2020, 5:59:29 PM