前言
首发于前端公众号“半路IT”

网络基础
http
首先,http属于一种协议,计算机与网络设备之间进行通讯,双方就必须基于相同的方法,既定一些协议。
超文本传输协议(http)是一个可以传输超媒体文档(例如html)的应用层协议,主要是为web浏览器与web服务器之间的通信而设计。
TCP/IP协议
通常使用的网络是在TCP/IP协议族的基础上运作的,而HTTP属于它内部的一个子集。
计算机与网络设备之间通信,双发就必须基于相同的方法,即定一些协议,比如如何探测到通信目标,谁先发起通信,用何语言等,不同的硬件,操作系统之间的通信,都需要一种规则,称为协议,而TCP/IP是各类协议族的总称。
TCP/IP的分层管理:应用层、传输层、网络层和数据链路层。
应用层:决定了向用户提供应用服务时通信的活动。包括FTP文件传输协议,DNS域名系统和HTTP;
传输层:提供处于网络连接中的两台计算机之间的数据数据传输,包括TCP传输控制协议和UDP用户数据协议;
网络层:处理在网络上流动的数据包;
数据链路层:处理连接网络的硬件部分,如网卡,光纤等物理可见部分;
看一下TCP/IP通信传输流程

解析:
客户端应用层HTTP协议发送请求 —>
传输层TCP协议把从应用层收到的HTTP报文分割,在各个报文上打上标记 序号及端口号后转发给网络层 —>
网络层IP协议增加通信目的地址 —>
服务器端在链路层接收到数据逐层向上 转发,当传输到应用层之后就算真正接收到客户端发送来的HTTP请求
IP(网络层)
IP(协议): 把各种数据包传送给对方;
IP(地址): 是分配给网络上使用网际协议的设备的数字标签,指明了节点被分配到的地址。IP地址主要有两个功能:标识主机或者网络和寻址。
注意⚠️ip协议跟ip地址并不是同一类型。
TCP(传输层)
提供可靠的字节流服务,指为了方便传输,将大块数据分割成以报文段(segment)为单位的数据包进行管理,可靠的传输服务是指把数据准确可靠的传输给对方,即TCP协议为了更容易传送大数据才把数据分割,而且能够确认数据最终是否送达到对方。为了能准确的将数据送到目标处,TCP采用三次握手策略。
DNS(域名解析系统)
提供域名到IP地址之间的解析服务。DNS通过域名查找IP地址或逆向从IP地址反查域名

三次握手

解析:
第一次握手:客户端向服务器发送一段数据包SYN,然后服务器接收到数据包;
第二次握手:服务器根据客户端发来的数据包找到对应的资源,然后将资源SYN返回给客户端,并发送一个确认收到的数据包ACK;
第三次握手:客户端收到服务器返回的资源之后,它要告诉服务器自己已经收到了,所以客户端又发送了一个ACK的数据包告诉服务器它已经收到了。
说到这里,同志们会不会想起面试官经常会问的一个经典问题:为什么http要进行3次握手而不是两次呢?
答:问题本质是,信道不可靠,但是通信双方需要就某个问题达成一致,三次通信时理论上的最小值,因此 3次握手不是TCP的要求,而是为了满足“在不可靠信道上可靠的传输信息”。
如果还是不理解的话,我们举一个有趣的🌰:
小红给小明发信息说:晚上7点钟来我家吃饭吧,我家就我一个人。小明看到之后很兴奋,回道:好的(坏笑)。之后小红就没给小明再发过信息。到了晚上7点,小明着急了:到底要不要去呢?小红也没给我发信息催我,是不是小红的爸妈回来了?!最后,小明没有敢去。(那么这次的信息沟通就以失败告终!)
如果小明回复完之后,小红又回复了小明:好的,一言为定,如果情况有变我会通知你的。(很重要的第三次握手🤝,完整的双方信息沟通,达成一致!)
是不是,小明到了7点钟就会兴冲冲的跑去了呢?
四次挥手🙋

