1.http 响应码 301 和 302 代表的是什么?有什么区别?
301:301代表永久性转移。原先的资源会被永久地移除。
302:302代表暂时性转移。旧地址的资源还在(仍然可以访问)。
302网站劫持
网址A去重定向到网址B,网页显示的内容都是网址B的内容,但是在网址选择时却选择了网址A。
2.forward 和 redirect 的区别?
- forward的地址栏始终使用的同一个;redirect的地址栏显示的最新的那个URL。
- forward使用的是同一个请求,可以共享request中的对象;redirect不能共享。
- forward是服务器行为,客户端发起一个新的http请求来请求资源,服务器通过自己的转发将请求资源返回给客户端,客户端会更新资源,但不会改变URL地址,不过只能在同一个容器内进行转发;redirect是客户端行为,客户端向服务器发起http请求,服务器发送给客户端一个302和新的URL来告诉客户端需要向另一个url发送请求,客户端使用服务器告诉的URL来请求资源。(这里客户端一共发起了两次请求)。
3.说一下 tcp 粘包是怎么产生的?
在服务器和客户端保持连接的时候,客户端向服务器端发送了若干个数据包,由于tcp是采用字节流的形式传送的,在客户端有可能会等待缓冲区中的数据满时才发送,或者服务器端在接收缓冲区中的数据时,一次接收了多个数据包,导致了tcp粘包。
封包和拆包
4.说一下 JSONP 实现原理?
jsonp是一种跨越同源限制实现请求数据的方法。由于浏览器存在同源限制的策略,即只有当协议,域名,端口号都相同的情况下浏览器才会对服务器发起请求。但有个特例:即通过script标签从服务器请求数据不会受到浏览器同源策略的限制,不过只能用Get请求。
<!DOCTYPE html>
<html>
<head>
<title>JsonP</title>
</head>
<body>
<input type="text"/>
<ul></ul>
<script src="jquery-3.3.1.min.js"></script>
<script type="text/javascript">
function getData(data) {
var script = document.querySelector('#jsonp');
script.parentNode.removeChild(script);
$('ul').html('');
for(var i=0;i<data.s.length;i++){
$('<li>'+data.s[i]+'</li>').appendTo('ul');
}
}
function getList(wd){
var script = document.createElement('script');
script.id = 'jsonp';
script.src = 'https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?cb=getData&wd=' + wd;
document.body.appendChild(script);
}
window.onload = function() {
$('input').keyup(function(){
var wd = $(this).val();
getList(wd);
})
}
</script>
</body>
</html>
5.tcp 为什么要三次握手,两次不行吗?为什么?
在选择TCP作为传输协议的时候,主要关注两点:一:保证数据的可靠传输;二:提高数据的传输效率。
- 客户端会先服务端发送一个SYN包,同时会随机生成一个客户端序列号(ISN);
- 服务端在收到客户端的包后,会向客户端发送一个ACK包,其值就是客户端的序列号加1,同时会携带SYN信号,指出服务端的序列号(随机生成);
- 客户端收到报文后,将服务端的序列号加1作为ACK的值返回给服务端。
三次握手.png为什么序列号是随机生成的?随机是为了防止建立链接时数据错乱,比如如果固定是从1开始,第一轮链接超时了然后客户端重新发起链接,又从1开始第二轮,这样可能第一轮的包刚好传过来了所以导致数据错乱。为了解决这个问题,初始序号是一个随机的,本质上是随时间变化而变化,每4ms会+1,所以等到下一个重复的序号出现时需要2^32*4/1000/3600约等于4000小时。
TCP两次握手:客户端向服务器发送SYN,服务器返回对于客户端的确认信号(ACK),但不能保证客户端能够接收到服务器的信息。
“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文并没有丢失。而是在某个网络节点长时间的滞留了,以致延误到连接释放2以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误以为是client再次发出的一个新的连接请求。于是就想client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就拜拜浪费掉了。采用“三次握手”的办法可以防止上述现象发生。
对于TCP两次握手不能保证数据的可靠传输。
TCP四次握手:就是在三次握手的基础上,客户端在最后一次回送确认信号(ACK)的同时也发送了一个SYN。
TCP四次握手会降低效率,因为三次握手已经可以实现建立可靠连接,多了一次没必要的请求。
6.tcp为什么是四次挥手,而不是三次或五次?
四次挥手- 首先客户端向服务器端发送一个FIN数据报文,并指出序列号的值;
- 服务器收到FIN报文后,返回确认报文ACK,序列号为客户端序列号+1,关闭服务器读通道;
- 客户端收到ACK报文后,关闭客户端写通道;
- 服务器处理完数据后,向客户端发送FIN报文,也指出序列号的值;
- 客户端收到FIN后,返回确认报文ACK,序列号为服务器序列号+1,关闭客户端读通道,并处于TIME_WAIT状态;
- 服务器收到ACK报文后,关闭服务器写通道。
三次:由于TCP是全双工通信,三次会导致客户端运行时间增加,导致资源浪费。
五次:没必要。
7.TCP和UDP的区别?
- TCP是面向连接的,是可靠的传输,UCP不需要建立连接,不保证可靠交付;
- TCP面向字节流传送,UDP依赖报文传送;
- TCP首部有20字节,UDP只有8字节;
- TCP的逻辑通信信道是全双工信道,UDP是不可靠信道。
8.TCP如何保证数据传输的可靠性?
- 校验和
- 序列号
- 超时重传
在BSD的Unix以及Windows系统中,超时都以0.5秒为单位进行控制。不过,由于最初的数据包还不知道往返时间,所以其重发超时一般设置为6秒左右。
数据被重发之后若还是收不到确认应答,则进行再次发送。此时,等待确认应答的时间将会以2倍、4倍的指数函数延长。
- 确认应答
- 连接管理
- 流量控制
-
拥塞控制
拥塞控制
首先,为了在发送端调节所要发送的数据的量,定义了一个叫作“拥塞窗口”的概念。在慢启动的时候,将这个拥塞窗口的大小设置为1个数据段(1MSS)发送数据,之后每收到一个确认应答(ACK),拥塞窗口的值就加1。
由重复确认应答进行高速重发控制时,慢启动阈值的大小被设置为当时窗口大小的一半。然后将窗口的大小设置为该慢启动阈值+3个数据段的大小。
9.TIME_WAIT状态
TIME_WAIT状态也称为2MSL等待状态。
当某个TCP端点关闭TCP连接时,会在内存中维护一个小的控制块,用来记录最近所关闭连接的IP地址和端口号。
这类信息只会维持一小段时间,通常是所估计的报文段最大生存时间的两倍(称为2MSL,通常为2分钟左右),以确保在这段时间不会创建相同地址和端口号的新连接。
防止在两分钟内创建、关闭并重新创建两个具有相同IP地址和端口号的连接。
10.GET和POST的区别?
- GET参数通过URL传递,POST放在Request Body中。
- GET请求会被浏览器主动cache,而POST不会
- GET请求参数会被完整保留在浏览器历史记录里,而POST的参数不会被保留
- GET请求中有非ASCII字符,会在请求之间进行转码,POST不用,因为POST在Request Body中,通过MIME,也就可以传输非ASCII字符。
- GET产生一个TCP数据包;而POST产生两个TCP数据包。对于GET方式的请求,浏览器会把HTTP Header和Data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送Header,服务器响应100 continue,浏览器再发送Data,服务器响应200 ok(返回数据)。
- Firefox都只发送一次数据包。
GET和POST的使用场景?
POST:
- 请求的结果有连续的副作用,例如,添加新的数据行;
- 若使用GET方法,则表单上收集上收集的数据有可能让URL过长;
- 要传送的数据不是采用7为的ASCII编码。
GET:
- 请求是为了查找资源;
- 无连续性的副作用;
- 收集的数据及HTML表单内的输入字段长度的总长不超过1024个字符。
11.OSI模型及其协议
OSI | 功能 | TCP/IP协议族 |
---|---|---|
应用层 | 文件传输、电子邮件、文件服务、虚拟终端 | TFTP、HTTP、SNMP、FTP、SMTP、DNS、Telnet |
表示层 | 数据格式化、代码转换、数据加密 | 无 |
会话层 | 解除或建立与别的节点的联系 | 无 |
传输层 | 提供端对端的接口 | TCP、UDP |
网络层 | 为数据包选择路由 | IP、ICMP、RIP、OSPF、BGP、IGMP |
数据链路层 | 传输有地址的帧以及错误检测功能 | SLIP、CSLIP、PPP、ARP、RARP |
物理层 | 以二进制数据形式在物理媒体上传输数据 | ISO2110、IEEE802、IEEE802.2 |
- TFTP:简单文件传输协议
- FTP:文件传输协议
- SNMP:简单网络管理协议
- SMTP:简单邮件传输协议
- RIP:路由信息协议
- OSPF:内部网关协议
- BGP:边界网关协议
- IGMP:网络群组管理协议
- SLIP:串行线路网际协议
- CSLIP:压缩的SLIP
- ARP:地址解析协议
- RARP:逆地址解析协议
12.应用层有哪些协议说一下,基于udp的有哪些,基于tcp的有哪些
- 域名系统DNS
- 文件传输协议FTP
- 简单邮件传输协议SMTP
- 超文本传输协议HTTP
- 简单网络管理协议SNMP
- 远程登录协议Telnet
- 网络文件系统NFS
- 通用文件传输协议TFTP
TCP : Telnet、FTP、SMTP
UDP:NFS、SNMP、DNS、TFTP
13.四次挥手中Time_Wait的作用?
在主动发起close()的一端(客户端)在收到服务端发来的Fin请求包后就进入了Time_Wait的状态。
作用:
- 确保服务器端能收到ACK报文段。如果在客户端发出ACK报文段后就进入closed状态,这就无法确保服务器端能正常收到ACK报文段,导致服务器不能正常进入closed状态。所以需要客户端进入Time_Wait 2MSL的时间。
- 使本次连接的所有报文段都在网络中消失,防止在下一次新的连接中出现旧的报文段。
假设在12.106.32.254的1500端口和206.168.112.219的21端口之间有一个TCP连接。我们关闭这个连接,过一段时间后在相同的IP地址和端口之间建立另一个连接。后一个连接称为前一个连接的化身,因为它们的IP地址和端口号都相同。TCP必须防止来自某个连接的老的重复分组在该链接已终止后再现,从而被误解成属于同一连接的某个新的化身。为做到这一点,TCP将不给处于TIME_WAIT状态的连接发起新的化身。既然TIME_WAIT状态的持续时间是2MSL,这就足以让某个方向上的分组最多存活MSL秒即被丢弃,另一个方向上的的应答最多存活MSL秒也被丢弃。
14.TCP连接后,如果一方发生断电,另一方怎么知道?
运用TCP的keepalive机制。当客户端等待超过一定时间后自动给服务端发送一个空的报文。
15.TCP和HTTP的Keep-Alive的区别?
- HTTP意图在于连接复用,避免了建立或者重新建立连接,同一个连接上串行方式传递请求-响应数据。
- TCP意图在于保活、心跳检测。
16. HTTP/1.0和HTTP/1.1的区别?
16.1 可拓展性
HTTP1.1增加了OPTIONS,PUT, DELETE, TRACE, CONNECT这些Request方法.
16.2 带宽优化
- HTTP/1.1中在请求消息中引入了range头域,允许只请求资源的某个部分。在响应信息中Content-Range头域中声明了返回的这部分对象的偏移值和长度。如果服务器相应地返回了对象所请求范围的内容,则响应码为206,他可以防止Cache将响应误以为是完整的一个对象。
- HTTP/1.1加入了一个新的状态码100。客户端事先发送一个只带头域的请求,如果服务器因为权限拒绝了请求,就回送响应码401;如果服务器接收此请求就回送响应码100,客户端就可以继续发送带实体的完整请求了。
16.3 长连接
- HTTP/1.1支持长连接和请求的流水线处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。
- HTTP/1.1还允许客户端不用等待上一次请求结果返回,就可以发出下一个请求,当服务器端必须按照接收客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分除每次请求的响应内容,这样也显著地减少了整个下载过程所需要的时间。
16.4 Host域
- HTTP/1.0中认为每台服务器都绑定一个唯一的IP的地址,因此,请求消息中URL并没有传递主机名。(一台物理服务器上可以存在多个虚拟地址,并且共享一个IP地址)
- HTTP/1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域回报告400 Bad Request错误。
16.5 缓存
- HTTP/1.1增加了Cache-Control头域,支持一个可扩展的指令子集,例如max-age指令支持相对时间戳,private和no-store指令禁止对象被缓存,no-transform阻止Proxy进行任何改变响应的行为。
- Cache使用关键字索引在磁盘中缓存的对象,在HTTP/1.0中使用资源的URL作为关键字。但可能存在不同的资源基于同一个URL的情况,要区别它们还需要客户端提供更多的信息,如Accept-Language和Accept-Charset头域。为了支持这种内容协商机制(content negotiation mechanism),HTTP/1.1在响应消息中引入了Vary头域,该头域列出了请求消息中需要包含哪些头域用于内容协商。
17.http状态码
- 1xx:指示信息,如100 contine。
- 2xx:表示请求成功,如200 OK,202 Accept告诉客户端请求正在被执行,但还没有处理完。
- 3xx:重定向,如301 永久性转移,302 暂时性转移。
- 4xx:客户端异常,如400 Bad Request,401 Unauthorized,403 Forbidden/禁止,404 Not Found。
- 5xx:服务器异常,如502 Bad Gateway,503 Service Unavailable,504 Gateway Timeout,505 Http Version Not Supported。
18.HTTP请求报文
HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串。
一个HTTP请求报文由请求行、请求头部、空行和请求数据4个部分组成。
18.1 请求行
请求行由请求方法字段、URL字段和HTTP协议版本3个字段组成,它们用空格风格。例如 GET /index.html HTTP/1.1
请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。
18.2 请求头部
请求头部由关键字/键值对组成,每行一对,关键字和值用“:”分隔。
例如:
- User-Agent:产生请求的浏览器类型。
- Accept:客户端可识别的内容类型列表。
- Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟机。
18.3 空行
通知服务器以下不再有请求头。
18.4 请求数据
请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。
19. HTTP响应报文
HTTP响应也由三个部分组成,分别是:状态行、消息报头、响应正文。
20. 如果已经建立了连接,但是客户端突然出现了故障了怎么办?
TCP设有一个保活计时器。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置2小时,若2小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
21.从输入URL到页面加载发生了什么?
- DNS解析
- TCP连接
- 发送HTTP请求
- 服务器处理请求并返回HTTP报文(301重定向)
- 浏览器解析渲染页面
- 连接结束
21.1 DNS解析
DNS解析是将域名解析到一个IP地址的过程。
**查找顺序:浏览器缓存 --> 操作系统缓存 --> 本地host文件 --> 路由器缓存 --> ISP DNS缓存 --> 顶级DNS服务器/根DNS服务器
ISP DNS缓存:互联网服务提供商(中国电信)也会提供DNS服务,在本地查找不到的情况下,就会向ISP进行查询。
22. 为什么DNS解析用UDP?
一次UDP服务器交换可以只使用两个报文:一个查询报文,一个响应报文。一次TCP交换则至少包含9个报文:三次握手、一个查询报文、一个响应报文、四次挥手。
23. HTTPS
24. HTTPS怎么保证证书不会被伪造?
25. HTTP和HTTPS的区别?
- HTTP是超文本传输协议,信息是明文传输;HTTPS采用SSL加密传输,更具安全性。
- HTTP使用80端口,HTTPS使用443端口。
26. HTTP1.0 HTTP1.1 HTTP2
26.1 HTTP1.0与HTTP1.1的区别?
- 缓存处理:在HTTP1.0中主要使用header里的if-Modified-Since,Expires来作为缓存判断的标准,HTTP1.1引入了Entity tag,If-Match等缓存头来控制缓存策略。
- 带宽优化:HTTP1.1在请求头引入了range头域,允许只请求资源的某个部分,返回206 Partial Content。
- 错误通知的管理:HTTP1.1 新增了24个错误状态响应码,如409 Conflict表示请求的资源与资源的当前状态冲突,410 Gone 表示服务器上的某个资源被永久性的删除。
- Host头处理:在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名。但现在一台物理服务器上可以存在多个虚拟主机,并且共享一个IP地址。HTTP1.1请求消息和响应消息都支持Host头域,如果没有会报告一个400 Bad Request。
- 长连接:keep-alive,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。
26.2 HTTP1 和 HTTP2的区别?
- 二进制格式:HTTP1解析是基于文本,而HTTP2解析采用二进制格式。
- 多路复用:每一个request都是用作连接共享机制。一个request对应一个id,这样一个连接可以有多个request,每个request可以随机的混杂在一起,接收方可以根据request的id将request再归属到各自不同的服务端请求里面。
- Header压缩:HTTP2使用encoder来减少需要传输的header的大小,通讯双方各自cache一份header fields表,即避免了重复header的传输,又减少了需要传输的大小。
网友评论