网站首页 > 技术文章 正文
21.面试题:TCP/IP是如何在媒介上进行传输的呢?
在不同层次的协议?
数据包首部:
以太网包首部:IP包首部,TCP包首部,数据
IP包首部:TCP包首部,数据
TCP包首部:数据
每个分层中,都会对所发送的数据附加一个首部,它包含了该层中必要的信息。(发送的目标地址,协议相关的信息等)
- 包是全能性术语
- 帧是数据链路层中包的单位
- 数据包,IP和UDP等网络层以上的分层中包的单位
- 段,表示TCP数据流中的信息
- 消息,应用协议中数据的单位
数据包的首部,明确表明了协议应该如何读取数据。掌握数据包首部,通常,为协议提供的信息为包首部,所要发送的内容为数据。
发送数据包,TCP/IP通信流程:
- 应用程序处理,发送通信开始TCP/IP通信,应用程序会进行编码处理,编码相当于OSI中的表示层功能。
- TCP模块的处理,TCP负责建立连接,发送数据以及断开连接,TCP提供将应用层发来的数据顺利发送至对端的可靠传输。在应用层数据的前端附加一个TCP首部,它包含源端口号和目标端口号,序号以及校验和(用来判断数据是否被破坏)然后附加一个TCP首部的包再发给IP。
- IP模块的处理,在TCP首部的前端加上自己的IP首部,它包含接收端IP地址和发送端IP地址。若不知道接收端的MAC地址,可以用ARP查找,只要知道对端MAC地址,就可以将MAC以及IP地址交给以太网的驱动程序,来实现数据传输。
- 网络接口的处理,从IP传过来的IP包,然后附加上以太网首部并进行发送处理,以太网首部包含接收端的MAC地址,发送端的MAC的地址,以及标志以太网类型的以太网数据的协议。
数据包,经过以太网的数据链路时,大致上附加了以太网包首部,IP包首部,TCP包首部或者UDP包,以及应用自己的包首部和数据,最后包追加了包尾。
分层中包的结构
数据包接收流程
- 网络接口的处理,主机收到以太网包后,从以太网的包首部找到MAC地址判断是否为发给自己的,若不是就丢弃,如果是,就查找以太网包首部中的类型域从而确定以太网协议所传送过来的数据类型。
- 通过IP模块处理,然后TCP模块处理(需要判断是否被破坏),检查是否按照序号接收数据。当数据接收完毕后,会发送“确认回执”给发送端。注意,这里的回执信息未能达到发送端,那么发送端会认为没有收到而一直反复发送。
- 应用程序的处理,接收端应用程序会直接接收发送端发送的数据信息。
22.了解一下http-http3.0
在http2.0中,TCP管道传输途中也会导致丢包问题,造成队头阻塞(在http2.0中的TCP建立连接三次握手,和HTTPS的TSL连接也会耗费较多时间)
其实多路复用技术可以只通过一个TCP连接就可以传输所有的请求数据。
http3中弄了一个基于UDP协议的QUIC协议,QUIC虽说基于UDP,但是在基础上添加了很多功能。QUIC(快速UDP网络连接)是一种实验性的网络传输协议,由Google开发,该协议旨在使网页传输更快。
对于在http中的缺点就是延迟,浏览器的阻塞,在对同一域名,同时只能连接4个,超过了浏览器的最大连接限数时,后面的请求就会被阻塞;DNS的查询就是将域名解析为IP,来向目标服务器的IP建立连接,其中通过DNS缓存可以达到减少时间的作用;建立连接,HTTP是基于tcp协议的,三次握手,每次连接都无法复用,so,会每次请求都要三次握手和慢启动,都会影响导致延迟。(慢启动对大量小文件请求影响较大)
http处于计算机网络中的应用层,建立在TCP协议之上。(掌握了解tcp建立连接的3次握手和断开连接的4次挥手和每次建立连接带来的RTT延迟时间)。
相对于HTTP1.0使用了header里的if-modified-since,expires来做缓存判断,在HTTP1.1中引入了entity tag,if-unmodified-since,if-match,if-none-match等更多可供选择的缓存头来控制缓存策略。
http1.0传输数据时,每次都要重新建立连接,增加延迟,http1.1加入了keep-alive可以复用部分连接,但在域名分片等情况下仍要连接夺冠时连接,耗费资源,以及给服务器带来性能压力。
http1.1尝试使用pipeling来解决问题,就是浏览器可以一次性发出多个请求,在同一个域名下,同一条TCP连接,但对于pipeling要求返回是按照顺序的,即(如果前面有个请求很耗时的话,后面的请求即使服务器已经处理完,任会等待前面的请求处理完才开始按序返回。)
在http1.x中,Header携带内容过大,增加了传输的成本,在传输的内容都是明文,在一定程度上无法保证其数据的安全性。(在http1.x问题的出现,有了SPDY协议,用于解决http/1.1效率不高的问题,降低延迟,压缩Header等)
HTTP2主要解决用户和网站只用一个连接(同域名下所有通信都只用单个连接完成,单个连接可以承载任意数量的双向数据流,数据流是以消息的形式发送,消息由一个或多个帧组成)。
so,http采用二进制格式传输数据,不像http1.x的文本格式。(二进制:http2将请求和响应数据分割成帧,并且它们采用二进制的编码),对于HTTP2的概念:(流,消息,帧)
- 流,它是连接中的一个虚拟信道;
- 消息,它是HTTP消息,请求,以及响应;
- 帧,它是HTTP2.0通信的最小单位。
多个帧可以乱序发送,可根据帧首部的标识流进行重新组装。
对于http2,同一域名下只需要使用一个TCP连接,那么当出现丢包时,会导致整个TCP都要开始等待重传。对于http1.1来说,可以开启多个TCP连接,出现这种情况只会影响一个连接(或者部分),其余的TCP连接正常传输。
HTTP/2 对首部采取了压缩策略,为了减少资源消耗并提升性能。(因为在http1中,在header携带cookie下,可能每次都要重复传输数据)
so,有了QUIC协议,整合了TCP,TLS,和HTTP/2的优点,并加以优化。那么QUIC是啥,它是用来替代TCP,SSL/TLS的传输层协议,在传输层之上还有应用层。
注意,它是一个基于UDP协议的QUIC协议,使用在http3上。
QUIC 新功能
HTTPS 的一次完全握手的连接过程
QUIC可以解决传输单个数据流可以保证有序的交付,并且不会影响其他的数据流。(解决http2问题)
表示在QUIC连接中,一个连接上的多个stream,如其中stream1,stream2,stream3,stream4,其中stream2丢失(quic packet),其余UDP到达,应用层直接读取。--- 无需等待,不存在TCP队头阻塞,丢失的包需要重新传即可。
补充:
- TCP是基于IP和端口去识别连接的;
- QUIC是通过ID的方式去识别连接的
对于QUIC的包都是经过认证的,除了个别,so,这样,通过加密认证的报文,就可以降低安全风险。
HTTP2-TLS,TCP,IP
小结QUIC特点:(基于UDP)--- http3-QUIC,UDP,IP
- 多路数据流
- TLS
- 有序交付
- 快速握手
- 可靠性
23.网络中的UDP
UPD面向报文的协议,就是UDP只是报文的搬运工,不会对报文进行任何拆分和拼接操作,在发送端,应用层将数据传给传输层的UDP协议,UDP会给数据加一个UDP头标识下是UUDP协议,然后传给网络层。
接收端,网络层将数据传给传输层,UDP只去除IP报文头就传给应用层,不会任何拼接操作。
UDP是无连接,通信不需要建立和断开连接,UDP是不可靠的,不关心数据的安全等问题,UDP是没有拥塞控制,在网络条件不好的情况下可能会导致丢包。
传输:UDP 支持一对一,一对多,多对多,多对一的的传输方式, UDP 提供了单播,多播,广播的功能。
24.网络中的TCP
UDP没有TCP那么复杂,UDP头部开销小,但是TCP头部比UDP头部复杂得多,UDP头部只有8字节,相比TCP的至少20字节要少很多。
Sequence number
这个序号保证了TCP传输的报文都是有序的,对端可以通过序号顺序的拼接报文
Window Size
表示窗口大小,还能接收多少字节的数据
Acknowledgement Number
表示上一个序号的数据已经接收到,接收端期望接收的下一个字节的编号是多少
标识符
当ACK=1,表示确认号字段有效
当SYN=1,ACK=0时,表示当前报文段是一个连接请求报文
当SYN=1,ACK=1时,表示当前报文段是一个同意建立连接的应答报文
当FIN=1,表示此报文段是一个释放连接的请求报文
性能指标 RTT
表示发送端发送数据到接收到对端数据所需的往返时间
小结
- TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议
- UDP(User Data Protocol,用户数据报协议)是面向非连接的协议。
25.建立连接三次握手
建立连接开始时,两端都是CLOSED状态,通信开始前,双方都会创建 TCB,后进入 LISTEN 状态,开始等待客户端发送数据。
第一次握手
客户端向服务器端发送连接请求报文段,请求发送后,客户端进入SYN-SENT 状态。
第二次握手
服务端收到连接请求报文段后,发送完成后便进入 SYN-RECEIVED 状态。
第三次握手
客户端收到连接同意的应答后,要向服务端发送一个确认报文。客户端发完这个报文段后便进入ESTABLISHED 状态,服务端收到这个应答后也进入 ESTABLISHED状态,此时连接建立成功。
有人问了,两次握手就可以建立连接了,为啥要第三次呢?
因为防止失效的连接请求报文段被服务器端接收,从而导致错误。
26.http请求码有哪些?
100为继续,一般发送post请求时,已经发送了http header之后服务端将返回此信息,表示确认,之后发送具体参数信息;201,请求成功并且服务器创建了新的资源;202,服务器已接受请求,但未处理。
301,请求的网页已经永久移动到新的位置;302,临时性重定向;303,临时性重定向,且总是使用GET请求新的URI;304,自从上次请求后,请求的网页未修改过。
404,服务器无法理解请求;401,请求未授权;403,禁止访问。
27.面试时,简单说说TCP传输的三次握手四次挥手
传输,为了准确无误地把数据传输给目标,TCP协议采用了三次握手策略,用TCP协议把数据包送出去后,会向对方确认是否成功达到,发送端发送一个带SYN标志的数据包给到对方,接收端收到后,会回传一个带有SYN/ACK标志的数据包表示传送到达的确认信息,然后发送端也再次回传一个带有ACK标志的数据包,表示“握手”结束了。
握手过程中使用的标志:SYN和ACK
断开一个TCP连接需要四次挥手:
第一次挥手
主动关闭的一方,发送一个FIN(上述讲过---当FIN=1,表示此报文段是一个释放连接的请求报文),传送数据,用来告诉对方(被动关闭方),说不会再给你发送数据了。---主动关闭的一方可以接受数据。
第二次挥手
被动关闭方 收到 FIN 包,发送 ACK 给对方,确认序号。
第三次挥手
被动关闭方 发送一个 FIN,关闭方,说我不会再给你发数据了。(你不给我发送数据,我也不给你发送数据了)
第四次挥手
主动关闭一方收到 FIN ,发送要给 ACK ,用来确认序号
28.常说的HTTPS
其实HTTP协议时承载于TCP协议之上的,在HTTP和TCP之间添加一个安全协议层,SSL或者TSL(ssl/tls协议传输,包含证书,卸载,流量转发,负载均衡,页面适配,浏览器适配,refer传递等),则就是常说的HTTPS。
29.GET和POST的区别,何时使用POST?
- GET是用于信息获取,使用URL传递参数,发送信息的数量有限;
- POST是用于修改服务器上的资源;
- 一般使用POST,当无法使用缓存文件,向服务器发送大量的数据,发送未知的字符
30.面试问,HTTP协议的主要特点
- 简单快速
- 灵活
- 无连接
- 无状态
31.面试问,说说HTTP报文的组成部分
HTTP报文的组成部分包含:请求报文和响应报文
请求报文:有请求行,请求头, 空行,请求体
响应报文:有状态行,响应头,空行,响应体
请求报文包含:
1.请求方法,2.请求URL,3.HTTP协议以及版本,4.报文头,5.报文体
- 请求行,有请求方法,请求URL,http协议以及版本;
- 请求头,一堆键值对
- 空行,当服务器在解析请求头的时候,遇到了空行,表明后面的内容是请求体
- 请求体,请求数据
响应报文包含:
1.报文协议以及版本,2,状态码以及状态描述,3,响应头,4,响应体
- 状态行:http协议和版本,状态码以及状态描述
- 响应头
- 空行
- 响应体
32.面试时问,知道哪些HTTP方法
- GET方法获取资源
- POST方法传输资源
- PUT方法更新资源
- DELETE方法删除资源
- HEAD方法获得报文首部
33.持久链接
在http1.0中,客户端每隔很短时间会对服务器发出请求,查看是否有新的数据,只要轮询足够快,就可以造成交互实时进行,但这个做法,会对两端造成大量的性能浪费。
对于http1.1中的长连接,使用connection:keep-alive进行长连接,客户端只请求一次,但是服务器会将继续保持连接,再次请求时,避免了重新建立连接。
注意,keep-alive不会永久保持连接,只有保持一个时间段。
34.安全问题:CSRF和XSS
CSRF的基本概念,攻击原理,防御措施
CSRF(Cross-site request forgery):跨站请求伪造
理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。
以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账……造成的问题包括:个人隐私泄露以及财产安全。
CSRF的原理:(要完成一次CSRF攻击)
- 登录受信任网站A,并在本地生成Cookie。
- 在不登出A的情况下,访问危险网站B。
XSS的基本概念,跨域脚本攻击。
xss是一种发生在web前端的漏洞,所以其危害的对象也主要是前端用户。
跨域脚本攻击时,恶意攻击者往web页面里插入恶意的script代码,在浏览器中运行script代码,达到恶意攻击用户的目的。
so,实现xss攻击具备2个条件,第一需要向web页面注入恶意的代码,第二,这些恶意代码被浏览器成功的执行。
CSRF和XSS的区别:
- CSRF需要登录,获取COOKIE,利用网站本身的漏洞,去请求网站的api
- XSS,不需要登录,向网站注入JS代码,执行JS里的代码,篡改网站的内容
35.从一个HTTP请求来看网络分层原理
一个HTTP请求的分层解析流程:
TCP,它是面向连接的,可靠的,基于字节流的传输层通信协议。
特点:
- 基于连接,数据传输之前需要建立连接
- 全双工的,双向传输
- 字节流,不限制数据大小,打包成报文段,保证有序接收,重复报文自动丢弃
- 流量缓冲,解决双方处理能力的不匹配
- 可靠的传输服务,保证可达,丢包时通过重发机制实现可靠性
- 拥塞控制,防止网络出现恶性拥塞
TCP连接,源地址,源端口,目的地址,目的端口
从TCP-IP协议底层
滑动窗口协议与累计确认(延时ACK)
滑动窗口大小同通过tcp三次握手和对端协商,且受网络状况影响
36.HTTPS安全加密通道原理分析
什么是HTTPS协议,由于HTTP天生“明文”的特点,整个传输过程完全透明,任何人都能够在链路中截获,修改或者伪造请求、响应报文,数据不具有可信性。
使用HTTPS时,所有的HTTP请求和响应发送到网络前,都要进行加密。
https = http + ssl/tls
对称加密:加密 解密使用同一密钥
非对称加密:公钥-随意分发,私钥-服务器自己保持
公钥加密的数据,只能通过私钥解密
私钥加密的数据,只能公钥能解密
加密算法:
对称密钥加密算法,编,解码使用相同密钥的算法
非对称密钥加密算法,一个公钥,一个私钥,两个密钥是不同的,公钥可以公开给任何人使用,私钥是严格保密的。
加密通道的建立:
数字证书的申请和验证
如何申请:
- 生成自己的公钥和私钥,服务器自己保留私钥
- 向CA机构提交公钥,公司,域名信息等待认证
- CA机构通过线上,线下多种途径验证你提交信息的真实性,合法性
- 信息审核通过,CA机构则会向你签发认证的数字证书,包含了公钥,组织信息,CA信息,有效时间,证书序列号,同时生成了一个签名
- 签名步骤:hash(用于申请证书所提交的明文信息)= 信息摘要
- CA再使用CA机构的私钥对信息摘要进行加密,密文就是证书的数字签名
37.https的对称加密,非对称加密,混合加密,CA认证
HTTPS ,超文本传输安全协议,目标是安全的HTTP通道,应用是安全数据传输。HTTP协议虽然使用广,但是存在不小的安全缺陷,主要是数据的明文传送和消息完整性检测的缺乏。
HTTPS协议是由HTTP加上TLS/SSL协议构建的可进行加密传输,身份认证的网络协议。
通过, 数字证书,加密算法,非对称密钥 等技术完成互联网数据传输加密,实现互联网传输安全保护。
HTTPS主要特性:
- 数据保密性
- 数据完整性
- 身份校验安全性
客户端和服务器端在传输数据之前,会通过基于证书对双方进行身份认证。客户端发起SSL握手消息给服务端要求连接,服务端将证书发送给客户端。客户端检查服务器端证书,确认是否由自己信任的证书签发机构签发,如果不是,将是否继续通讯的决定权交给用户选择,如果检查无误或者用户选择继续,则客户端认可服务端的身份。
服务端要求客户端发送证书,并检查是否通过验证,失败则关闭连接,认证成功,从客户端证书中获得客户端的公钥。
HTTP原理
客户端的浏览器首先要通过网络与服务器建立连接,该连接是通过TCP来完成的,一般TCP连接的端口号是80,建立连接后,客户端发送一个请求给服务器端;服务器端接收到请求后,给予相应的响应信息。
HTTPS原理
客户端将它所支持的算法列表和一个用作产生密钥的随机数发送给服务器,服务器从算法列表中选择一种加密算法,并将它和一份包含服务器公用密钥的证书发送给客户端,该证书还包含了用于认证目的的服务器标识,服务器同时还提供了一个用作产生密钥的随机数。
客户端对服务器的证书进行验证,并抽取服务器的公用密钥,再产生一个称作pre_master_secret的随机密码串,并使用服务器的公用密钥对其进行加密,并将加密后的信息发送给服务器。
客户端与服务器端根据pre_master_secret以及客户端与服务器的随机数独立计算出加密和MAC密钥。
混合加密
在传输数据中使用对称加密,但对称加密的密钥采用非对称加密来传输,混合加密比较安全,但无法知道数据是否被篡改
CA认证
CA认证, 即是电子认证服务,指电子签名相关各方提供真实性,可靠性验证的活动。
特性:参阅百度百科—简介,点击进入
38.https对比http
http传输方式:明文传输,网站或相关服务与用户之间的数据交互无加密,容易被监听,篡改。
https传输方式:在HTTP加入了SSL层,用于数据传输加密。
http身份认证:无任何身份认证,用户无法通过http辨认出网站的真实身份。
https身份认证:经过CA多重认证,包含域名管理权限认证等。
http成本:无任何使用成本,所有网站默认是http模式。
https需要成本,需要申请SSL证书来实现https。
http连接端口:80端口。
https连接端口:443端口。
39.证书如何安全传输,被掉包了怎么办?
40.http3中QUIC
QUIC是谷歌制定的一种基于UDP的低时延的互联网传输层协议。
1、避免前序包阻塞;2、零RTT建连;3、FEC前向纠错
HTTP 的历史
HTTP/2 和 HTTP/3 建立连接的差别
TCP/建立连接与QUIC建立连接
队头阻塞/多路复用
HTTP/1.1 提出了 Pipelining 技术,允许一个 TCP 连接同时发送多个请求
请求与响应,与,Pipelining
http/1.1队头阻塞
HTTP/2 的多路复用解决了队头阻塞问题
拥塞控制:
- 慢启动
- 拥塞避免
- 快速重传
- 快速恢复
41.HTTP 协议入门
HTTP 基于TCP/IP 协议的应用层协议,不涉及数据包packet传输,主要客户端和服务器之间的通信格式,默认使用80端口。TCP连接建立后,客户端向服务器请求网页,协议规定,服务器只能回应HTML格式的字符串,不能回应别的格式。
http1.0可以传输文字,传输图像,视频,二进制文件;除了GET方法,还有POST,HEAD等;每次通信都需要 头信息HTTP header,状态码,多字符集支持,缓存,权限等。
字段:ontent-Type 字段
头信息必须是 ASCII 码,后面的数据可以是任何格式,字段值:
text/plain
text/html
text/css
image/jpeg
image/png
image/svg+xml
audio/mp4
video/mp4
application/javascript
application/pdf
application/zip
application/atom+xml
客户端请求的时候,使用Accept字段,表示可以接受哪些数据格式。
Accept: */*
Content-Encoding字段,表示数据的压缩方式
Content-Encoding: gzip
Content-Encoding: compress
Content-Encoding: deflate
客户端在请求时,用Accept-Encoding字段说明接受哪些压缩方法。
Accept-Encoding: gzip, deflate
http1.0就是每个TCP连接只能发送一个请求,发送完毕后就关闭,so,为解决问题,用了一个非标准Connection字段,Connection:keep-alive。
HTTP/1.1引入了持久连接(persistent connection),TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive。
也不是永久性不关闭的,只要有一段时间没有活动,就会关闭TCP连接,一般对于同一个域名,大多数浏览器允许同时建立6个持久连接。
1.1 版引入了管道机制(pipelining),同一个TCP连接里,可以同时发送多个请求。但是还是按照顺序,一个请求回应后,再回应另一个请求。(但也减少不小的消耗时间)。
使用分块传输编码,只要请求或回应的头信息有Transfer-Encoding字段
Transfer-Encoding: chunked
什么是多工?双向,实时的通信就叫 多工。
HTTP2 复用TCP连接,在一个连接里,两端都可以同时发送多个请求或响应,而且不用按照顺序一一对应,避免了“队头堵塞”。
http2引入了头信息压缩机,头信息使用gzip或compress压缩后再发送,客户端和服务器同时维护一张头信息表,所有字段存在这个表里,生成一个索引号,以后就只发送索引号,这样就提高速度了。
HTTP/2允许服务器未经请求,主动向客户端发送资源(服务器推送)
猜你喜欢
- 2024-11-13 「直击面试」- 搞定计算机网络,这些问题还没有我答不出来的
- 2024-11-13 HTTP面试题 高校毕业生就业难 面试题
- 2024-11-13 HTTP的起源与发展 http的具体内容是什么
- 2024-11-13 前端优化的步骤 前端优化的步骤包括
- 2024-11-13 Python最常见的170道面试题全解析答案(四)
- 2024-11-13 前端项目中 浏览器缓存的更新不及时问题及解决方法
- 2024-11-13 你还没弄懂浏览器的缓存机制吗? 介绍一下浏览器缓存
- 2024-11-13 如何使用缓存提高系统性能? 提高缓存速度
- 2024-11-13 网络相关面试题 网络相关面试问题
- 2024-11-13 为什么你做的H5开屏那么慢?H5首屏秒开方案探讨
- 标签列表
-
- content-disposition (47)
- nth-child (56)
- math.pow (44)
- 原型和原型链 (63)
- canvas mdn (36)
- css @media (49)
- promise mdn (39)
- readasdataurl (52)
- if-modified-since (49)
- css ::after (50)
- border-image-slice (40)
- flex mdn (37)
- .join (41)
- function.apply (60)
- input type number (64)
- weakmap (62)
- js arguments (45)
- js delete方法 (61)
- blob type (44)
- math.max.apply (51)
- js (44)
- firefox 3 (47)
- cssbox-sizing (52)
- js删除 (49)
- js for continue (56)
- 最新留言
-