1. TCP/IP七/五/四层模型
-
应用层:任务是通过应用进程之间的交互,完成特定网络应用,代表协议有:DNS协议,HTTP协议 ;
-
运输层:对应用层提供网络连接中的两台计算机之间的数据传输服务,代表协议:TCP,UDP;
-
网络层:当两台计算机需要通信时,中间可能会经过多台计算机或者网络设备,网络层的作用就是在众多选项内选择一条合适的传输路线,协议IP协议;
-
数据链路层:将网络层交下来的数据报组装成帧,在两个相邻结点间的链路上实现帧的无差别传输,例如ARQ协议;
-
物理层:实现计算机节点之间比特流的透明传输。尽可能屏蔽掉具体传输介质和物理设备的差异。
2. 什么是TCP/IP协议?
TCP/IP协议现在不是仅仅只这两个协议,而是TCP/IP四层体系结构,从上到下分别是:应用层,运输层、网络层、网络接口层;
3. TCP建立连接和断开连接的过程
建立连接采用三次握手,断开连接采用四次挥手。
4. TCP三次握手过程
以客户端向服务器请求建立连接为例:
-
第一次握手:客户端发送带有SYN标志位的数据包,并进入SYN_SENT状态;
-
第二次握手:服务器发送带有SYN/ACK标志位的数据,进入SYN_RCVD状态;
-
第三次握手:客户端接收到服务器发送的SYN/ACK数据包,并发送带有ACK的数据包。客户端和服务器都进入ESTABLISHED状态,完成第三次握手,然后他们就可以发送数据了。
5. 为啥三次握手?
三次握手的目的是建立可靠的通信,换而言之就是要确定发送方到接收方的通道没问题,还要确定接受方到发送方的通道没问题。还是以客户端请求与服务器建立连接为例:
第一次握手时,客户端什么也不能确定,服务器确定客户端发送正常,自己接收正常;
第二次握手时,客户端确定自己发送正常,接受正常,服务器的发送正常,接受正常;此时服务器还是只能确定客户端发送正常,自己接受正常;
第三次握手时,客户端确定自己发送正常,接受正常,服务器的发送正常,接受正常;服务器也确定了自己接受和发送都正常,客户端的发送和接受都正常;
6. 第三次包丢失会怎么样?
客户端接受到服务端的SYN+ACK应答后,状态转变为ESTABLISHED,并发送ACK数据包给服务端,如果此时数据包丢失,服务端状态还是SYN_RCVD,然后服务端在等待3秒、6秒、12秒后重新发送SYN/ACK包,如果重发若干次还是没有收到客户端的ACK应答,Server自动关闭这个连接。
7. 第二次丢失会怎么样?
第二次丢失后,客户端在等待一段时间后重新发送带有SYN字段的数据包
8. TCP四次挥手
以客户端向服务器发出断开请求为例:
-
第一次挥手:客户端发送一个FIN报文,用来关闭客户端到服务器的数据传输,客户端进入FIN_WAIT_1状态;
-
第二次挥手:服务器收到这个FIN报文,发回一个ACK报文,确认序号为收到的序号加1,服务器进入CLOSE_WAIT状态,此- 时的TCP连接处于半关闭状态,客户端已经没有要发送的数据了,但如果服务器此时还要发送,那客户端仍要接受;
-
第三次挥手:服务器向客户端发送FIN报文,要求关闭与客户端的连接,服务器进入LAST_ACK状态;
-
第四次挥手:客户端接收到FIN报文,进入TIME_WAIT状态,发送ACK报文,并将确认序列号设置为接收到的序列号加1,服务器进入CLOSED状态;客户端等待2MSL后也进入CLOSED状态,完成四次挥手。
9. 客户端主动挥手时time_wait状态,为什么不直接close,而是等2MSL?
在客户端进入time_wait状态后需要等待两个MSL再关闭连接,这是为了防止丢包。MSL是一个报文在网络中的最大存活时间。如果客户端发送ACK后,服务器没有收到,肯定会继续发送FIN报文,而2MSL就是一个发送和一个回复所需要的最大时间,如果直到2个MSL后客户端都没有接受到FIN,就证明服务器已经接收到了ACK报文,服务器已经断开了。
10. Close_wait状态是哪一端的?量Close_wait的后果?
是被断开端的,如果是客户端向服务器请求断开连接,那就是服务器端的;
如果该状态过多,会占用系统大量内存,如果对应端口的连接数满了,就不能再对这个端口创建新的连接了,从而有可能引发一系列的异常反应,甚至程序崩溃。
11. tcp的reset报文,什么场景下会使用到?一方收到reset报文会怎么处理?
在TCP交互过程中出现了异常时,可能无法按照正常的4次挥手释放连接,如果不通过其他方式释放,该连接会一直占用系统资源。在这种情况下,我们就需要有一种能够释放TCP连接的机制,这种机制就是TCP的reset报文。
在TCP报头的标识字段中有的reset位置,异常终止常见情形:
-
客户端尝试与服务器未对外提供服务的端口建立TCP连接;
-
客户端和服务器某一方在交互过程中发生异常,如程序崩溃等;(一端崩溃后向另一端发送reset报文)
-
接收端收到TCP报文,但是发现其不在已经建立的TCP列表中,直接发送reset
-
交互过程中某一方长时间没有收到来自对方的确认报文,超出重传次数和时间后,发出reset
12. TCP和UDP区别
UDP在进行传输前不需要建立连接,远程主机收到UDP报文后不需要给出任何回复,通信速度比较快,传输不太可靠,应用场景:QQ语音,视频、直播等;
TCP提供面向连接的服务,传送数据前需要通过3次握手建立连接,数据传送完成后通过4次挥手释放连接,传输速度较慢,消耗资源较多,传输可靠。
如何实现可靠UDP?
参考TCP的可靠传输策略,可以在UDP的应用层实现确认机制、重传机制、窗口确认机制。
13. TCP协议如何保证可靠传输
-
校验和:TCP将保持它首部和数据的校验和,这是一个端到端的校验和,目的是检测数据在传输过程中的变化,如果收到的检验和有差错,TCP就丢弃这个报文段,并不确认收到;
-
序列号和确认应答:TCP传输时将每个发送的包进行编号,接收方收到数据后会回复对应的ACK报文;
-
超时重传:当TCP发送一组数据后,会启动一个定时器,如果没有及时收到目的端的回复确认,发送到就从重新发送这个报文段。
-
流量控制:TCP连接的每一方都有固定大小的缓存空间,TCP的接收端只允许发送端发送,接受端缓存区能接纳的数据,当接收方来不及处理发送方的数据时,能提示发送方降低发送的速率防止包丢失。TCP利用滑动窗口实现流量控制。
-
拥塞协议:当网络拥塞时,减少数据的发送,发送方有拥塞窗口,发送数据前对比接收方发回来的接收窗口,取小的窗口
14. ARQ协议
ARQ是自动重传请求,是OSI模型中数据链路层的错误纠正协议之一,包括停止等待ARQ和连续ARQ协议。
-
停止等待ARQ协议的基本原理是每发送完一组数据就停止发送,等到接收方确认,如果过了一段时间后还没收到确认就重新发送,直到收到确认信息;
-
连续ARQ协议:发送方维持一个发送窗口,凡是位于窗口内的分组可以连续的发送出去,不需要等待对方确认,接收方一般采用累计确认,对按序到达的最后一个分组发送确认,表明在此分组及其之前的所有数据都已经正确收到。
15. 流量控制解决的问题和实现方法?
流量控制是为了控制发送方的发送速率,保证接收方来得及接收。如果发送速率过快,接收方的缓冲区很快被填满,后面会引起一系列问题。
TCP利用滑动窗口实现流量控制,接收方发送的确认报文中有个窗口字段,该字段可以控制发送方的窗口大小,从而影响发送的速率,如果该窗口字段设置为0,则接收方不能发送数据。
16. 拥塞控制及其算法
拥塞控制有4个重要控制算法:慢开始、拥塞避免、快重传、快恢复。
拥塞控制为了防止同一时间有过多的数据注入到网络中。
-
慢开始:开始发送数据时发送少量数据进行探路,后面再逐步增大,拥塞窗口大小按照指数级增长,直到窗口大小达到阈值后进入拥塞避免阶段;
-
拥塞避免:拥塞窗口缓慢增长,每次收到ACK应答,拥塞窗口加1,出现拥塞时将拥塞窗口置为1,然后进行慢开始,不过此时的阈值是出现拥塞时的拥塞窗口大小的一半;
-
快重传:接收方收到一个失序报文后立即发出重复确认,发送方连续收到3个重复确认后,就知道这段报文丢失,然后重新发送这段报文;
-
快恢复:发送方收到连续的3个确认重复后,就知道丢失了报文段,这时不启动满开始算法,而是执行快恢复算法,发送方把慢开始门限阈值和拥塞窗口调整为当前窗口的一半,开始执行拥塞避免算法;
17. 拥塞控制和流量控制的区别
拥塞控制是一个全局的过程,涉及到所有主机,所有的路由器,以及其他因素。
流量控制是点对点通信量的控制,是一个端到端的问题,他要做的是控制发送端的速率,以便接收端来得及接受。
18. push报文
指的是TCP报文中的push标志位吗?如果push标志位为1,指示接收方在收到该数据后应尽快将这个报文段交给应用程序,而不是放在缓存区排队。
19. IP协议哪一层?IP协议是用来干嘛的
IP协议在网络层,IP协议主要功能是寻址和路由,即根据对方的IP地址寻找较好的传输路径
20. 在浏览器中输入url到显示主页的过程
主要可以分为这样几个步骤:DNS解析,TCP连接,发送HTTP请求,服务器处理请求并返回HTTP报文,浏览器解析渲染网页,连接结束。
-
首先,DNS会对我们输入的地址进行解析,解析成IP+端口的形式,首先会在缓存中寻找有没有解析过该地址,如果没有,依次查找本地域名服务器,根域名服务器,com域名服务器直到解析成功。
-
找到了服务端的地址后,浏览器请求建立TCP连接;
-
建立连接成功后,浏览器发送HTTP请求,服务器接收到请求后处理,并返回对应的HTTP报文,接下来浏览器收到报文后开始解析并渲染页面,最后连接结束。
-
在传输的过程中TCP会把HTTP报文切割成段进行发送,并在接收端重新组装。
21. 状态码
常见状态码:
200OK:客户端发送给服务器的请求被正常处理并返回
403:服务器拒接访问,客户端没有访问权限;
404:请求失败,客户端请求的资源不存在或者没找到
500:服务器遇到未知错误;
22. HTTP协议与其他协议的关系
HTTP协议的职责是生成针对目标服务器的HTTP请求报文;
DNS协议解析该报文提交的地址,返回对应的ip地址;
TCP协议将HTTP请求报文分段,IP协议搜索服务器地址并中转HTTP报文段,然后依靠TCP协议将报文重新组装;
服务器端通过HTTP协议处理请求,将处理结果通过TCP/IP协议回传。
23. HTTP的报文结构,Http常用请求方式
- 一个HTTP请求报文一般由请求行+请求头部+空行+请求数据组成
请求行中包含请求方法:GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT;
请求头由键值对组成,主要通知服务器关于客户端请求的信息;
空行:通知服务器以下就没有请求头了;
请求数据:POST方法时使用请求数据,存放表单信息;
- 响应报文:状态行+响应头部+空行+相应数据
24. GET、POST区别
GET请求,请求的数据会附在URL后,用?分割URL和传输数据,多个参数之间用&连接,如果是中文字符或者特殊符号,则把请求字符串用base64加密后在附上;GET请求提交的数据会在地址栏显示;
POST请求把提交的数据放在HTTP请求报文的请求体中,地址栏不变。
POST的安全性要比GET的安全性高
25. http的无状态,如何保存状态?
HTTP协议是一种无状态协议,即他本身不对请求和响应之间的通信状态进行保存;
引入Session机制解决该问题,Session的作用是在服务器端记录用户的状态信息。
典型场景是购物车,当用户要添加商品到购物车时,系统并不知道是哪个用户在操作,所以服务器给特定的用户创建特定的Session,之后就可以标识并跟踪这个用户了(超过一定时间就会销毁这个Session)
大部分情况下都是通过在Cookie中附加一个SessionID来跟踪,如果Cookie被禁用了,最常用的就是利用URL重写,将SessionID附加在URL路径后面。
26. session和cookie的区别?
Cookie和Session都是用来跟踪浏览器用户身份的会话方式,
- 两者的应用场景不同:
Cookie一般用来保存用户信息,比如①保存用户已经登录过的用户信息,下次访问页面时就可以自动填写上一些信息,②还有网站的保持登录,即下次访问该网站时不用再登录,因为用户登录的时候向Cookie中存放了一个Token
Session的作用主要是记录用户状态,典型场景是购物车,用户要添加商品到购物车时,系统并不知道是哪个用户在操作,所以服务器给特定的用户创建特定的Session,之后就可以标识并跟踪这个用户了;
- 两者保存位置不同:
Cookie存放在客户端,Session存放在服务器端
27. token是什么?
Token是服务端生成的一串字符串,以作为客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token并将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
28. session的原理?
Session的作用主要是记录用户状态,当客户端浏览器访问服务器某个网页时,会在服务器端内存开辟一块空间用来记录浏览器的的状态,这块区域就是Session,Session只允许当前浏览器窗口或者其子窗口访问,并且Session中会创建一个SessionID用来表示当前浏览器,一般来说SessionID会存放在客户端Cookie中,这一样就与服务器中的Session区域一一对应上了。
29. HTTP1.0和HTTP1.1的区别
-
长连接:HTTP1.1默认长连接,而HTTP1.0默认短链接每次请求都要建立新的连接
-
错误码:1.1新增了一些错误码,比如409表示请求资源与资源当前状态冲突;
-
缓存处理 :在HTTP1.0中主要使⽤header⾥的If-Modified-Since,Expires来做为缓存判断的标准, HTTP1.1则引⼊了更多的缓存控制策略例如Entity tag, If-Unmodified-Since, If-Match,If-None-Match等更多可供选择的缓存头来控制缓存策略。
-
带宽优化及⽹络连接的使⽤ :HTTP1.0中,存在⼀些浪费带宽的现象,例如客户端只是需要某个对象的⼀部分,⽽服务器却将整个对象送过来了,并且不⽀持断点续传功能, HTTP1.1则在请求头引⼊了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就⽅便了开发者⾃由的选择以便于充分利⽤带宽和连接。
30. HTTP2.0和HTTP1.1的区别
-
HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求
-
HTTP1.1不支持header数据的压缩,HTTP2.0使用HPACK算法对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快。
-
2.0引入了服务器推送机制,1.1的时候对网页上的资源都必须一个个的明确请求,这个过程很慢;2.0的时候引入server push,他允许在浏览器明确提出请求之前,服务器端推送资源给浏览器,这样客户端需要这些资源是可以直接从本地加载,速度很快。
31. https了解吗?怎么保证网站的不被攻击(采用https)
一般来说HTTP加上SSL加密处理和认证就是HTTPS。首先用SSL建立安全通信线路,然后用HTTP进行通信
32. 讲一下SSL(安全套接字)加密过程
-
第一步:当客户端A发起一个http请求,建立一个TCP连接,发送hello报文要求服务器端提供证书;
-
第二步:服务器B收到这些信息后,将自己被CA认证的证书发回响应,证书中包含着服务器的公钥;
-
第三步:客户端收到证书并验证后,生成一个主密钥(MS),用服务器的公钥加密该主密钥,生成加密的主密钥EMS,并将EMS发送给服务器;
-
第四步:服务器收到EMS后,用私钥解密得到主密钥MS,这个密钥会用于接下来的通信。
或者这样说:
- 验证完合法性后,在证书里取出服务器的公钥。
- 浏览器生成对称密钥。
- 使用服务器公钥对该对称密钥加密,发回给服务器。
- 服务器使用私钥解密,得到对称密钥。
- 服务器使用该对称密钥加密后续http数据。使用对称密钥加密是因为比非对称加密高效
33. 不对称加密(公开密钥加密)
如果使用共享密钥进行加密,那如果在数据传输过程中密钥被拦截,就失去了加密的意义,于是就有了不对称加密;
不对称加密,使用两把密钥,一把叫私有密钥,一把叫公开密钥,私有密钥不能被任何人知道,公开密钥可以随意发布;
发送密文的一方使用对方的公开密钥进行加密处理,对方收到被加密的信息后再用自己的私有密钥进行解密,即使公开密钥被获取,也很难恢复原文。
34. 为什么不一直用非对称加密?
因为非对称加密的处理速度比共享加密速度慢很多,通信速度慢,而且会消耗大量资源,而 http 的应用场景中通常端与端之间存在大量的交互,所以不能一直使用非对称加密。
35. HTTPS的加密方式
HTTPS采用共享密钥和公开密钥加密两者 并用的混合式加密机制。
首先使用公开密钥加密方式,安全的交换共享密钥加密中使用的密钥;
然后在确保交换的密钥是安全的前提下,使用共享密钥加密方式进行通信。
36. https客户端拿到服务端的证书后是怎么验证证书的合法性?
-
首先,客户端A本地会安装一个数字证书,该证书里CA机构的公钥;
-
然后,当服务器B发送证书的时候,客户端通过CA公钥解密证书信息得到一个hash1;
-
最后,用B证书里面的hash算法将证书信息生成一个hash2,比较两个hash,如果相等就是合法的。
37. 数字证书有什么内容?
主要包括:签发证书的机构,加密算法,Hash算法,公钥,签证到期时间等
38. HTTP和HTTPS的区别
-
端口:http的url由http起始,默认端口是80,https的url起始由https起始,默认端口443;
-
安全性:http协议运行在tcp之上,所有传输内容都是明文,客户端和服务器都无法验证对方身份,是不安全的;HTTPS运行在SSL之上,所有传输的内容都经过加密,加密采用对称加密,但是对称加密的密钥的传输采用的是非对称加密,所以很安全,但消耗的资源也比较多
39. 内网访问外部,用到的是什么地址? 返回报文怎么从公网找到内网的地址?
采用私有地址的网络需要访问公网,必须在出口设备上部署NAT/PAT设备,比如路由器,NAT/PAT是将IP报头中的源IP地址转换为另一个IP地址的过程,主要用于实现局域网内的主机(私有IP地址)访问外部网络(公有IP地址)的功能。
该设备还会创建一个NAT地址转换表(映射表),以便判断从公网收到的报文应该发往的私网目的主机。
40. ARP协议
地址解析协议,用于实现从 IP 地址到 MAC 地址的映射,即询问目标IP对应的MAC地址。
主机发送信息时,将包含目标IP地址的ARP请求,广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。
41. 典型的HTTP攻击手段
简单的 HTTP 协议本身并不存在安全性问题,因此协议本身几乎不会成为攻击的对象。应用 HTTP 协议的服务器和客户端,以及运行在服务器上的 Web 应用等资源才是攻击目标。
-
以服务器为目标的主动攻击:将攻击代码直接嵌入到访问的web应用的链接中,主动向web应用发起进攻,常见的攻击手段为sql注入攻击和os注入攻击。
-
sql注入攻击:通过在发送给web应用的链接中传入非法的sql语句,以此获取数据库内一些信息和修改这些信息等目的;
-
os命令注入攻击:通过向shell传入一些操作系统相关的指令,让服务器运行相应的操作,以此获得一些非法的内容。
-
-
以服务器为目标的被动攻击:诱导用户点击一些陷阱,用户会在不知情的情况下吧含有攻击性的代码发送给web应用,常见的攻击手段有跨站脚本攻击和跨站点请求伪造;
-
跨站脚本攻击(XSS):恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的,比如发送垃圾短信,盗取用户密码。
-
跨站点请求伪造:攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作;
-