HTTP的协议有什么特点? HTTP协议基于文本传输的,支持不同的****数据格式,例如HTML、JSON、XML等数据格式,并且http是无状态的,每个http请求之间相互独立,采用了请求-应答模式,有很好的扩展性,可以通过扩展头部、方法等支持行方式 HTTP报文格式?怎么分割 http的报文格式分为请求头、请求行、请求体,请求头包含了请求方式、url、http版本,请求行包含了key-value对的信息,有connection,content-lenth等字段,请求体包含了实际的请求数据;请求头和请求行通过/r/n进行分割,请求行和请求体通过一行空白行进行分割 HTTP有什么方法? GET、PUT、DELETE、post、head、options、trace、connect 哪些http方法是安全的?哪些是幂等的 get、head是安全的 post、put、delete是不安全的 get、head、put、delete是幂等的 post是不幂等的 GET和POST请求的区别?追问:GET请求一定是安全且幂等的吗? get请求是从服务器获取资源,post请求向服务器提交数据, get请求是读操作,是安全且幂等的;post请求因为会修改服务器的资源,且多次post请求会创建多个资源,所以是不安全且不幂等的 get请求一般是将请求参数放在url的查询字符串中,浏览器对url的长度有限制,所以get请求的请求参数有长度限制。post请求的数据放在请求体,post请求的请求参数没有长度限制 HTTP有哪些状态码? 100类:属于提示信息,为协议处理中的中间状态 200类:表示服务器成功处理客户端的请求 200:表示成功处理,返回期望的结果 204:与200状态码相似,但是响应头没有body数据 206:http分块下载或断点续传的几次, 300类:表示请求的资源发生了变动,需要客户端用新的URL重新发送请求,就是重定向 301:永久性的重定向,后续请求可以直接重定向访问 302:临时访问, 304: 400类:表示客户端发送的报文有误,服务器无法处理 403:请求的权限不够 404:请求的资源不存在 500类:表示服务器处理 时内部发生了错误,属于服务器端的错误码 什么情况下会出现502错误码? 502(Bad GateWay)表示码表示服务器在充当网关或代理时,在尝试满足请求时从它访问的入站服务器接收到无效响应 如果客户端访问服务是通过nginx来反向代理到应用服务器,那么如果应用服务器出现故障,导致nginx无法从应用服务获得响应,这时候nginx就会返回502错误码给客户端 有个服务出现504错误码,这个服务出现了什么问题 504是网关超时错误,通过nginx将请求代理到后端应用,后端程序没有在规定时间内返回数据,需要开发检查接口超时问题,比如是否出现死循环、sql慢查询等 重定向是哪一类状态码?临时重定向和永久重定向有什么区别? 重定向是300类状态码,301表示永久重定向,302表示临时重定向 永久重定向,客户端会记忆重定向后的url,下次访问的时候不需要访问旧url,直接跳转新url访问 临时重定向,客户端会收到302状态码,不会记忆重定向后的url,下次访问依旧访问旧url,再跳转到新的url HTTP1.1和2.0的区别 2.0引入stream概念,可以在同一个tcp连接中,实现并发传输,而1.1不能并发传输,必须在一个请求结束之后才能进行下一个请求应答,浏览器是通过建立多个tcp连接,实现http1.1的并发,比较消耗内存 报文改进,1.1发生的是文本数据,2.0发生二进制数据,通过HPACK算法压缩HTTP头部,提高了传输效率 http2.0支持服务器主动推送数据 HTTP2.0和HTTP3.0的区别? HTTP2.0和HTTP3.0的最大区别是传输层使用的协议不同了,HTTP2.0使用的是TCP协议连接,HTTP3.0使用UDP协议; HTTP2.0会出现TCP队头阻塞问题,(http2.0的tcp阻塞问题,是因为http2.0的并发传输是在一条TCP连接上实现的,在传输过程中,如果某个stream发生了丢包,服务端不仅不能处理这个stream,也不会处理其他的stream,必须等丢失的包重传,才能继续处理其他stream,这个就发生了tcp队头阻塞),但是HTTP3.0通过一个在UDP协议上实现了一个可靠的QUIC协议,当stream发生丢包时,只会阻塞这个stream,其他stream不会受影响 http3.0建立连接比http2.0高效,http3.0:3次握手就能建立连接+TLS握手成功;http2.0需要3次TCP握手+TLS四次握手 http3.0在网络切换的环境下无需重新建立连接,通过在应用层的唯一id来确定连接 简述JWT的原理和校验机制 jwt的数据个数是header.payload.signature,头部、负载、签名三部分组成, header包含:令牌的类型以及令牌签名的算法 payload:向服务器传递的数据,比如包含认证信息 签名:对前面两部分的签名,防止数据篡改(使用在Header中公开的特点签名算法,通过特定的密钥(由服务器进行保密),对前面两部分进行加密计算 验证JWT令牌的流程: 服务端接收到客户端发来的JWT,取出header+payload,然后服务端根据自己的加密密钥进行加密计算 把加密的结果和客户端发来JWT的signature进行对比,如果完全相同,则表示前面两部分没有动,如果不相同表示被篡改了 当令牌没有被篡改后,服务端可以进行其它验证:令牌过期,用户是否有权限访问等 jwt令牌是由3个部分组成,分别是头部、负载、签名,头部包括类型和签名算法,负载包含了用户信息等数据,签名是对头部和负载两部分的签名,使用头部的签名算法,通过服务器的密钥对前面两部分内容进行加密计算 校验jwt的过程是服务端接收到客户端发过来的jwt令牌后,服务端会取出头部和负载数据,然后用自己的密钥对头部和负载进行加密计算,将得到的加密结果和客户端发送过来的jwt的签名机械能对比,如果相同,表示前面两部分没有内中间人篡改,这个时候服务器可以进行其他检查,比如检查jwt是否过期,如果没有问题,正常执行业务逻辑 什么是跨域?什么情况下会发生跨域? 当网页尝试访问不同源的资源的使用,就会发生跨域,只要域名、协议、端口这三个信息任意一个不同,都认为是不同源的URL 可以用跨域资源共享技术,在服务器需要的响应头上添加Access-Control-Allow-Origin的字段, 什么是Restful?RestFul请求的url有什么特点? restful是一种api接口设计规范,用url定位资源,用http方法表示接口的动作,用http状态码表示接口处理的情况 HTTP和HTTPS有什么区别? 安全性:HTTP使用明文传输,HTTPS通过SSL/TLS协议对数据进行加密处理,提供更高的安全性和数据保护 建立连接:HTTP建立只需要TCP三次握手;HTTPS在TCP三次握手后还需要进行SSL/TLS的握手过程 端口:HTTP的端口是80;HTTPS的端口是443 证书:HTTPS需要使用数字证书来验证服务器的身份,并确保数据传输的安全性。证书由第三方机构颁发,用于证明服务器的身份和所有权。而HTTP没有使用证书进行身份验证和加密。 ...
TCP三次握手 TCP头部有哪些字段? tcp报文段 : tcp头部+tcp数据部分 tcp头部: 源端口:16位 目的端口:16位 序号:32位 确认号:32位 数据偏移:4位 保留:6位 窗口:16位 校验和:16位 紧急指针:16位 选项和填充:最多为40字节 控制位: URG:紧急指针标志,为1时标识紧急指针有效,该报文应该优先传送,为0则忽略紧急指针 ACK:确认序号标志,为1时表示确认号有效。携带ACK标识的TCP报文段被称为确认报文段 RST:重置连接 SYN:表示请求建立一个连接 FIN:用于释放连接 PSH:为1表示带有push标志的数据,优先将这个报文提交给应用程序,而不是缓冲区排队 tcp头部的最长是60字节 数据部分:。。。 回答:tcp头部主要是源端口、目的端口、序列号、确认号、标记位:SYN、RST、ACK、FIN、头部长度、窗口大小,可扩展的选项等 其中序列号和确认号的大小为32位,序列号保证数据的有序性,接收方按照发送方顺序发来的数据来组装有序的数据;确认号保证数据的可靠性,当发送方已发送的数据,超过一段时间没收到确认报文,就会重传报文。 源端口和目的端口的大小是16位,源端口是发送方的端口号,目的端口是接收方使用的端口号,端口的作用是标识TCP连接是哪个进程 TCP之报文首部格式 - Jummyer - 博客园 TCP三次握手连接过程 客户端和服务端一开始都处于close状态,服务端会监听一个端口,处于listen状态 第一次握手:客户端产生随机初始化序号,放到tcp报文头部的序号字段,同时把SYN标志设置位1,标识SYN报文。接着把SYN报文发送给服务端,之后客户端处于SYN_SEND状态 服务端收到SYN报文后,服务端也生成随机初始化序号,放到TCP报文头部的序号字段中,对客户端的初始化序号+1作为确认号,放到TCP报文头部的确认应答字段中,并将SYN和ACK标志设置为1,表示SYN-ACK报文,把报文发送给客户端,之后服务端处于SYN_RECD状态 客户端收到服务端SYN-ACK报文后,客户端发送一个ACK确认报文,该报文的确认号为服务端的初始化序号+1,并将ACK标志设置为1。客户端处于ESTABLISHED状态 服务端收到ACK确认报文,服务端也处于ESTABLISHED状态 以上就是TCP三次握手的过程 4.1 TCP 三次握手与四次挥手面试题 为什么需要三次握手?两次握手不行吗? 避免历史连接的建立,避免资源浪费 三次握手可以确认客户端和服务端是否同时具备发送和接收的能力 如果第二次握手丢包,会发送什么? 超时重传机制,第二次SYN-ACK报文中有 第二次报文中的ACK,是第一次握手的确认报文,那么当第二次报文丢包时,会导致客户端一直没有接收到ACK而触发超时重传机制,重传SYN包,即第一次握手 第二次报文中的SYN,是服务端建立TCP连接的报文,当第二次报文丢失后,客户端没有发送ACK报文,服务端没有收到第三次握手,于是服务端会触发超时重传机制,重传SYN-ACK报文 如果第三次握手丢包,会发生什么? 我的理解是第三次握手如果发生丢包,服务端会迟迟接收不到第三次握手的ACK包,触发超时重传机制,服务端会重新发生第二次握手的SYN-ACK包,直到最大重传次数的限制,或者收到第三次握手 TCP的半连接队列和全连接队列? 在tcp三次握手的时候,linux内核会维护两个队列,分别是: syn队列:半连接队列 accept队列:全连接队列 服务端收到客户端发起的SYN请求后,内核会将为握手完成的连接存储到半连接队列,等待完成三次握手后转移到全连接队列 全连接队列:服务端收到客户端的第三次握手,内核会将连接从半连接队列移除,然后创建新的完全连接,并将其添加到全连接队列,等待进程调用accept函数将连接取出 4.4 TCP 半连接队列和全连接队列 TCP四次挥手 TCP四次挥手的过程 tcp的四次挥手(断开连接)是可以客户端或者服务端断开 客户端关闭连接,此时会发生一个fin报文,之后客户端进入fin_wait_1状态, 服务端收到fin报文后,将向客户端发送ack报文,接着服务端进入close_wait状态 客户端接收到ack应答报文后,之后进入fin_wait_2状态 等待服务端处理完数据后,向客户端发送fin报文,服务端进入last_ack状态 客户端收到服务端的fin报文后,回一个ack应答报文,客户端进入time_wait状态 服务端接收到ack报文后,进入close状态,至此服务端完成连接的关闭 ...
ping的原理简述: ping命令是用来探测目标ip地址是否可以访问 Ping是通过ICMP协议实现的,ping的时候,会向接收方发送回送请求的ICMP报文,对方接收到后,会回复类型为回送应答的ICMP报文 交换机和路由器有什么区别? 交换机工作在MAC层,称为二层网络设备,主要负责数据帧的转发和交换,交换机会根据MAC地址来转发数据包,是实现局域网内设备的通信 路由器工作在IP层,称为三层网络设备,主要负责IP数据包的转发和路由选择,路由器会根据IP地址来转发数据包,实现不同网络间的通信 IP地址和MAC地址有什么区别? IP地址用于网络中唯一标识和定位设备,它是网络层使用的地址,用于实现不同网络之间的通信 MAC地址用于局域网中唯一标识和定位设备,它在数据链路层使用的地址,实现局域网内设备之间的通信 NAT协议 网络地址转换协议NAT功能详解及NAT基础知识介绍 5.1 IP 基础知识全家桶 192.168.1.100/24中斜杠代表什么意思? 斜杠(/)后面的数字表示子网掩码的位数 比如,192.168.1.100/24中的斜杠后面数字表示子网掩码的位数,子网掩码用于划分IP地址中的网络部分和主机部分。将子网掩码和IP地址进行与运算,就可以得到网络号 具体来说:192.168.1.100/24表示前24位是网络部分,后8位是主机部分
OSI的7层网络模型?各层的协议有什么? 应用层:确定进程间通信的性质以及满足用户需要以及提高网络和用户应用 表示层:主要解决用户信息的语法表达 会话层:复制建立、管理和终止表示层实体之间的通信会话 传输层:实现网络不同主机上的用户进程间的数据通信,可靠和不可靠的传输 网络层:本层通过IP寻址来建立两个节点之间的连接 数据链路层:将上层数据封装成帧,用MAC地址访问媒介 物理层:设备之间比特流的传输,物理接口 回答: OSI参考模型有7层,应用层、表示层、会话层、传输层、网络层、数据链路层、物理层 应用层有HTTP、HTTPS,传输层有TCP和UDP协议,网络层有IP、ICMP、ARP协议 网络分层的好处:对各层之间进行解耦,层与层之间不产生关联,比如应用层HTTP协议从HTTP1.1升级到HTTP2.0的时候,不会对传输层和网络层有影响,或者网络层的IPv4协议升级到IPv6协议的时候,不会影响到应用,传输层 TCP/IP协议是将OSI模型的应用层、表示层、会话层统一为应用层,数据链路层和物理层统一为网络接口层 TCP/IP的四层网络模型? 应用层 传输层 网络层 数据链路层(网络接口层) 五层因特网协议栈? 应用层、运输层、网络层、链路层、物理层 OSI七层网络协议 TCP/IP四层概念模型 对于网络协议 应用层 — 表示层 — 会话层 应用层(4) HTTP、TFTP、FTP、NFS、WAIS、SMTP – Telnet、Rlogin、SNMP、Gopher – SMTP、DNS 键入网址场景问题 键入网址后,期间发送了什么? http/https -> dns -> tcp -> ip -> arp 浏览器会解析网址,解析出域名,资源路径,端口等信息,构造HTTP请求报文 将域名解析为IP地址,先查看系统缓存是否有域名信息,有的话返回IP地址;没有就查看本地host文件没有域名信息,有就返回IP地址;如果再没有就查看本地DNS服务器,如果本地DNS服务器中有域名信息,就返回IP地址,否则本地DNS服务器分别去根域名服务器->顶级域名服务器->权威域名服务器询问,最后拿到IP地址 HTTP协议是基于TCP协议传输的,所以要先进行TCP三次握手, 然后到网络层,加上IP头,同时填上目标IP地址和源IP地址 然后到数据链路层,通过ARP协议,获取路由器的MAC地址,然后加上MAC头,填上目标MAC地址和源MAC地址 然后到物理层,直接把数据包转发给路由器,路由器再通过下一跳,找到最终的目的服务器 当双方完成三次握手后,如果是HTTP协议,客户端就会把HTTP请求发送给目标服务器;如果是HTTPS协议,还需要进行TLS四次握手,客户端才会把HTTP报文发送给目标服务器 目标服务器收到HTTP报文后,返回HTTP响应消息,浏览器对响应消息进行解析渲染,呈现给用户 DNS是如何解析的?属于哪一层的协议? DNS属于应用层的协议,客户端在进行DNS解析时,首先会查看浏览器和操作系统是否缓存域名对应的IP地址,如果没有就向本地DNS服务器发出查询请求,接着本地DNS向根DNS发送查询请求,根DNS服务器返回顶级域名服务器地址,本地DNS服务器向顶级域名服务器发送查询请求,顶级域名服务器返回权威域名服务器的IP地址,本地DNS服务器再向权威域名服务器发出查询请求,权威域名服务器收到请求后,就返回域名对应的IP地址了,本地DNS服务器返回查询结果给客户端,然后将本次查询得到的结果保存到缓存里,以备下次使用 DNS域名解析使用的是什么协议? DNS中,域名的解析是通过UDP协议进行的 UPD是一种无连接的传输层协议,提供了一种简单的传输机制,适用于实时性比较高的应用场景。DNS使用UDP协议进行域名解析是因为域名解析是短小且频繁的请求,UDP的无连接特性可以减少建立连接和断开连接的开销,提高传输效率 UPD协议对于TCP协议的缺点是没办法保证数据传输的可靠性,针对这个缺点可以在应用层实现超时重传机制,如果域名解决请求在一定的时间内没有收到响应,那么就重发域名解析 输入域名怎么找到端口号? http的默认端口是80;https的默认端口号是443; 如果用户指定了端口,可以在url中获取,比如域名:8080,这时候使用的端口是8080 网络传输场景 tcp连接一个不存在的IP地址会发生什么? 如果IP地址是局域网内,客户端的内核在发生arp请求的时候,广播这个目标IP是谁的,但是由于网络中不存在这个IP地址,所以没有设备应答,会卡在arp协议,客户端的SYN报文无法发送出去 如果这个IP地址不是局域网的,客户端会将SYN报文交给路由器,由路由器继续转发,由于目标IP地址是不存在的,该SYN报文会在网络中消亡;客户端由于一直接收不到SYN报文的确认报文,会触发超时重传机制,直到最大的重试次数,客户端的连接会被释放 tcp连接一个IP地址存在但是端口不存在的服务端会发生什么? 端口不存在的话,代表服务端没有监听这个端口,服务端在接收到客户端的SYN包后,返回RST报文,客户端接收到RST报文后,会断开连接 UDP发送一个IP地址存在但是端口不存在报文会发生什么? 服务端会回ICMP报文,报告端口不可用
Bind to a port 使用net 开启一个TCP服务,监听端口6379 func main() { // You can use print statements as follows for debugging, they'll be visible when running tests. fmt.Println("Logs from your program will appear here!") // Uncomment this block to pass the first stage l, err := net.Listen("tcp", "0.0.0.0:6379") if err != nil { fmt.Println("Failed to bind to port 6379") os.Exit(1) } _, err = l.Accept() if err != nil { fmt.Println("Error accepting connection: ", err.Error()) os.Exit(1) } } Redis 客户端和服务器使用 TCP 相互通信。 Respond to PING