解析:
第一次:客户端发送连接释放报文FIN;
第二次:服务器收到释放信号之后,先发送ACK数据包确认信息收到;
第三次:此时TCP处于半关闭状态,服务器可以继续向客户端发送数据而客户端不能向服务器再发送了,当服务器将数据发送完之后再向客户端发送释放报文FIN以及确认包ACK;
第四次:客户端收到释放报文之后发送确认包ACK,服务器关闭连接。
那么问题来了:为什么建立连接是三次握手,而关闭连接是四次挥手呢?
这是因为建立连接(握手)的时候服务端的LISTEN状态下的SOCKET当收到SYN报文的连接请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接(挥手)时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可能未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
总结:也就是多出了第三步,服务器还要将为发送完的数据继续发送。
各种协议与HTTP的关系
客户端:会根据一个url去访问服务端资源,而服务端并不能解析这个url,此时,DNS派上用场,将对应的ip地址解析出来告诉客户端,客户端利用HTTP生成请求报文,TCP为了方便通信,将请求报文分割成多个报文段,确认数据安全完整的传输。
然后客户端根据ip地址去找对应的服务器并发送数据。
服务端:TCP从客户端接收到报文段并将所有的报文段进行重组,HTTP对web服务器请求的内容进行处理,找到对应的响应资源。最后请求处理的结果同样利用TCP/IP通信协议向用户进行回传。
HTTP状态码

我们经常会遇到4xx或者5xx的错误;
4xx:客户端错误,首先我们需要先检查我们前端是否有错,比如接口地址,传参等,然后再找后端确认为什么找不到对应的资源;
5xx:服务端错误,有可能是数据库方面出了问题,因此该错误主要由服务端的同学去协助排查;
2XX(成功)
- 200 OK,请求成功。
- 204 No content,表示请求成功,但响应报文不含实体的主体部分,即没有资源可返回
- 206 Partial Content,进行范围请求(某个资源返回了一部分,并没有全部返回)
3xx(重定向)
- 301 Moved Permanently:永久性重定向,表示请求的资源已经被分配给了新的url(资源被永久转移);
- 302 Found:临时性重定向,希望用户(本次)使用新的URL访问(资源被临时转移);
- 303 See Other:明确表示客户端采用GET方法获取资源
- 304 Not Modified :资源被找到,但是不符合条件(指采用GET请求报文中包含If-Match,If-Modified-Since,If-Range等任一字段)请求,此时服务器端资源未改变,可直接使用客户端未过期的缓存(注意⚠️:该状态码与重定向无关)
4xx(客户端错误)
- 400 Bad Request:请求报文中存在语法错误
- 401 Unauthorized:表示发送的请求需要有通过 HTTP 认证的认证信息
- 403 Forbidden:表示对请求资源的访问被服务器拒绝
- 404 Not Found:服务器上没有请求的资源
5xx(服务器错误)
- 500 Internal Server Error:服务器故障
- 502 Bad Gateway:作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
- 503 Service Unavailable:服务器处于超负荷或者正在维修(如果服务端知道解除故障所需的时间,可以写入Retry-After告知客户端)
HTTP 请求方法
HTTP 请求方法一般分为 8 种,它们分别是
-
GET 获取资源,GET 方法用来请求访问已被 URI 识别的资源。指定的资源经服务器端解析后返回响应内容。也就是说,如果请求的资源是文本,那就保持原样返回;
-
POST 传输实体,虽然 GET 方法也可以传输主体信息,但是便于区分,我们一般不用 GET 传输实体信息,反而使用 POST 传输实体信息,
-
PUT 传输文件,PUT 方法用来传输文件。就像 FTP 协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求 URI 指定的位置。 但是,鉴于 HTTP 的 PUT 方法自身不带验证机制,任何人都可以上传文件 , 存在安全性问题,因此一般的 W eb 网站不使用该方法。若配合 W eb 应用程序的验证机制,或架构设计采用REST(REpresentational State Transfer,表征状态转移)标准的同类 Web 网站,就可能会开放使用 PUT 方法。
-
HEAD 获得响应首部,HEAD 方法和 GET 方法一样,只是不返回报文主体部分。用于确认 URI 的有效性及资源更新的日期时间等。
-
DELETE 删除文件,DELETE 方法用来删除文件,是与 PUT 相反的方法。DELETE 方法按请求 URI 删除指定的资源。
-
OPTIONS 询问支持的方法,OPTIONS 方法用来查询针对请求 URI 指定的资源支持的方法。
-
TRACE 追踪路径,TRACE 方法是让 Web 服务器端将之前的请求通信环回给客户端的方法。
-
CONNECT 要求用隧道协议连接代理,CONNECT 方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行 TCP 通信。主要使用 SSL(Secure Sockets Layer,安全套接层)和 TLS(Transport Layer Security,传输层安全)协议把通信内容加 密后经网络隧道传输。
HTTP缓存
http缓存是指将服务器返回的资源副本缓存进代理服务器或者客户端本地磁盘;是web性能优化的一个重要手段;
可以移步至:juejin.cn/post/684490… 查看;也可以加深对下边http首部字段的理解;
HTTP首部
通用首部字段
是指请求报文(request header)和响应报文(response header)双方都会使用的报文;


