HTTP(HyperText Transfer Protocol)中文叫超文本传输协议,从中文名就知道是传输html文件或者其他超文本文件的

HTTP是基于TCP/IP协议来传输数据的

访问http服务器可以直接通过ip或者域名(域名其实是解析到ip的,实际上还是访问ip),通过web服务器提供的端口来进行请求或者响应

浏览器和web服务器之间通信的架构叫B/S结构(Browser Server),使用的协议是HTTP(https协议其实就是HTTP的基础上,添加了SSL

http是一种协议,制定了客户端与服务端信息数据的传递的规则

从传递文本,到传递图片,音频,视频

HTTP/0.9:于1990年问世,只能用于简单文字的交换,只有GET命令 HTTP/1.0:被正式列为www传输的标准,纳入RFC1945,增加status code和header,支持多字符集,权限,缓存等功能 HTTP/1.1:在1.0的基础上加上了连接方式的规约,持久连接,pipeline,host头 HTTP/2.0:HTTP2.0更安全,性能更好,二进制传输(2之前是字符串传输)

http协议规定了会话是由客户端发起,服务端响应的

客户端常见请求方式有GET,POST

OSI七层模型,http协议是最上层的应用层

应用层,表示层,会话层,传输层,网络层,数据链路层,物理层

数据发送是从应用层到物理层(数据封装)

数据接收是从物理层到应用层(数据解包)

应用层就是为终端提供服务的,例如http,ftp等等

表示层为数据提供压缩,加密等等功能

会话层就是通过会话标识来确定是于哪个应用在通讯

传输层就是定义了数据传输的协议和端口

网络层就是加工数据,为数据添加一些信息,这一层的数据叫做包

数据链路层就是定义了在单个链路上如何传输数据,网络中每台设备都有一个唯一的网络标识(MAC地址),这一层的数据叫做帧

物理层就是物理设备的标准

TCP/IP五层模型:应用层,传输层,网络层,数据链路层和物理层

路由寻址:ip,mac,dhcp服务器

先通过ip实现跨网端通信(如果是本地则直接传输给目标机器,不是则传输给出口路由器,一直到目标路由),然后通过MAC找到目标机器,目标机器获取到数据再根据网络模型向上处理

DNS

DNS域名系统是一个记录IP和域名映射的,域名服务器是分布式的,全世界一共有13台根域名服务器,当域名服务器只要自己解析不了,就会交给根域名服务器处理

解析过程:

机器通过访问本地域名服务器(一般是本地运营商提供,默认解析服务器)查询

本地域名服务器检查缓存,没有就是向根域名服务器的其中一台发起查询请求

根域名服务器根据要查询的结构找到对应的顶级域名服务器(管理全部注册在上面的二级域名服务器)信息发送会本地域名服务器

本地域名服务器向顶级域名服务器发起查询

顶级域名服务器根据域名结构查找到对应的二级域名服务器

反复迭代最终查找到域名和 IP 的对应关系

如果直接设置个公共域名服务器(例如:114,8之类的)能大大提升解析速度

DNS解析的记录类型

A记录

直接将域名解析为IP

CNAME记录

给域名起个cname别名,例如访问了xxx会转发到aaa的域名上

NS记录

域名解析服务器记录,一般用来指定不同子域名对应到不同的解析服务器

MX 记录

电子邮箱服务,将指向邮件服务器地址

CDN加速过程:

用户访问域名地址

因为域名被cdn接管了,域名解析只能获取到CNAME

CDN通过CNAME来将地址代理到cdn服务器上,而不是源站

通过CNAME获取到最近的cdn服务器的Ip地址,然后访问到cdn缓存服务器

cdn缓存服务器再根据策略来判断是否存在该资源缓存,是否要向源站请求数据,再将数据返回给用户

HTTPS协议

通过http通信,经过SSL/TLS来建立安全信道,加密数据,http默认端口为80,https为443

https就是在http协议基础上加了ssl协议

一般服务端需要通过ssl证书来证明自己身份,ssl证书不可逆向,不可伪造,一旦发现伪造或者ssl证书不正确,浏览器一般都会拦截提示

某些需要极其安全的需要客户端也是要证明身份,例如银行网站

SSL协议:保证数据发送到正确目标,数据加密防止数据中途被拦截获取,保证数据完整性,数据不被串改

HTTP方法:定义了对资源的操作,例如GET,POST等等


前端中的HTTP

先进行DNS解析-建立TCP连接(3次握手)-发送HTTP请求获取相关内容-浏览器构建DOM树和CSS树,然后生成渲染树。这个一个渐进式过程,浏览器引擎会力求最快将内容呈现给用户-关闭TCP连接(4次握手)


http常见状态码

1xx 信息 2xx 成功 3xx 重定向 4xx 客户端错误 5xx 服务器错误


域名dns解析,发起TCP的3次握手,建立TCP连接发起http请求,服务器响应http请求,发送资源,浏览器得到资源后进行解析渲染

TCP的三次握手:

握手的目的是进行信息的同步,tcp是一种可靠连接,客户端和服务端会经历建立连接的阶段,而这个建立TCP连接的过程就是所谓的握手(握手实质是发送TCP报文)

第一次握手客户端向服务器发送一个SYN段为1(Seq为随机数)的TCP/IP数据包(客户端进入SYN_SENT状态,已发送同步数据)

第二次握手服务器返回客户端SYN和ACK(SYN为1,ACK为上一次握手Seq的值+1,Seq又为另一个随机数)的TCP/IP数据包(服务端进入SYN_RECVD状态,表示同步数据已收到)

第三次握手客户端返回一个ACK段为上一次握手的Seq的值+1,Seq的值为另一个随机数的TCP/IP数据包给服务器(客户端接收到ACK为1的确认报文,正式进入连接状态)

ACK和Seq实质上是确认服务器和客户端都可以正常响应的(响应没有丢失,并且传输的数据也正确),只有三次握手完成才能建立HTTP连接


TCP四次挥手

TCP四次挥手是指关闭TCP连接的过程(断开TCP连接)

第一次:当客户端的某个数据传输完毕后需要断开连接,向TCP发送FIN=1(报文段),要求停止再发送数据,关闭TCP连接(客户端进入FIN_WAIT_1状态,终止等待)

第二次:服务端收到报文段并且发送确认报文段(ACK=1),进入等待关闭的状态(服务端进入CLOSE_WAIT状态(关闭等待))

第三次:当服务端的数据传输完毕后,服务端发送连接断开的报文段(FIN = 1,ACK=1),进入最后的等待状态(服务端进入LAST_ACK状态,最后的确定)

第四次:当客户端收到服务端的断开的报文段(FIN = 1),并且发送确认的报文段(ACK = 1),进入等待状态(CLOSe状态)

实质上完成四次挥手也是没有断开的,需要经过等待定时器2MSL,才会关闭,保证下一次新连接中不会出现以前连接遗留的报文段

2MSL即两倍的MSL,TCP的TIME_WAIT状态也称为2MSL等待状态

TIME_WAIT状态是为了避免网络问题,导致ACK报文无法被对方接收到,而利用这个时间来重发可能丢失的报文

MSL(Maximum Segment Lifetime)报文最长存活时间,表示报文可以存活的最长时间,而2MSL足以让客户端的报文和服务端的报文都失效了,确保没有当前的连接的报文还存活

注意:如果在等待时间内,接收到了FIN字段的报文将会导致2MSL重新计算,直到没有接收到FIN字段的报文,并且也过了2MSL后才会断开TCP连接


HTTP 1.1可以在一次连接中处理多个请求,请求排队处理,而不像1.0那样每一次请求都要建立单独的TCP连接,每一次请求完毕后,自动释放

设置请求优先级,在一次连接中处理多个请求,必定会出现请求堵塞,因此,给请求设置优先级,重要的请求先得到响应

请求头压缩,基于https的加密协议传输

HTTP 2.0性能提升,可以在一次连接中处理多个请求,而且还是并行进行的,不会出现堵塞问题


const errorMessage = [
    { code: 400, msg: '请求错误' },
    { code: 401, msg: '未授权,请登录' },
    { code: 403, msg: '拒绝访问' },
    { code: 404, msg: '请求地址出错' },
    { code: 408, msg: '请求超时' },
    { code: 500, msg: '服务器内部错误' },
    { code: 501, msg: '服务未实现' },
    { code: 502, msg: '网关错误' },
    { code: 503, msg: '服务不可用' },
    { code: 504, msg: '网关超时' },
    { code: 505, msg: 'HTTP版本不受支持' }
]

http的特点:可以根据协议头的head的数据类型,来完成不同的数据类型的传输,而且能保持连接(http1.0是非长时间连接,这里的保持连接指的是HTTP1.1的KeepAlive),不区分连接者的身份(无法分辨该客户是否访问过)

http请求报文:由请求行(HTTP协议版本,URL字段,方法字段),请求头(向服务端请求要什么类型的什么数据),空行(提示服务端,请求头已经发送,不会再有请求头),请求体(数据)组成

http响应报文:由响应行(HTTP协议版本,状态码),响应头(响应数据是什么类型的),空行(提示客户端,响应已经发送,不会再有响应),响应体(数据)组成

HTTP CODE:表示服务器对请求的处理结果,常见的状态码有404,200,301,502,401等等

TCP心跳机制:客户端每隔一段时间发送心跳包给服务端,通知服务端自己还在线,可以保持长连接

KeepAlive模式(持久连接/连接复用):可以在发送响应后的一段时间内保持连接,并且允许在同一个连接中存在多次数据请求和响应,而非KeepAlive模式就是会在响应后立刻断开连接,再新建一个连接来请求和响应,只有HTTP1.1支持KeepAlive模式

管线化:在持久连接下,会将请求一起打包发送(多请求),然后服务端也是打包响应(多响应),管线化必须在持久连接下完成,而且只有GET和HEAD请求支持管线化,POST有所限制,首次连接不会使用管线化机制(避免服务端不支持HTTP1.1),而且管线化不会影响响应返回的顺序


TCP和UDP区别:tcp在发送之前需要连接,udp在发送之前不需要连接,tcp协议保证发送的数据不丢失(并且按照顺序接收),而udp并不能保证数据可靠,数据不丢失,不重复。tcp是字节流,udp是报文流,UDP没有堵塞系统(在网络堵塞的情况,不会影响源的发送量),tcp连接是点对点,udp的连接是可以一对一,一对多,多对一,多对多的,TCP首部开销为20字节,udp为8字节,tcp为可靠信道,udp为不可靠信道

(TCP可靠在会记录那些数据发送了,又有那些数据被接收了,那些数据没有被接收,数据包按序到达,不允许出现半点差错,tcp连接需要三次握手,四次挥手来建立连接和结束连接)

udp确保传输可靠:传输层已经不可靠,只能在应用层添加可靠传输的机制,例如超时重新发送,添加序号(根据序号有序发送/请求),时间戳等等,或者UDT(UDP-based Data Transfer Protocol)

(TCP在高速长距离网络上性能很差)

udt基于udp协议,引入拥塞控制和数据可靠性控制机制。UDT是面向连接的双向的应用层协议。并且同时支持可靠的数据流传输和部分可靠的数据报传输,支持点对点(p2p)

tcp第三次握手可以携带数据发送(客户端处在ESTABLISHED状态)


http和https

http是无状态协议(无状态指客户端和服务端之间无需建立持久连接,当客户端发送请求,服务端返回响应后将关闭连接,服务端不保留任何有关连接的信息)

https是指基于http协议加上了ssl层,https默认端口为443

对称加密技术:加密和解密使用同一密钥,意味着数据传输过程中需要将密钥也一同传输(这个过程很危险)

非对称加密:加密使用公钥,解密使用私钥(也可反过来),反正加密和解密是分别使用不同的密钥,这个过程是服务端将公钥分发到网络上,客户端获取到该公钥,客户端的数据使用公钥进行加密(无法使用公钥来解密),服务端获取到加密的数据后,通过服务端的私钥进行解密,来获取正文


URL(Uniform Resource Locator,统一资源定位符)

URN(Uniform Resource Name,统一资源名)


流量控制和拥塞控制

流量控制指的是限制(控制)发送者的发送速度,避免发送数据过快,接收者来不及接收,流量控制通过滑动窗口协议(连续ARQ协议)实现,通过接收方返回的ACK包(包含接受窗口大小),利用接受窗口大小来限制(控制)发送方的数据发送

拥塞控制

拥塞控制目的是防止网络负载过大,TCP的4大拥塞控制算法的,慢开始算法,拥塞控制算法,快重传算法,快恢复算法

慢开始算法:通过cwnd(congestion window)值来控制(如果cwnd为1,那么只能发送1个数据报文段)

慢开始算法的思路就是一开始不发送大量的数据,先测一下网络的拥塞的大小,从小到大逐渐增长拥塞窗口,慢开始门限初始值为16,cwnd初始化为一个报文段(慢开始算法只在TCP连接建立时和网络超时才使用)

拥塞控制算法:控制拥塞窗口缓慢增长,思路是每经过一次RTT往返后,拥塞窗口(cwnd)加1,线性缓慢增长,当cwnd=16(慢开始门限),改执行拥塞控制算法,线性增长(当cwnd>=ssthresh时,执行拥塞控制算法),ssthresh指的是慢开始门限

例如:当网络出现拥塞时,将下降慢开始门限(ssthresh)到cwnd/2的值,cwnd设置为1,执行慢开始算法,当cwnd=ssthresh,执行拥塞控制算法

快重传算法:需要接收方收到失序的报文段时立刻发出重复确认(接收连续收到3次同一个重复确认,执行快重传算法,立刻重新发送丢失的数据,不等待超时时间过期),例如某个报文段被超时期限内没有收到确认信息,则认定为网络拥塞了,这时cwnd设置为1,慢开始门限(ssthresh)下降(下降一半)

快恢复算法:快恢复算法是搭配快重传算法使用的,必须发送方接收到3个重复确认,执行快重传算法后才执行快恢复算法,(但是考虑网络出现拥塞可能收不到重复确认,所以发送方会认为网络没有拥塞,设置swnd等于ssthresh/2,执行拥塞控制算法,让cwnd线性增长)

题外扩展1:socket是计算机之间进行通信的一种约定或一种方式,翻译为中文叫套接字,socket起源于unix的进程通信机制,可通过socket来向网络发送请求或者回复网络请求,socket是应用层和TCP/IP协议族通信的抽象层

题外扩展2:webSocket是在单个TCP连接上进行全双工通信(full-duplex)的协议,允许服务端主动向客户端发送数据,在webSocket中,客户端和服务端只需要完成一次握手就是可以建立持久性连接,并且进行双向数据传输


当浏览器访问一个域名时,发送了什么事情?

客户端(浏览器端)访问域名,该域名下的DNS解析服务器将解析出ip地址,并且通过该ip地址找到目标web服务端

客户端通过tcp3次握手和服务端建立TCP连接,客户端根据需求,向web服务端发送http请求报文,向服务器请求所需要的资源文件,web服务端接收到http请求报文,根据要求返回HTTP响应报文

如果请求资源是html文档,则将对应目录下的HTML文档,以响应内容的方式返回给客户端,而当请求资源是php文件或者jsp文件时,由于web服务器无法处理php脚本或者jsp脚本文件,需要委托给专门的php引擎或者jsp引擎,引擎动态解析成html,然后将其返回给web服务器,web服务端再发送给客户端


http的长连接(复用tcp/http连接)

Connection ID:用于区分http连接,不同的http连接,ID是不同的

判断是否是http长连接,通过headers的Connection来判断,如果为keep-alive就是代表该请求是http的长连接完成的,如果是close表示是短连接

因为浏览器限制一个域最大创建6个连接,如果一个域有7个连接需求,就需要等待前面的6个连接其中一个响应完成后再建立连接(连接阻塞)


TCP的可靠性

奇偶校验(在发送的每个字节后加上一位,让字节中为1的数可以是奇数或者偶数,通过奇偶校验来确定数据是否出错)

这里使用的是00001010,a的二进制

奇校验:在字节后补个0,例如:000010100,位为1的数量为偶数(2个)

偶校验:在字节后补个1,例如:000010101,位为1的数量为奇数(3个)

累加和校验(在数据包的最后加入之前全部数据的字节点累加和)

例如:要传输8,10,2,5,12

加上累加后实质的数据包为8,10,2,5,12,37

而且这个37就是前面全部数据的累加校验和,数据接收方只需要对前面的数据进行累加计算,如果这个本地的累加计算和数据包最后一个字节不相同时,认定数据错误,否则数据正确

CRC校验(CRC算法)


DV(域名验证)证书,OV(组织验证)证书,EV(扩展验证)证书

DV ssl证书颁发只验证申请人是否具备域名所有权,OV ssl证书颁发验证申请人的身份证明,确认对方的身份,EV ssl证书颁发最为严格,在验证申请人的身份证明,一般都是银行,金融,电子商务,大型企业,保险等需要最高级别加密才会使用(因为EV证书价格贵)