1.计算机网络体系架构
七层网络体系结构:OSI 模型把网络通信的工作分为 7 层,从下到上分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
五层网络体系结构:应用层、运输层、网络层、数据链路层、物理层。
应用层:应用层的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程间通信和交互的规则。这里的进程就是指主机中正在运行的程序。我们把应用层交互的数据单元称为报文。
运输层:运输层的任务就是负责向两台主机中进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文。
网络层:网络层负责为分组交换网上的不同主机提供通信服务。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组或包进行传送。
数据链路层:数据链路层常简称为链路层。我们知道,两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。在两个相邻结点之间传送数据时,数据链路层将网络层交下来的 IP 数据报组装成帧,在两个相邻结点间的链路上传送帧(frame)。每一帧包括数据和必要的控制信息(如同步信息、地址信息、差错控制等)。
物理层:在物理层上所传数据的单位是比特。
2.TCP的三次握手
假定主机A运行的是TCP客户程序,而B运行TCP服务器程序。最初两端的TCP进程都处于CLOSED(关闭)状态。图中在主机下面的方框分别是TCP进程所处的状态。请注意,在本例中,A主动打开连接,而B被动打开连接。
一开始,B的TCP服务器进程先创建传输控制块TCB,准备接受客户进程的连接请求。然后服务器进程就处于LISTEN (收听)状态,等待客户的连接请求。如有,即作出响应。
A的TCP客户进程也是首先创建传输控制模块TCB。
传输控制块TCB (Transmission Control Block)存储了每一个连接中的一些重要信息,如:TCP连接表,指向发送和接收缓存的指针,指向重传队列的指针,当前的发送和接收序号,等等。
-
第一次握手:在打算建立TCP连接时,向B发出连接请求报文段,这时首部中的同步位
SYN = 1
,同时选择一个初始序号seq=x
。TCP规定,SYN报文段(即SYN = 1
的报文段〉不能携带数据,但要消耗掉一个序号。这时,TCP客户进程进入SYN-SENT
(同步已发送)状态。 -
第二次握手:B收到连接请求报文段后,如同意建立连接,则向A发送确认。在确认报文段中应把SYN位和ACK位都置1,确认号是
ack = x + 1
,同时也为自己选择一个初始序号seq = y
。请注意,这个报文段也不能携带数据,但同样要消耗掉一个序号。这时TCP服务器进程进入SYN-RCVD
(同步收到)状态。 -
第三次握手:TCP客户进程收到B的确认后,还要向B给出确认。确认报文段的ACK 置1,确认号
ack = y + 1
,而自己的序号seq = x + 1
。TCP的标准规定,ACK报文段可以携带数据。但如果不携带数据则不消耗序号,在这种情况下,下一个数据报文段的序号仍是seq = x + 1
。这时,TCP连接已经建立,A进入ESTABLISHED
(己建立连接)状态。当B收到A的确认后,也进入ESTABLISHED
状态。
序号:占4字节。序号范围是[0,2^32 - 1],共2(即4 294 967 296)个序号。序号增加到 2^32 - 1 后,下一个序号就又回到 0 。也就是说,序号使用mod 2^32运算。TCP是面向字节流的。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。首部中的序号字段值则指的是本报文段所发送的数据的第一个字节的序号。例如,一报文段的序号字段值是301,而携带的数据共有100字节。这就表明:本报文段的数据的第一个字节的序号是 301,最后一个字节的序号是400。显然,下一个报文段(如果还有的话)的数据序号应当从401开始,即下一个报文段的序号字段值应为401。这个字段的名称也叫做报文段序号。
确认号:占4字节,是期望收到对方下一个报文段的第一个数据字节的序号。例如,B正确收到了A发送过来的一个报文段,其序号字段值是501,而数据长度是200字节(序号501~ 700),这表明B正确收到了A发送的到序号700为止的数据。因此,B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701。请注意,现在的确认号不是501,也不是700,而是701。
总之,应当记住:
若确认号=N,则表明:到序号N-1为止的所有数据都已正确收到。
由于序号字段有32位长,可对4 GB(即4千兆字节)的数据进行编号。在一般情况下可保证当序号重复使用时,旧序号的数据早已通过网络到达终点了。
确认ACK (ACKnowledgment):仅当 ACK =1
时确认号字段才有效。当 ACK = 0
时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK 置1。
同步SYN (SYNchronization): 在连接建立时用来同步序号。当SYN = 1
而ACK=0
时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN= 1
和 ACK =1
。因此,SYN置为1就表示这是一个连接请求或连接接受报文。
终止FIN (FINis,意思是“完”、“终”):用来释放一个连接。当FIN= 1
时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。
3.TCP的四次挥手
- A的应用进程先向其TCP发出连接释放报文段(
FIN=1,seq=u
),并停止再发送数据,主动关闭TCP连接,进入FIN-MAIT-1
(终止等待1)状态,等待B的确认。 - B收到连接释放报文段后即发出确认报文段(
ACK=1,ack=u+1,seq=v
),B进入CLOSE-WAIT
(关闭等待)状态,此时的TCP处于半关闭状态,A到B的连接释放。 - A收到B的确认后,进入
FIN-WAIT-2
(终止等待2)状态,等待B发出的连接释放报文段。 - B发送完数据,就会发出连接释放报文段(
FIN=1,ACK=1,seq=w,ack=u+1
),B进入LAST-ACK
(最后确认)状态,等待A的确认。 - A收到B的连接释放报文段后,对此发出确认报文段(
ACK=1,seq=u+1,ack=w+1
),A进入TIME-WAIT
(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL
(最大报文段生存时间)后,A才进入CLOSED
状态。B收到A发出的确认报文段后关闭连接,若没收到A发出的确认报文段,B就会重传连接释放报文段。
4.为什么不是两次握手
为什么A最后还要发送一次确认呢?这主要是为了防止已失效的连接请求报文段突然又传送到了B,因而产生错误。
所谓“已失效的连接请求报文段”是这样产生的。考虑一种正常情况,A发出连接请求,但因连接请求报文丢失而未收到确认。于是A再重传一次连接请求。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接。A共发送了两个连接请求报文段,其中第一个丢失,第二个到达了B,没有“已失效的连接请求报文段”。
现假定出现一种异常情况,即A发出的第一个连接请求报文段并没有丢失,而是在某些网络结点长时间滞留了,以致延误到连接释放以后的某个时间才到达B。本来这是一个早已失效的报文段。但B收到此失效的连接请求报文段后,就误认为是A又发出一次新的连接请求。于是就向A 发出确认报文段,同意建立连接。假定不采用报文握手,那么只要B发出确认,新的连接就建立了。
由于现在A并没有发出建立连接的请求,因此不会理睬B的确认,也不会向B发送数据。但B却以为新的运输连接已经建立了,并一直等待A发来数据。B的许多资源就这样白白浪费了。
采用三报文握手的办法,可以防止上述现象的发生。例如在刚才的异常情况下,A不会向B的确认发出确认。B由于收不到确认,就知道A并没有要求建立连接。
5.四次挥手中为什么等待2MSL
第一,为了保证A发送的最后一个ACK报文段能够到达B。这个ACK报文段有可能丢失,因而使处在LAST-ACK状态的B收不到对已发送的FIN +ACK报文段的确认。B会超时重传这个FIN + ACK报文段,而A就能在2MSL时间内收到这个重传的FIN +ACK报文段。接着A重传一次确认,重新启动2MSL计时器。最后,A和B都正常进入到CLOSED状态。如果A在TIME-WAIT 状态不等待一段时间,而是在发送完ACK报文段后立即释放连接,那么就无法收到B重传的FIN + ACK报文段,因而也不会再发送一次确认报文段。这样,B就无法按照正常步骤进入CLOSED状态。
第二,防止上一节提到的“己失效的连接请求报文段”出现在本连接中。A在发送完最后一个ACK 报文段后,再经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。B只要收到了A发出的确认,就进入CLOSED 状态。同样,B在撤销相应的传输控制块TCB后,就结束了这次的TCP连接。我们注意到,B结束TCP连接的时间要比A早一些。
6.四次挥手原因
TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当客户端发出FIN报文段时,只是表示客户端已经没有数据要发送了,客户端告诉服务器,它的数据已经全部发送完毕了;但是,这个时候客户端还是可以接受来自服务端的数据;当服务端返回ACK报文段时,表示它已经知道客户端没有数据发送了,但是服务端还是可以发送数据到客户端的;当服务端也发送了FIN报文段时,这个时候就表示服务端也没有数据要发送了,就会告诉客户端,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。
简单地说,前 2 次挥手用于关闭一个方向的数据通道,后两次挥手用于关闭另外一个方向的数据通道。
7.HTTP和HTTPS的区别
- HTTP协议是免费使用的,而 HTTPS 协议需要到CA机构申请证书,需要缴纳费用,HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的SSL/TLS加密传输协议,信息是密文。
- HTTP的连接很简单,是无状态的;HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全和HTTP通信相比HTTPS 通信会由于加减密处理消耗更多的CPU和内存资源。
- HTTP和HTTPS使用的端口也不一样,前者是80,后者是443。
8.对称加密与非对称加密
对称加密:
对称加密是指加密和解密使用同一个密钥的方式,一方通过密钥将信息加密后,把密文传给另一方,另一方通过这个相同的密钥将密文解密,转换成可以理解的明文。
非对称加密:
使用一对非对称密钥加密,即公钥和私钥,公钥可以随意发布,任何人都能获得,但私钥只有自己知道,发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以叫作非对称加密。
9.什么是数字证书
10.HTTPS工作流程
HTTPS协议是安全的,因为HTTPS协议会对传输的数据进行加密,而加密过程是使用了非对称加密实现。但是HTTPS在内容传输使用的是对称加密,在证书验证阶段使用非对称加密。所以HTTPS加密方式是:对称加密 + 非对称加密混合。
① 证书验证阶段:
1)浏览器发起 HTTPS 请求;
2)服务端返回 HTTPS 证书;
3)客户端验证证书是否合法,如果不合法则提示告警。
② 数据传输阶段:
1)当证书验证合法后,在本地生成随机数;
2)通过公钥加密随机数,并把加密后的随机数传输到服务端;
3)服务端通过私钥对随机数进行解密;
4)服务端通过客户端传入的随机数构造对称加密算法,对返回结果内容进行加密后传输。
11.浏览器输入URL到页面返回详细过程
输入网址:输入要访问的网址,即URL。
缓存解析:浏览器获取URL后,先去缓存中查找资源,从浏览器缓存-系统缓存-路由器缓存中查看; 如果有就从缓存中显示界面,不再发送请求; 如果没有,则发送HTTP请求。
域名解析:发现缓存中没有资源,发送HTTP请求; 在发送HTTP请求之前,需要进行DNS解析(域名解析); DNS解析:域名到IP地址的转换过程,域名的解析工作由DNS服务器完成,解析后可以获取域名相应的IP地址。
TCP连接:三次握手在域名解析后,浏览器向服务器发起了HTTP请求,TCP连接;因为TCP协议时面向连接的,所以在传输数据前必须建立连接,即三次握手;TCP连接建立后,浏览器开始向服务器发送HTTP请求报文。
收到请求:服务器收到浏览器发送的请求信息,返回响应。
页面渲染:浏览器收到服务器发送的响应,显示页面内容。
12.DNS解析过程
浏览器搜索自己浏览器的DNS缓存,若没有,则搜索本地操作系统中的DNS缓存和hosts文件。若没有,则操作系统将域名发送至本地域名服务器,本地域名服务器查询自己的DNS缓存,查找成功则返回结果,否则依次向根域名服务器、顶级域名服务器、权限域名服务器发起查询请求,最终返回IP地址给本地域名服务器。本地域名服务器将得到的IP地址返回给操作系统,同时自己也将IP地址缓存起来,操作系统将IP地址返回给浏览器,同时自己也将IP地址缓存起来,浏览器得到域名对应的IP地址。
13.HTTP长连接和短连接,流水线是什么
长连接和短连接:
-
HTTP1.0默认使用的是短连接。浏览器和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。
-
HTTP/1.1起默认使用长连接。要使用长连接,客户端和服务器的HTTP响应头部的Connection要设置为
keep-alive
,才能支持长连接。 -
HTTP长连接,指的是复用TCP连接。多个HTTP请求可以复用同一个TCP连接,这就节省了TCP连接建立和断开的消耗。
更多详细内容可查看:一文搞懂 HTTP 的长连接和短连接
流水线:
默认情况下,HTTP请求是按顺序发的,下一个请求只有在当前请求收到响应之后才会被发出,有点像停止等待协议。而在收到下一个请求之前,可能需要很长时间。流水线就是在一个HTTP长连接下连续发出请求,不用等待响应返回,减少延迟。
14.GET和POST区别和应用
-
get请求用来从服务器上获得资源,而post是用来向服务器提交数据;
-
get将表单中数据按照name=value的形式,添加到action 所指向的URL 后面,并且两者使用”?”连接,而各个变量之间使用”&”连接;
post是将表单中的数据放在HTTP协议的请求头或消息体中,传递到action所指向URL;
-
get传输的数据要受到URL长度限制(最大长度是 2048 个字符);而post可以传输大量的数据,上传文件通常要使用post方式;
-
使用get时参数会显示在地址栏上,如果这些数据不是敏感数据,那么可以使用get;对于敏感数据还是应用使用post;
-
get使用MIME类型application/x-www-form-urlencoded的URL编码(也叫百分号编码)文本的格式传递参数,保证被传送的参数由遵循规范的文本组成,例如一个空格的编码是”%20”。
ps:GET方式提交表单的典型应用是搜索引擎。GET方式就是被设计为查询用的。
GET | 发送一个请求常用来获取服务器资源 |
---|---|
POST | 向URL指定的资源提交数据或附加新的数据 |
PUT | 跟POST方法很像,也是像服务器提交数据进行处理请求。但是,它们之间有不同。PUT指定了资源在服务器上的位置,而POST没有。一般用于修改资源 |
DELETE | 请求服务器删除指定的资源 |
15.TCP和UDP区别和应用
- TCP是可靠传输,UDP是不可靠传输。
- TCP面向连接,UDP无连接,即发送数据之前不需要建立连接。
- TCP传输数据有序,UDP不保证数据的有序性。
- TCP面向字节流,把数据看成一连串字节流,UDP是面向报文的。
- TCP传输速度相对UDP较慢。
- TCP有流量控制和拥塞控制,UDP没有。
- TCP是重量级协议,UDP是轻量级协议。
- TCP首部20字节,UDP首部8字节。
- TCP连接只能是一对一的(端到端);UDP支持一对一、一对多、多对一和多对多的通信方式。
16.什么是Cookie和Session,二者区别
1.Cookie:
是什么:Cookie 是保存在客户端浏览器里的一种信息载体
为什么:用来保存一些站点的用户数据,这样能够为用户带来方便,比如免登陆功能
怎么做:服务器发送的响应报文的首部有一个set-cookie
字段,客户端在拿到这个响应后把这个字段的内容保存到浏览器中。在客户端再次发送请求同类资源时,就会把 cookie 一起携带在请求中,发送到客户端
2.Session:
是什么:服务器会给每个浏览器创建一个 session 对象,保存在服务器里。
为什么:存储在浏览器的 cookie 不安全,可能会有一些 js 脚本能拿到 cookie 的信息,所以存储在服务器更加安全一些。
怎么做:使用session维护用户登陆状态如下:
用户登陆时,把用户名密码表单,放入http请求报文中。
服务器收到后,为其创建一个session,并创建一个名为sessionlD 的cookie,其值就映射了服务器里的session
客户端收到这个cookie后,把sessionID保存在cookie里。
客户端之后对同一个服务器进行请求时,会把 cookie 也带上去,服务器收到之后提取出 sessionIlD,从中读取出用户信息。
3.区别:
作用范围不同:Cookie保存在客户端,Session保存在服务器端。
有效期不同:Cookie可设置为长时间保持,比如我们经常使用的默认登录功能,Session一般失效时间较短,客户端关闭或者Session超时都会失效。
隐私策略不同:Cookie存储在客户端,容易被窃取;Session存储在服务端,安全性相对Cookie要好一些。
存储大小不同:单个Cookie保存的数据不能超过4K;对于Session来说存储没有上限,但出于对服务器的性能考虑,Session内不要存放过多的数据,并且需要设置Session删除机制。
17.什么是ARP协议
- ARP解决了同一个局域网上的主机和路由器IP和MAC地址的解析。
- 每台主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址的对应关系。
- 当源主机需要将一个数据包要发送到目的主机时,会首先检查自己ARP列表中是否存在该IP地址对应的MAC地址,如果有,就直接将数据包发送到这个MAC地址;如果没有,就向本地网段发起一个ARP请求的广播包,查询此目的主机对应的MAC地址。此ARP请求数据包里包括源主机的IP地址、硬件地址、以及目的主机的IP地址。
- 网络中所有的主机收到这个ARP请求后,会检查数据包中的目的IP是否和自己的IP地址一致。如果不相同就忽略此数据包;如果相同,该主机首先将发送端的MAC地址和IP地址添加到自己的ARP列表中,如果ARP表中已经存在该IP的信息,则将其覆盖,然后给源主机发送一个ARP响应数据包,告诉对方自己是它需要查找的MAC地址。
- 源主机收到这个ARP响应数据包后,将得到的目的主机的IP地址和MAC地址添加到自己的ARP列表中,并利用此信息开始数据的传输。
- 如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。