1、请你说说TCP和UDP的区别
- TCP提供面向连接的可靠传输,UDP提供面向无连接的不可靠传输。
- UDP在很多实时性要求高的场景有很好的表现,而TCP在要求数据准确、对速度没有硬件要求的场景有很好的表现。
- TCP和UDP都是传输层协议,都是为应用层程序服务,都有复用(不同应用层协议可以共用TCP和UDP协议)和分用(将数据报解析之后分发给不同的应用层程序)的功能。
- UDP提供面向无连接基于数据报的不可靠传输,TCP提供面向连接的基于字节流的可靠传输。
UDP协议
- 面向无连接(不需要3次握手和4次挥手)、尽最大努力交付、面向报文(每次收发都是一整个报文段)、没有拥塞控制不可靠(只管发不管过程和结果)、支持一对一、一对多、多对一和多对多的通信方式、首部开销很小(8字节)。
- 优点:快,没有TCP各种机制,受了很多首部信息和重复确认的过程,节省了大量的网络资源。
- 缺点:不可靠不稳定,只管数据的发送不管过程和结果,网络不好的时候很容易造成数据丢失。
- 网络不好的时候不会影响主机数据报的发送速率,这对很多实时的应用程序很重要,像语音通话、视频会议等要求源主机要以恒定的速率发送数据报,允许网络不好的时候丢失一些数据,但不允许太大的延迟,UDP很适合这种要求。
TCP协议
- 面向连接(3次握手和4次挥手)、单播(只能端对端的连接)、可靠交付(有大量的机制保护TCP连接数据的可靠性)、全双工通讯(允许双方同时发送信息,4次挥手的原因)、面向字节流(不保留数据报边界的情况下以字节流的方式进行传输,长连接的由来)、头部开销大(至少20字节)。
- 优点:可靠、稳定、有确认、窗口、重传、拥塞控制机制,在数据传完之后,还会断开连接用来节约系统资源。
- 缺点:慢,效率低,占用系统资源高,在传输数据之前要先建立连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞机制等都会消耗大量的时间,要在每台设备上维护所有的传输连接。
- 在要求数据准确、对速度没有硬性要求的场景有很好的表现,比如在FTP(文件传输)、HTTP/HTTPS(超文本传输),TCP很适合这种要求。
2、请你说说TCP3次握手和4次挥手过程
为什么一定要3次握手而不是2次,为什么客户端最后还需要发送一次确认报文呢?
- 防止已经失效的连接请求报文突然又被传给了服务端,然后产生错误
- 假设客户端发出的第一个连接请求报文段并没有丢失而是在某些网络节点上被滞留了,直到客户端和服务端的新连接已经释放后的某个时间点,第一个连接请求报文段才到了服务端,这时服务端以为客户端又发了一次请求,于是服务端向客户端发起确认连接报文,同意连接。假设不采用3次握手,这时连接已经建立了,但是客户端并不知道这个情况,服务端会一直等待客户端的数据报文,这样服务端的资源就会被浪费,占用大量资源。3次握手可以防止这种现象,保护网络和系统资源。
3、请你说说GET和POST的区别
用法不一样、参数显隐式、参数长度
- get主要用来获取数据,而post主要提交或修改数据
- get有长度限制(2048字节)而post没有
- get的参数时显示的,post的参数时隐式的
- get的参数会附加在url中,以"?“分割url和传输数据,多个参数用”&"连接,而post会把参数放在http请求体中
- get是明文传输,可以直接通过url看到参数信息,post放在请求体中,除非用工具才能看到
- get请求会保存在浏览器历史记录中,也可以保存在web服务器日志中
- get在浏览器回退时是无害的,而post会再次提交请求
- get请求会被浏览器主动缓存,而post不会,除非手动设置
- get请求只能进行url编码,而post支持多种编码方式
- get请求的参数数据类型只接受ASCII字符,而post没有限制
4、浏览器从输入URL开始到页面显示内容,中间发生了什么?
- dns域名解析(域名->ip地址),ip寻址和arp(ip->mac)找到服务器
- TCP三次握手建立连接
- 浏览器生成http报文,发送http请求,等待服务器响应
- 服务器处理请求并返回响应结果给浏览器
- 根据http是否开启长连接,进行tcp挥手过程
- 浏览器解析thml
- 浏览器布局渲染
dns地址解析
- 客户端首先向本地dns服务器进行查询,如果不在本地缓存中,则本地dns服务器会像根服务器进行查询,根服务器返回顶级域名服务器的地址给本地dns服务器,然后本地dns服务器查询顶级dns服务器,返回权威dns服务器地址,最终返回给客户端。
dns劫持
攻击者篡改结果,使用户对域名的解析IP变成另一个IP
5、请你说说HTTP状态码及其含义
http状态码由3个十进制数字组成,第一个十进制数字定义状态码的类型。响应分为5类:信息响应(100-199),成功响应(200-299),重定向(300-399),客户端错误(400-499)、服务端错误(500-599)
- 1**,信息,服务端收到请求,需要请求者继续执行操作
- 2**,成功,操作被成功接收并处理
- 3**,重定向,需要进一步的操作以完成请求
- 4**,客户端错误,请求包含语法错误或无法完成请求
- 5**,服务端错误,服务端在处理请求的过程中发生了错误
常见错误码
- 301,永久重定向
- 302,临时重定向
- 304,资源没修改,用之前缓存就行
- 400.客户端请求的报文有错误
- 403,服务端禁止访问资源
- 404,请求的资源在服务器上不存在/未找到
6、请你说说HTTP和HTTPS的区别
- HTTP简单快速,当客户端向服务端请求数据的时候,只需传送请求方法和路径就可以取得结果,基于TCP,默认端口号为80,耗时可以简略计算为1RTT,传递的数据全部是明文传输,几乎没有安全性
- HTTPS是基于TLS的,而TLS又基于TCP,当客户端向服务端请求数据的时候,服务端大概率会将客户端重定向到该服务器的443端口,进行新的TCP连接,此时服务器会返回一个证书文件,而不是响应报文体。此时客户端验证证书文件紧接创建对称密钥,之后重新和服务器建立TLS连接,当服务器返回ACK确认之后,连接正式建立,上方整个过程耗时3RTT,并且之后和服务器的通信数据都是通过对称密钥加密过的,几乎无法破解。
- HTTP是基于TCP的,而HTTPS是基于TLS的
- HTTP的往返时间为1RTT,而HTTPS的往返时间为3RTT
- HTTP只需创建一次TCP连接,而HTTPS需要创建两次TCP连接
- HTTP的默认端口为80,HTTPS的默认端口为443
- HTTP的安全性很差,而HTTPS的安全性很强
HTTPS虽然在安全方面有很大优势,但是缺点也很明显:
- HTTPS握手阶段耗费时间,几乎是HTTP的数倍,会延长页面的首次绘制时间和增加耗电
- HTTPS的效率没有HTTP高,如果部分数据内容实际上并不需要加密,会平白浪费计算机资源
- HTTPS的证书需要购买,功能越强大的证书价格越高
- HTTPS的加密并不能阻止某些网络攻击,如黑客攻击、拒绝服务攻击等
7、请你说说TCP如何实现可靠传输
序列和、检验和、确认应答信号、重发机制、连接管理、窗口控制、流量控制、拥塞控制
可靠传输就是通过TCP连接传送的数据是没有差错的、不会丢失的、不重复并且按序到达的
- 应用层的数据会被分割成TCP认为最适合发送的数据块
- 序列号:TCP给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层,TCP的接收端会丢弃重复的数据
- 检验和:TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。
- 确认应答:如果收到的数据报报文段的检验和没有差错,就确认收到,如果有差错,TCP就丢弃整个报文段和不确认收到此报文段。
- 流量控制:TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,会提示发送方降低发送的速率,防止包丢失。TCP使用的流量控制协议是可变大小的滑动窗口协议。
- 拥塞控制:当网络拥塞时,减少数据的发送。
- 停止等待协议:每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组,
- 超时重传:当TCP发出一个段后,它启动一个定时器,等待的目的端确认收到这个报文端。如果不能及时收到一个确认,将重发这个报文段。
8、请你说说TIME_WAIT
4次挥手结束,主动方进入TIME_WAIT
- TCP连接第4次挥手结束时,主动发起连接释放请求的一方进入TIME_WAIT状态,此时主动发起连接释放请求的一方会等待2MSL(最大报文生存期)才会回到初始状态CLOSED。
- 处理并丢弃迟来的信息
9、请你说说拥塞控制机制
- 拥塞:一个/多个交换点的数据报超载,TCP重传机制导致过载
- 防止拥塞窗口cwnd增长过大引起网络拥塞,设置慢开始门限ssthresh状态变量
- cwnd<ssthresh慢开始算法
- cwnd>ssthresh拥塞避免算法
- cwnd=ssthresh慢开始/拥塞避免算法
- 慢开始:由小到大逐渐增加拥塞窗口大小,每接一次报文,cwnd指数增加
- 拥塞避免:cwnd缓慢增大,每经过一个往返时间RTT,就把发送方的拥塞窗口cwnd+1
- 快恢复之前的策略:
- 发送方判断网络出现拥塞,就把ssthresh设为出现拥塞时发送方窗口值的一半,继续执行慢开始,之后进行拥塞避免
- 快恢复:发送方判断网络出现拥塞,把ssthresh设为出现拥塞时发送方窗口的一半,并把cwnd设为ssthresh之后进行拥塞避免
10、请你说说TCP/IP五层模型
- 应用层:定义应用进程间通信和交互的规则
- 运输层:负责两个计算机进程的通信提供传输服务
- 网络层:负责为网络上不同的主机提供通信服务
- 数据链路层:将网络层交下来的数据报组装成帧
- 物理层:最底层的数据传输,以比特流的形式进行
11、请你说说TCP粘包
TCP基于字节流,无法判断发送方报文段边界
- 多个数据包被连续存储于连续的缓存中,在对数据包进行读取时由于无法确定发送方的发送边界,而采用某一估测值大小来进行数据读取,若发送方发送数据包的长度和接收方在缓存中读取的数据包长度不一致,就会发生粘包,发送端可能对极了两次数据,每次100字节一共在发送缓存对极了200字节的数据,而接收方在接收缓存中一次读取120字节的数据,这是接收端读取的数据就包括了下一个报文段的头部。
解决粘包的方法
- 发送方关闭Nagle算法,使用TCP_NODELAY选项关闭Nagle功能
- 发送定长的数据包。每次数据包的长度一样,接收方可以很容易区分数据包的边界
- 数据包末尾加上\r\n标记,模仿FTP协议,但若数据正文中也含有\r\n,则会误判为消息的边界
- 数据包头部加上数据包的长度。数据包头部定长4字节,可以存储数据包的整体长度
- 应用层自定义规则
原因:
- 造成粘包的因素有很多,有可能是发送方造成的,也有可能是接收方造成的。比如接收方在接收缓存中读取数据不及时,在下一个数据包到达之前没有读取上一个,可能也会造成读取超过一个数据包的情况。
12、请你说说滑动窗口
TCP中采用滑动窗口来进行流量控制,滑动窗口的大小意味着接收方还有多大缓冲区可以接收数据。发送方可以通过滑动窗口的大小来确认应该发送多少字节的数据。滑动窗口机制主要通过窗口大小实现流量控制,进而解决发送方发送数据过快、过多导致的接收端缓存数据溢出导致的丢包现象。
流量控制:
让发送方的发送速率不要过快,让接收方来得及接收所有的数据。
13、请你说说ISO七层模型
- 应用层:管理应用进程间的通信规则(HTTPS/HTTP)
- 表示层:对数据进行处理(对从应用层获取到的数据报报文进行格式处理、安全处理和压缩处理)
- 会话层:用来管理进程(对当前主机进程和目标主机进程会话的建立、管理和终止行为)
- 传输层:提供数据的传输服务,定义了传输数据的进程端口号,负责数据报的排序、差错检验和流量控制等(TCP/UDP)
- 网络层,进行逻辑地址的查询,路由分组与转发(路由器)(IP)
- 数据链路层:建立相邻节点的逻辑连接,进行逻辑地址寻址、数据封帧、差错校验(网卡)(ARP)
- 物理层:最底层的数据传输,比特流(网线)
14、请你说说ARP协议,协议是怎么实现的,是怎么找到MAC地址的
IP地址获取MAC地址、ARP查询分组、广播
- ARP协议:完成主机或路由器IP地址到MAC地址的映射
- ARP协议使用过程:
- 检查ARP高速缓存,有对应表项则写入MAC帧,没有则用目的MAC地址未FF-FF-FF-FF-FF-FF的帧封装并广播ARP亲求分组,同一局域网中所有主机都能都能收到该请求,目的主机收到请求后就会向源主机单播一个ARP响应分组,源主机收到后将此映射写入ARP缓存(10-20min更新一次)
15、请你说说CLOSE_WAIT
TCP连接中对方释放请求,自身未发送FIN时
- 在TCP四次挥手阶段,当对方提出连接释放请求时,自身给予响应ACK确认应答,但是TCP连接是全双工的,也需自身发送连接释放请求,即FIN。若自身没有立即发送FIN,进入CLOSE_WAIT状态。
- 产生CLOSE_WAIT的原因一般是对方关闭了连接,但是自身还在读取数据或传输数据,没有关闭连接
16、请你说说对称加密和非对称加密
- **对称加密:**加密和解密使用同一个密钥,只有一个密钥,作为私钥
- **非对称加密:**加密和解密使用不同的密钥,一把作为公开的公钥,一把作为私钥。公钥加密的信息只有私钥才能解密;私钥加密的信息只有公钥才能解密。更安全
17、请你说说HTTPS
HTTPS在HTTP的基础上加上TLS\SSL
- 内容加密:混合加密方式,对称加密和非对称加密
- 身份验证:通过证书认证客户端访问的是正确的服务器
- 数据完整性:防止传输的数据被中间人篡改
SSL/TLS用在传输层为数据通讯提供安全支持
- SSL:Secure Sockets Layers安全套接层
- TLS:Transport Layers Security安全传输层协议
18、请你说说HTTP1.X和HTTP2.0的区别是什么?
1、简述HTTP1.0
- 规定请求头/请求尾、响应头/响应尾 get/post
- 每一个请求都是一个单独的连接,做不到连接复用
2、http1.1的改进
- 默认开启长连接,在一个tcp连接上可以传送多个http请求和响应,tcp长连接改善http1.0短连接造成的性能开销
- 支持管道(pipeline)网络传输:只要第一个请求发出去了,不必等其回来,就可发第2个请求出去,减少整体响应时间
- 服务端无法主动push
3、http2.0的改进
- 头部压缩:HTTP1.X的头部带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的头部大小,通讯双方各自缓存一部头部表,既避免重复头部的传输,又减小了需要传输的大小
- 二进制数据帧:帧对数据进行顺序标识,序号id,服务器进行并行传输数据。HTTP1.x的解析是基于文本,但是基于文本协议的格式解析存在天然缺陷。文本的表现形式具有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只人0和1的组合。基于这种考虑HTTP2.0协议决定采用二进制格式,实现方便且健壮。
- 多路复用:连接共享,每一个请求都是用作连接共享机制的。一个请求对应一个id,这样一个连接上可以有多个请求,每个连接的请求可以随机的混杂在一个,接收方可以根据请求的id将请求再归属到各自不同的服务端请求里面。
- 服务器推送:如果请求了index、html文件,服务器端会主动将它的依赖文件一起返回。
19、请你说说HTTPS加解密过程是怎么样的?
20、请你说说TCP超时重传机制,时间是多少?
- TCP每发送一条报文,就会启动定时器,如果在定时器超时前没能确认收到信息,就会启动超时重传机制。RTO(重传超时时间)是影响超时重传的重要因素,RTO过大,不易启动重传机制,RTO过小,重传频率过快;
- RTO=RTTS-4RTTd
- RTTs:加权平均往返时间
- RTTd:偏差的加权平均值
21、UDP怎么样可以实现可靠的传输?
将运输层TCP的可靠传输机制在应用层实现:确认机制、重传功能、流量控制、拥塞控制等功能实现在应用层
- 提供超时重传机制,能避免数据报丢失的问题
- 提供确认序列号,保证数据拼接时候的正确排序。
- 请求端:首先在UDP数据报定义一个首部,首部包含确认序列号的时间戳,时间戳是用来计算RTT(数据报传输的往返时间),计算出合适的RTO(重传超时时间),然后以等-停的方式发送数据报,收到对端的确认之后才发送下一个的数据报。当时间超时,本端重传数据报,同时RTO扩大为原来的两倍,重新开始计时。
- 响应端:接受到一个数据报之后取下该数据报首部的时间戳和确认序列号,并添加本端的确认数据报首部之后发送给对端,根据此序列号对已收到的数据报进行排序并丢弃重复的数据报。
22、快重传
- 在超时重传定时器溢出之前,接收到3个重复冗余ack,发送端便知晓哪个报文段在传输过程中丢失了,重发该报文,不需等待超时重传计数器溢出再发送该报文
23、半连接队列
tcp握手中,当服务器处于syn-rcvd状态,服务器会把此种状态下请求放在一个队列里。
24、syn攻击
利用tcp协议缺陷,通过发送大量半连接请求,占用半连接队列,耗费cpu和内存资源
优化:
- 缩短syn timeout时间
- 记录ip,若连续收到某个ip的重复syn报文,从这个ip地址来的包会被一概丢弃
25、简述cookie
- http协议是无状态的
- 为了能处理更加复杂的逻辑,http 1.1引入cookie保存状态信息
- cookie是服务端产生,发送给客户端保存
- 当客户端再次访问时,服务端可根据cookie辨识客户端是哪个,做个性化推送,免账号密码登录
26、简述session
- 标记特定客户端信息,存在服务器的一个文件里
- 客户端带cookie对服务器进行访问,可通过cookie中的session id从整个session中查询到服务器记录的关于客户端的信息
27、转发和重定向
- 转发是服务器行为,服务器直接向目标地址访问url,将相应内容读取之后发给浏览器,用户浏览器地址url不变
- 重定向利用服务器返回的状态码来实现,301/302,浏览器收到新消息后自动跳转到新的地址,重新请求资源,用户地址栏url会发生改变,不能共享资源
28、dos攻击
- Denial of service拒绝服务攻击
- 发送大量无用请求数据包给服务器,耗尽服务器资源,无法通过正常访问服务器资源,导致服务器奔溃