- 1、网络分层结构
- 2、三次握手
- 3、四次挥手
- 4、第四次挥手为什么要等待2MSL?
- 5、为什么是四次挥手?
- 6、TCP和UDP的区别
- 7、TCP有哪些特点?
- 8、HTTP协会的特点
- 9、HTTP报文格式
- 1、HTTP由
请求行
、请求头部
、空行
、请求体
四部分组成 - 2、HTTP响应也由四个部分组成,分别是:状态行、响应头、空行和响应体。
- 1、HTTP由
- 10、HTTP状态码有哪些
- 11、HTTP1.0和HTTP1.1的区别?
- 12、HTTP1.1和 HTTP2.0的区别?
- 13、HTTPS和HTTP的区别
- 14、什么是数字证书?
- 15、HTTPS原理
- 16、DNS 的解析过程?
- 17、浏览器中输入URL返回页面过程?
- 18、Cookie和Session的区别?
- 19、什么是对称加密和非对称加密?
- 20、http GET 和 POST 请求的优缺
计算机网络体系大致分为三种,OSI七层模型、TCP/IP四层模型和五层模型。一般面试的时候考察比较多的是五层模型。
TCP/IP五层模型:应用层、传输层、网络层、数据链路层、物理层。
-
物理层:实现相邻节点间比特流的透明传输,尽可能屏蔽传输介质和物理设备的差异。
-
数据链路层:在两个相邻节点之间传送数据时,数据链路层将网络层交下来的 IP 数据报组装成帧,在两个相邻节点间的链路上传送帧。
-
网络层:选择合适的路由和交换结点,确保数据及时传送。主要包括IP协议
-
传输层:负责向两台主机进程之间的通信提供数据传输服务。传输层的协议主要有传输控制协议TCP和用户数据协议UDP。
-
应用层:为应用程序提供交互服务。在互联网中的应用层协议很多,如域名系统DNS、HTTP协议、SMTP协议等。
疑问一,图中传递过程中出现的几个字符(SYN,ACK,FIN,seq,ack)各代表什么意思
SYN,ACK,FIN存放在TCP的标志位,一共有6个字符,这里就介绍这三个:
SYN:代表请求创建连接,所以在三次握手中前两次要SYN=1,表示这两次用于建立连接,至于第三次什么用,在疑问三里解答。
FIN:表示请求关闭连接,在四次分手时,我们发现FIN发了两遍。这是因为TCP的连接是双向的,所以一次FIN只能关闭一个方向。
ACK:代表确认接受,从上面可以发现,不管是三次握手还是四次分手,在回应的时候都会加上ACK=1,表示消息接收到了,并且在建立连接以后的发送数据时,都需加上ACK=1,来表示数据接收成功。
seq:序列号,什么意思呢?当发送一个数据时,数据是被拆成多个数据包来发送,序列号就是对每个数据包进行编号,这样接受方才能对数据包进行再次拼接。
初始序列号是随机生成的,这样不一样的数据拆包解包就不会连接错了。(例如:两个数据都被拆成1,2,3和一个数据是1,2,3一个是101,102,103,很明显后者不会连接错误)
ack:这个代表下一个数据包的编号,这也就是为什么第二请求时,ack是seq+1,
假设发送端为客户端,接收端为服务端。开始时客户端和服务端的状态都是
CLOSED
。
1、第一次握手:客户端向服务端发起建立连接请求,客户端会随机生成一个起始序列号x,客户端向服务端发送的字段中包含标志位
SYN=1
,序列号seq=x
。第一次握手前客户端的状态为CLOSE
,第一次握手后客户端的状态为SYN-SEND
。此时服务端的状态为LISTEN
-
2、第二次握手:服务端在收到客户端发来的报文后,会随机生成一个服务端的起始序列号y,然后给客户端回复一段报文,其中包括标志位
SYN=1
,ACK=1
,序列号seq=y
,确认号ack=x+1
。第二次握手前服务端的状态为LISTEN
,第二次握手后服务端的状态为SYN-RCVD
,此时客户端的状态为SYN-SENT
。(其中SYN=1
表示要和客户端建立一个连接,ACK=1
表示确认序号有效) -
3、第三次握手:客户端收到服务端发来的报文后,会再向服务端发送报文,其中包含标志位
ACK=1
,序列号seq=x+1
,确认号ack=y+1
。第三次握手前客户端的状态为SYN-SENT
,第三次握手后客户端和服务端的状态都为ESTABLISHED
。此时连接建立完成。
注意:两次握手可以吗?
第三次握手主要为了防止已失效的连接请求报文段突然又传输到了服务端,导致产生问题。
-
比如客户端A发出连接请求,可能因为网络阻塞原因,A没有收到确认报文,于是A再重传一次连接请求。
-
连接成功,等待数据传输完毕后,就释放了连接。
-
然后A发出的第一个连接请求等到连接释放以后的某个时间才到达服务端B,此时B误认为A又发出一次新的连接请求,于是就向A发出确认报文段。
-
如果不采用三次握手,只要B发出确认,就建立新的连接了,此时A不会响应B的确认且不发送数据,则B一直等待A发送数据,浪费资源。
-
1、A的应用进程先向其TCP发出连接释放报文段(
FIN=1,seq=u
),并停止再发送数据,主动关闭TCP连接,进入FIN-WAIT-1
(终止等待1)状态,等待B的确认。 -
2、B收到连接释放报文段后即发出确认报文段(
ACK=1,ack=u+1,seq=v
),B进入CLOSE-WAIT
(关闭等待)状态,此时的TCP处于半关闭状态,A到B的连接释放。
A收到B的确认后,进入
FIN-WAIT-2
(终止等待2)状态,等待B发出的连接释放报文段。
-
3、B发送完数据,就会发出连接释放报文段(
FIN=1,ACK=1,seq=w,ack=u+1
),B进入LAST-ACK
(最后确认)状态,等待A的确认。 -
4、A收到B的连接释放报文段后,对此发出确认报文段(
ACK=1,seq=u+1,ack=w+1
),A进入TIME-WAIT
(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL
(最大报文段生存时间)后,A才进入CLOSED
状态。B收到A发出的确认报文段后关闭连接,若没收到A发出的确认报文段,B就会重传连接释放报文段。
- 保证A发送的最后一个ACK报文段能够到达B。这个
ACK
报文段有可能丢失,B收不到这个确认报文,就会超时重传连接释放报文段,然后A可以在
2MSL
时间内收到这个重传的连接释放报文段,接着A重传一次确认,重新启动2MSL计时器,最后A和B都进入到CLOSED
状态,若A在TIME-WAIT
状态不等待一段时间,而是发送完ACK报文段后立即释放连接,则无法收到B重传的连接释放报文段,所以不会再发送一次确认报文段,B就无法正常进入到CLOSED
状态。
- 防止已失效的连接请求报文段出现在本连接中。A在发送完最后一个
ACK
报文段后,再经过2MSL,就可以使这个连接所产生的所有报文段都从网络中消失,使下一个新的连接中不会出现旧的连接请求报文段。
因为当Server端收到Client端的
SYN
连接请求报文后,可以直接发送
SYN+ACK
报文。但是在关闭连接时,当Server端收到Client端发出的连接释放报文时,很可能并不会立即关闭SOCKET,所以Server端先回复一个
ACK
报文,告诉Client端我收到你的连接释放报文了。只有等到Server端所有的报文都发送完了,这时Server端才能发送连接释放报文,之后两边才会真正的断开连接。故需要四次挥手。
-
1、TCP面向连接;UDP是无连接的,即发送数据之前不需要建立连接。
-
2、TCP提供可靠传输;UDP不保证可靠交付
-
3、TCP面向字节流。将数据看成一串无结构的字节流;UDP是面向报文的
-
4、TCP有拥塞控制;UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如实时视频会议)
-
5、每一条TCP连接只能是点对点的;UDP是一对一。一对多,多对多的通信方式
-
6、TCP首部开销是20字节;UDP的首部开销小,只有8字节
-
TCP是面向连接的运输层协议。
-
点对点,每一条TCP连接只能有两个端点。
-
TCP提供可靠交付的服务。
-
TCP提供全双工通信。
-
面向字节流。
- HTTP允许传输任意类型的数据。传输的类型由Content-Type加以标记。
- 无状态。对于客户端每次发送的请求,服务器都认为是一个新的请求,上一次会话和下一次会话之间没有联系。
- 支持客户端/服务器模式。
请求行
、请求头部
、空行
、请求体
四部分组成
-
请求行:包括请求方法,访问的资源URL,使用的HTTP版本。
GET
和POST
是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE
。 -
请求头:格式为“属性名:属性值”,服务端根据请求头获取客户端的信息,主要有
cookie、host、connection、accept-language、accept-encoding、user-agent
。 -
请求体:用户的请求数据如用户名,密码等。
请求报文示例:
POST /xxx HTTP/1.1 请求行
Accept:image/gif.image/jpeg, 请求头部
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
Accept-Encoding:gzip,deflate
username=dabin 请求体
2、HTTP响应也由四个部分组成,分别是:状态行、响应头、空行和响应体。
-
状态行:协议版本,状态码及状态描述。
-
响应头:响应头字段主要有
connection、content-type、content-encoding、content-length、set-cookie、Last-Modified,、Cache-Control、Expires
。
- 响应体:服务器返回给客户端的内容。
响应报文示例:
HTTP/1.1 200 OK
Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:23:42 GMT
Content-Length:112
<html>
<body>响应体</body>
</html>
10、HTTP状态码有哪些
11、HTTP1.0和HTTP1.1的区别?
- 长连接:HTTP1.0默认使用短连接,每次请求都需要建立新的TCP连接,连接不能复用。HTTP1.1支持长连接,复用TCP连接,允许客户端通过同一连接发送多个请求。不过,这个优化策略也存在问题,当一个队头的请求不能收到响应的资源时,它将会阻塞后面的请求。这就是“队头阻塞”问题。
- 断点续传:HTTP1.0 不支持断点续传。HTTP1.1 新增了 range字段,用来指定数据字节位置,支持断点续传
- 错误状态响应码:在HTTP1.1中新增了24个错误状态响应码,如
409(Conflict)
表示请求的资源与资源的当前状态发生冲突、410(Gone)
表示服务器上的某个资源被永久性的删除。 - Host头处理:在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名。到了HTTP1.1时代,虚拟主机技术发展迅速,在一台物理服务器上可以存在多个虚拟主机,并且它们共享一个IP地址,故HTTP1.1增加了HOST信息。
HTTP2.0相比HTTP1.1支持的特性:
- 新的二进制格式:HTTP1.1 基于文本格式传输数据;HTTP2.0采用二进制格式传输数据,解析更高效。
- 多路复用:在一个连接里,允许同时发送多个请求或响应,并且这些请求或响应能够并行的传输而不被阻塞,避免 HTTP1.1 出现的”队头堵塞”问题。
- 头部压缩,HTTP1.1的header带有大量信息,而且每次都要重复发送;HTTP2.0 把header从数据中分离,并封装成头帧和数据帧,使用特定算法压缩头帧,有效减少头信息大小。并且HTTP2.0在客户端和服务器端记录了之前发送的键值对,对于相同的数据,不会重复发送。\比如请求a发送了所有的头信息字段,请求b则\只需要发送差异数据,这样可以减少冗余数据,降低开销。
- 服务端推送:HTTP2.0允许服务器向客户端推送资源,无需客户端发送请求到服务器获取。
-
1、HTTP是超文本传输协议、信息是明文传输;HTTPS则是具有安全性的SSL加密传输协议
-
2、HTTP和HTTPS用的端口不一样,HTTP是80,HTTPS是443
-
HTTPS协议需要到CA机构申请证书,一般需要一定的费用
-
3、HTTP运行在TCP协议之上;HTTPS运行在SSL协议之上,SSL运行在TCP协议之上
服务端可以向证书颁发机构CA申请证书,以避免中间人攻击(防止证书被篡改)。证书包含三部分内容:证书内容、证书签名算法和签名,签名是为了验证身份。
服务端把证书传输给浏览器,浏览器从证书里取公钥。证书可以证明该公钥对应本网站。
数字签名的制作过程:
- CA使用证书签名算法对证书内容进行hash运算。
- 对hash后的值用CA的私钥加密,得到数字签名。
浏览器验证过程:
- 获取证书,得到证书内容、证书签名算法和数字签名。
- 用CA机构的公钥对数字签名解密(由于是浏览器信任的机构,所以浏览器会保存它的公钥)。
- 用证书里的签名算法对证书内容进行hash运算。
- 比较解密后的数字签名和对证书内容做hash运算后得到的哈希值,相等则表明证书可信。
-
1、客户端发起一个http请求
-
2.、服务端把自己的信息以数字证书的形式返回给客户端(证书内容包括密钥私钥、网站地址、证书颁发机构、失效日期)。证书中有一个公钥用来加密信息,私钥由服务器持有。
-
3、验证证书的合法性
- 客户端收到服务器的响应后会验证证书的合法性(证书中包含的地址是否和正在访问的地址是否一致,证书的是否过期)
-
4、生成随机密码
- 如果验证通过、或用户接受不受信任的证书,浏览器会生成一个随机的对称密钥(Session Key)并用于公钥加密,让服务器私钥解密,解密后就用这个对称密钥进行传输了,并且能够说明服务器确是私钥的持有者
-
5、生成对称加密算法
- 验证完服务端身份后,客户端生成一个对称加密的算法和对应密钥。以公钥加密后发送给服务端。此时被黑客截获也是没有用的,因为只有服务器端的私钥才能对其解密。之后客户端与服务端可以用这个对称加密算法加密和解密通信内容。
域名到IP地址的解析过程的要点如下:
当某一个应用需要把主机名解析为IP地址时,该应用进程就调用解析程序,并称为DNS的一个客户,把待解析的域名放在DNS请求报文中,以UDP用户数据报方式发给本地域名服务器。本地域名服务器在查找域名后,把对应的IP地址放在回答报文中返回。应用程序获得目的主机的IP地址后即可进行通信。
若本地域名服务器不能回答该请求,则此域名服务器就暂时称为DNS的另一个客户,并向其他域名服务器发出查询请求(发给其他根域名服务器,若根域名服务器叫去指定的其他顶级域名服务器查询请求)。这种过程直至找到能够回答该请求的域名服务器为止。此过程在后面作进一步讨论。
-
1、
解析域名
,找到主机IP -
2、浏览器利用 IP 直接与网站主机通信,三次握手,建立 TCP 连接。浏览器会以一个随机端口向服务端的 web 程序 80 端口发起 TCP 的连接。
-
3、建立TCP连接后,浏览器向服务器主机发送一个HTTP请求
-
4、服务器
响应请求
,发送响应数据 -
5、浏览器
解析响应内容,进行渲染
,呈现给用户
-
作用范围不同:Cookie保存在客户端,Session保存在服务器端
-
有效期不同:Cookie可设置长时间的保持,比如我们常常使用的默认登陆功能,Session一般失效时间比较短,客户端关闭或者Session超时就会失效
-
隐私策略不同:Cookie保存在客户端,容易被窃取;Session存储在Session存储在服务端,安全性相对较高点
-
存储大小不一样:单个 Cookie 保存的数据不能超过 4K;对于 Session 来说存储没有上限,但出于对服务器的性能考虑,Session 内不要存放过多的数据,并且需要设置 Session 删除机制。
对称加密:通信双方使用相同的密钥进行加密。特点是加密速度快,但是缺点是密钥泄露会导致密文数据被破解。常见的对称加密有AES
和DES
算法。
非对称加密:它需要生成两个密钥,公钥和私钥。公钥是公开的,任何人都可以获得,而私钥是私人保管的。公钥负责加密,私钥负责解密;或者私钥负责加密,公钥负责解密。这种加密算法安全性更高,但是计算量相比对称加密大很多,加密和解密都很慢。常见的非对称算法有RSA
和DSA
。
此问答案来源链接:https://blog.csdn.net/zzk220106/article/details/78595108
-
区别
(1)post更安全(不会作为url的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中)
(2)post发送的数据更大(get有url长度限制)
(3)post能发送更多的数据类型(get只能发送ASCII字符)
(4)post比get慢
(5)post用于修改和写入数据,get一般用于搜索排序和筛选之类的操作
(6)get请求的是静态资源,则会缓存,如果是数据,则不会缓存 -
为什么get比post更快
1.post请求包含更多的请求头
因为post需要在请求的body部分包含数据,所以会多了几个数据描述部分的首部字段(如:content-type),这其实是微乎其微的。
2.最重要的一条,post在真正接收数据之前会先将请求头发送给服务器进行确认,然后才真正发送数据 -
post请求的过程:
(1)浏览器请求tcp连接(第一次握手)
(2)服务器答应进行tcp连接(第二次握手)
(3)浏览器确认,并发送post请求头(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)
(4)服务器返回100 Continue响应
(5)浏览器发送数据
(6)服务器返回200 OK响应 -
get请求的过程:
(1)浏览器请求tcp连接(第一次握手)
(2)服务器答应进行tcp连接(第二次握手)
(3)浏览器确认,并发送get请求头和数据(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)
(4)服务器返回200 OK响应
也就是说,目测get的总耗是post的2/3左右,这个口说无凭,网上已经有网友进行过测试。 -
get传参最大长度的理解误区
(1)http协议并未规定get和post的长度限制
(2)get的最大长度限制是因为浏览器和web服务器限制了URL的长度
(3)不同的浏览器和web服务器,限制的最大长度不一样
(4)要支持IE,则最大长度为2083byte,若支持Chrome,则最大长度8182byte