网络基础
OSI七层参考模型
物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
TCP/IP五层协议
物理层、数据链路层、网络层、传输层、应用层
物理层作用
主要解决两台物理机之间的通信,通过二进制比特流的传输来实现,二进制数据表现为电流电压上的强弱,到达目的地再转换成二进制的机器码。网卡、集线器工作在这一层。
数据链路层作用
在不可靠的物理介质上提供可靠的传输,接收来自物理层的比特流形式的数据,并封装成帧,传送到上一层。同样,也将来自上层的数据帧,拆装成比特流形式的数据转发到物理层。这一层在物理层提供的比特流的基础上,通过差错控制,流量控制方法,使有差错的物理线路变为无差错的数据链路。提供物理地址寻址功能,交换机工作在这一层。
网络层作用
将网络地址翻译成对应的物理地址,并决定如何将数据从发送方路由到接收方。通过路由选择算法为分组通过通信子网选择最佳路径。路由器工作在这一层。
传输层作用
传输层提供了进程间的逻辑通信,传输层向高层用户屏蔽了下面网络层的核心细节,使应用程序看起来像是在两个传输层实体之间有一条端到端的逻辑通信信道。
会话层作用
建立会话:身份验证,权限鉴定等
保持会话:对该会话进行维护,在会话维持期间两者可以随时使用这条会话传输。
断开会话:当应用程序或者应用层规定的超时时间到期后,OSI会话层才会释放这条会话。
表示层作用
对数据格式进行编译,对收到或者发出的数据根据应用层的特征进行处理,如处理为文字,图片,音频,视频,文档等,还可以对压缩文件进行解压缩,对加密文件进行揭秘等。
应用层作用
提供应用层协议,如HTTP协议,FTP协议等,方便应用程序之间进行通信。
TCP/UDP区别
TCP作为面向流的协议,提供可靠的,面向连接的传输服务,并且提供点对点通信。
UDP作为面向报文的协议,不提供可靠交付,并且不需要连接,不仅支持对点对,也支持多播和广播。
TCP为何可靠
TCP有三次握手建立连接,四次握手关闭连接的机制。除此之外还有滑动窗口和拥塞控制算法。最关键的还保留超时重传的机制。对于每份报文也存在校验,保证每份报文可靠性。
UDP为何不可靠
UDP面向数据报文,是无连接的,数据报发送出去,就不保留数据备份了。仅仅在IP数据报头部加入校验和复用。UDP没有服务器和客户端的概念。UDP报文过长的话是交给IP切割成小段,如果某段报废,报文就废了。
TCP粘包现象
TCP是面向流协议,发送的单位是字节流,因此会将多个小尺寸的数据封装在一个TCP报文中发出去的可能性。可以简单的理解为客户端用了两次send,服务端一个recv就把信息读出来了。
TCP粘包现象处理方法
固定发送信息长度,或在两个信息之间加入分隔符。
TCP协议的滑动窗口
滑动窗口是传输层进行流量控制的一种措施,接收方通过通告发送方自己的窗口大小,从而控制发送方的发送速度,防止发送发发送速度过快而导致自己被淹没。
TCP的拥塞算法
拥塞是指一个或多个交换节点的数据报超载,TCP又会有重传机制,导致过载。
为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量。
当cwnd < ssthresh时,使用慢开始算法,
当cwnd > ssthresh时,停止使用慢开始算法,而改用拥塞避免算法。
当cwnd = ssthresh时,既可停止使用慢开始算法,也可使用拥塞避免算法。
慢开始:由小到大逐渐增加拥塞窗口的大小,每接一次报文,cwnd指数增加。
拥塞避免:cwnd缓慢地增大,即每经过一个往返时间RTT就把发送三方的拥塞窗口cwnd加1。
快恢复之前的策略:发送方判断网络出现拥塞,就把ssthresh设置为出现拥塞时发送方窗口值的一办,继续执行慢开始,之后进行拥塞避免。
快恢复:发送方判断网络出现拥塞,就把ssthresh设置为出现拥塞时发送发窗口值的一般,并把cwnd设置为ssthresh的一半,之后进行拥塞避免。
简述快重传
如果在超时重传定时器溢出之前,接收到连续的三个重复冗余ACK,发送端便知晓哪个报文在传输过程中丢失了,于是重发该报文,不需要等待重传超时定时器溢出再发送该报文。
TCP三次握手过程
- 第一次握手:客户端将标志位SYN置为1,随机产生一个值序列号seq=x,并将该数据包发送给服务端,客户端进入syn_sent状态,等待服务端确认。
- 第二次握手:服务端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务端将标志位SYN和ACK都置为1,ack=x+1,随机产生一个值seq=y,并将该数据包发送给客户端确认连接请求,服务端进入syn_rcvd状态。
- 第三次握手:客户端收到确认后检查,如果正确则将标志位ACK置为2,ack=y+1,并将该数据包发送给服务端,服务端进行检查如果正确则连连接建立成功,客户端和服务端进入established状态,完成三次握手,随后客户端和服务端之间可以开始传输数据了。
为什么TCP要三次握手,两次可以么?
TCP进行可靠的传输的关键就在于维护一个序列号,三次握手的过程即是通信双方相互告知序列号起始值,并确认对方已经收到了序列号的起始值。
如果知识两次握手,至多只有客户端的起始序列号能被确认,服务端的序列号则得不到确认。
半连接队列
TCP握手中,当服务器处于SYN_RCVD状态,服务器会把此种状态下请求连接放在一个队列里,该队列称为半连接队列。
SYN攻击
SYN攻击,即利用TCP协议缺陷,通过发送大量的半连接请求,占用半连接队列,耗费CPU和内存资源。
优化方式:
- 缩短SYN Timeout时间
- 记录IP,若联系受到某个IP的重复SYN报文,从这个IP地址来的包会被以该丢弃。
TCP四次握手过程
- 第一次握手:客户端发送一个FIN,用来关闭客户端到服务端的数据传送,客户端进入fin_wait_1状态。
- 第二次握手:服务端收到FIN后,发送一个ACK给客户端,确认序号为收到序列号+1,服务端Close_wait状态。此时TCP连接处于半关闭状态,即客户端已经没有要发送的数据了,但服务端若发送数据,则客户端仍要接收。
- 第三次握手:服务端发送一个FIN,用来关闭服务端到客户端的数据传送,服务端进入Last_ack状态。
- 第四次握手:客户端收到FIN后,客户端进入Time_wait状态,接着发送一个ACK给服务端,确认后,服务端进入Closed状态,完成四次握手。
为什么TCP需要四次握手
主要原因是当服务端收到客户端的FIN数据包后,服务端可能还有数据没有发送完,不会立即Close。
所以服务端会先将ACK发过去告诉客户端我收到你的断开请求了,但请再给我一点时间,这段时间用来发送剩下的数据报文,发送之后再将FIN数据包发送给客户端表示现在可以断了。之后客户端需要收到FIN包后发送ACK确认断开信息给服务端。
为什么四次握手释放连接时需要等待2MSL
MSL即报文最大生存时间,设置2MSL可以保证上一次连接的报文已经在网络中消失,不会出现与新TCP连接报文冲突的情况。
DNS协议
DNS协议是基于UDP的应用层协议,它的功能是根据用户输入的域名,解析出该域名对应的IP地址,从而给客户端进行访问。
DNS解析过程
- 客户端发送查询请求,在本地计算机缓存中查找,若没有找到,就会将请求发送给DNS服务器。
- 本地DNS服务器会在自己的区域里查找,找到即根据此记录进行解析,若没有找到,就会在本地的缓存里查找。
- 本地服务器没有找到客户机查询的信息,就会将此请求发送到根域名DNS服务器。
- 根域名服务器解析客户机请求的根域部分,它把包含的下一级的DNS服务器的地址返回到客户机的DNS服务器地址。
- 客户机的DNS服务器根据返回的信息接着访问下一级的DNS服务器
- 这样递归的方法一级一级接近查询的目标,最后在有目标域名的服务器上得到相应的IP信息。
- 客户机本地的DNS服务器会将查询结果返回给我们的客户机。
- 客户机根据得到的IP信息访问目标主机,完成解析过程。
HTTP协议
HTTP协议是超文本传输协议,它是基于TCP协议的应用层传输协议,即客户端和服务端进行数据传输的一种规则。该协议本身HTTP是一种无状态的协议。
Cookie
HTTP协议本身是无状态的,为了使其能够处理更加复杂的逻辑,HTTP/1.1引入Cookie来保存状态信息。
Cookie是由服务端产生的,再发送给客户端保存,当客户端再次访问的时候,服务器可根据cookie辨识客户端是哪个,以此可以做个性化推送,免账号密码登录等。
Session
Session用于标记特定客户端信息,存在在服务器的一个文件里。
一般客户端带Cookie对服务器进行访问,可以通过Cookie种的Session Id从整个session中出查询到服务器记录的关于客户端的信息。
HTTP状态码和对应的信息
- 1XX:接收的信息正在处理
- 2XX:请求正常处理完毕
- 3XX:重定向
- 301:永久重定向
- 302:临时重定向
- 304:资源没修改,用之前的缓存就行
- 4XX:客户端错误
- 400:客户端请求的报文有错误
- 403:表示服务器禁止访问该资源
- 404:表示请求的资源在服务器上不存在或者未找到
- 5XX:服务端错误
转发和重定向的区别
转发是服务器行为。服务器直接向目标地址访问URL,将相应的内容读取后发送给浏览器,用户浏览器地址栏的URL不变,转发页面和转发到的页面可以共享request里面的数据。
重定向是利用服务器返回的状态码来实现的,如果服务器返回301或者302,浏览器接收到新的消息后自动跳转到新的网址重新请求资源。用户的地址栏URL会发成改变,而且不能共享数据。
HTTP1.0
规定了请求头和请求尾,响应头和响应尾(GET,POST)。
每个请求都是单独的连接,做不到连接的复用。
HTTP1.1的改进
HTTP1.1默认开启长连接,在一个TCP连接上可以传送多个HTTP请求和响应。使用TCP长连接的方式改善了HTTP1.0短连接造成的性能开销。
支持管道(pipeline)网络传输,只要第一个请求发送出去了,不必等其回来,就可以发送第二个请求出去,可以减少整体的响应时间。
服务端无法主动PUSH。
HTTP短连接和长连接的区别
HTTP中长连接指HTTP底层TCP的连接。
短连接:客户端与服务端进行一次HTTP连接操作,就进行一次TCP连接,连接结束TCP关闭连接。
长连接:如果HTTP头部带有参数keep-alive,即开始长连接网页完成打开后,底层用于传输数据的TCP连接不会直接关闭,会根据服务器设置的保持连接时间保持连接,保持时间过后连接关闭。
HTTP2.0的改进
提出多路复用,多路复用前,文件是串行传输的,请求a文件,b文件只能等待,并且连接数过多。引入多路复用,a文件和b文件可以同时传输。
引入了二进制数据帧。其中帧对数据进行顺序标识,有了序id,服务器就可以进行并行传输数据。
HTTP与HTTPS区别
HTTP所有传输的内容都是明文,并且客户端和服务器段都无法验证对方的身份。
HTTPS具有安全性的SSL加密传输协议,加密采用对称加密。
HTTPS协议需要用到CA申请证书,一般免费证书很少,需要付费。
TLS/SSL,HTTP,HTTPS的关系
SSL全称为Secure Sockets Layer,即安全套接字层,其继任为TLS Transport Layer Security,传输层安全协议,均用于在传输层为数据通讯提供安全支持。
可以将HTTPS协议简单理解为HTTP协议+TLS/SSL。
HTTPS的连接过程
- 浏览器将支持的加密算法信息发送给服务器。
- 服务器选择一套浏览器支持的加密算法,以证书的形式回发给浏览器。
- 客户端(TLS/SSL)解析证书验证证书合法性,生成对称加密的密钥,我们将该密钥称为client key,即客户端密钥,用服务器的公钥对客户端密钥进行非对称加密。
- 客户端会发起HTTPS请求中的第二个HTTP请求,将加密之后的客户端对称密钥发送给服务器。
- 服务器接收到客户端发来的密文之后,会用自己的私钥对其进行非对称解密,解密之后的明文就是客户端密钥,然后用客户端密钥对数据解压对称加密,这样数据就变成了密文。
- 服务器将加密后的密文发送给客户端。
- 客户端收到服务器发送来的密文,用客户端的密钥对其进行对称解密,得到服务器发送的数据,这样HTTPS中的第二个HTTP请求结束,整个HTTPS传输完成。
GET与POST区别
GET:指定资源请求数据,刷新无害,GET请求的数据会附加到URL中,传输数据的大小收到URL的限制。
POST:向指定资源提交要被处理的数据,刷新会使数据被重复提交。POST在发送数据前会先将请求头发送给服务器进行确认,然后才真正发送数据。
GET方法参数由大小限制吗
一般HTTP协议里并不限制参数大小。但是一般由于GET请求时直接附加到地址栏里面的,由于浏览器地址栏由长度限制,因此使GET请求在浏览器实现层面上看会有长度限制。
REST API
REST API全称为:Representational State Transfer,表述性状态转移,即利用HTTP的GET,POST,PUT,DELETE以及其他的HTTP方法构成REST中数据资源的增删改查操作。
- Create:POST
- Read:GET
- Update:PUT/PATHCH
- Delete:DELETE
浏览器输入一个地址后发生了什么
- 进行DNS解析,根据DNS解析的结果查询到服务器的IP地址
- 通过IP寻址和ARP,找到服务器,并利用三次握手建立TCP连接
- 浏览器生成HTTP报文,发送HTTP请求,等待服务器响应
- 服务器处理请求,并返回给浏览器
- 根据HTTP是否开启长连接,进行TCP的握手过程
- 浏览器根据接收到的静态数据进行页面渲染
HTTP请求包含了什么
请求方法字段,URL字段,HTTP协议版本,产生请求的浏览器类型,请求数据,主机地址。