no-cache:虽然客户端对数据做了缓存,但还是强制去服务器请求验证;(这里相信大家之前都会对这个值有误解,一定注意:它不是不缓存);
no-store: 而这个值才是不缓存数据;
max-age:属于http1.1,用来表示缓存数据在多少秒以后失效;
请求首部字段(request header)
定义:是指客户端向服务器端发送请求报文时使用的首部字段;

accept: 通知服务器客户端可以处理的媒体类型以及媒体类型的相对优先级;比如:Accept: text/html; q=0.9
优先级就是指当服务器可返回多种内容时,优先会返回权重值最高当媒体类型;
host:告知服务器请求的资源所处的互联网主机名和端口号;
if-modify-since:服务器根据这个字段传的时间值确认缓存资源的有效性,一般与Last-modifed首部字段做比较,当服务器资源的修改时间晚于该值时,说明服务器资源有被改动过,需要重新给客户端发送新改动后的资源,状态码200;若服务器资源最后修改时间早于该日期,则证明客户端的缓存资源有效,可继续使用,状态码:304;
referer:页面来源,即当前页面是从哪个页面发起跳转过来的;
响应首部字段(response header)
定义:指有服务器向客户端返回响应报文中所使用的字段。

Etag:给返回的资源加一个唯一标志,用于查看资源是否有更新;
Location:提供使客户端重定向的URI,配合3xx状态码使用;
Server:标示服务器软件应用名称,如:Apache/2.2.17;
实体首部字段

Content-length:返回资源的大小;
Content-type:资源媒体类型,如:text/html;charset=UTF-8;
Expires:Expires的值为服务端返回的到期时间,即下一次请求时,请求时间早于服务端返回的到期时间,直接使用缓存数据;
Last-modifed:服务器告诉客户端资源的最后修改时间,一般与if-modify-since做比较;
Cookie
因为http属于无状态协议,所以有了cookie定义,比如当我们需要知道当前用户是不是上次那个刚登陆过的用户,那么cookie就起了非常重要的作用;
Set-Cookie:属于响应首部字段,指定了cookie信息;
Cookie:属于请求首部字段,告知服务器要获得http状态管理的支持;
HTTPS
由于HTTP有一定的缺陷:
- 通信不加密,内容可能被窃听(TCP/IP)
- 不验证通信方的身份,可能会遭遇伪装
- 无法证明报文的完整性,有可能被篡改
因此出现了HTTPS:通过SSL(安全套接层)或TLS(安全传输层协议)组合使用,加密HTTP的通信内容,因此与SSL组合使用的HTTP被成为HTTPS;
SSL
SSL:(Secure Socket Layer,安全套接字层),为Netscape所研发,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取。它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输。 SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。 SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
TLS
TLS:(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。 TLS 1.0是IETF(Internet Engineering Task Force,Internet工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本,可以理解为SSL 3.1,它是写入了 RFC 的。该协议由两层组成: TLS 记录协议(TLS Record)和 TLS 握手协议(TLS Handshake)。较低的层为 TLS 记录协议,位于某个可靠的传输协议(例如 TCP)上面。
总结:当然https也有它的缺陷,由于HTTPS要做两端(客户端、服务端)的加密以及解密处理,消耗CPU和内存等硬件资源较多,比HTTP要慢2到100倍;解决方案是可以使用SSL加速器等硬件改善;