每日八股:计算机网络
计算机网络
网络OSI模型和TCP/IP模型分别介绍一下
OSI模型分为七层,分别是:
应用层:负责给应用程序提供统一的接口;
表示层:负责把数据转换成兼容另一个系统能识别的格式;
会话层:负责建立、管理和终止表示层实体之间的通信会话;
传输层:负责端到端的数据传输;
网络层:负责数据的路由、转发、分片;
数据链路层:负责数据的封帧和差错检测,以及MAC寻址;
物理层:负责在物理网络中传输数据帧。
TCP/IP模型分为四层,分别是:
应用层:支持HTTP、SMTP等最终用户进程;
传输层:处理主机到主机之间的通信(TCP、UDP);
网络层:寻址和路由数据包(IP协议);
链路层:通过网络的物理电线、电缆或无线信道移动比特。
HTTP报文有哪些部分?
分为请求报文和响应报文来说明。
请求报文:
1.请求行:包含请求方法(post、get等)、请求目标(URL或URI)和HTTP协议版本。
2.请求头部:包含关于请求的附加信息,如Host、User-Agent、Content-Type等。
3.空行:请求头部和请求体之间用空行分隔。
4.请求体:可选,包含请求的数据,通常用于post请求等需要传输数据的情况。
响应报文:
1.状态行:包含HTTP协议版本、状态码和状态信息。
2.响应头部:包含关于响应的附加信息,如Content-Type、Content-Length等。
3.空行:响应头部和响应体之间用空行分隔。
4.响应体:包含响应的数据,通常是服务器返回的HTML、JSON等内容。
HTTP常用的状态码
HTTP状态码分为5大类:
1.1xx状态码属于提示信息,是协议处理中的一种中间状态。
2.2xx状态码表示服务器成功处理了客户端的请求。
3.3xx状态码表示重定向,资源位置发生了变动,需要客户端重新发送请求。
4.4xx表示客户端错误,请求报文有误,服务器无法处理。
5.5xx表示服务器错误,服务器在处理请求时内部发生了错误。
状态码301和302的区别
3xx类的状态码表示客户端请求的资源发生了变动,需要客户端用新的URL重新发送请求获取资源,也就是重定向。
301表示永久重定向,说明请求的资源已经不存在了,需改用新的URL来访问。
302表示临时重定向,说明请求的资源还在,但暂时需要用另一个URL来访问。
301和302都会在响应头里使用字段Location,指明后续要跳转的URL,浏览器会自动重定向新的URL。
状态码502和504的区别
502 Bad Gateway:作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
504 Gateway Time-out:作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器收到响应。
HTTP层请求的类型有哪些?
1.GET:用于请求获取指定资源,通常用于获取数据。
2.POST:用于向服务器提交数据,通常用于提交表单数据或进行资源的创建。
3.PUT:用于向服务器更新指定资源,通常用于更新已存在的资源。
4.DELETE:用于请求服务器删除指定资源。
5.HEAD:类似于GET请求,但只返回资源的头部信息,用于获取资源的元数据而不获取实际内容。
HTTP的长连接是什么?
由于HTTP是基于TCP传输协议实现的,客户端和服务端要进行HTTP通信前,需要先建立TCP连接,然后客户端发送HTTP请求,服务端收到后返回响应,至此请求-应答模式就完成了,随后就会释放TCP连接,如果每次请求都要经历这样的过程,那么此方式就是HTTP短连接,这种方式不仅麻烦而且开销很大。HTTP的Keep-Alive实现了这样一种功能:可以使用同一个TCP连接来发送和接收多个HTTP请求/应答,避免了连接建立和释放的开销,这个方法称为HTTP长连接。
HTTP长连接的特点是:只要有任意一端没有明确提出断开连接,则保持TCP连接状态。
HTTP默认的端口
http是80,https默认是443。
HTTP1.1怎么对请求做拆包,具体来说怎么拆的?
在HTTP/1.1中,请求的拆包是通过Content-Length字段进行的,该字段指示了请求正文的长度,服务器可以根据该长度来正确的接受和解析请求。
具体来说,当客户端发送一个HTTP请求后,会在请求头中添加一个Content-Length字段,该字段的值表示请求正文的字节数。
服务器在接收到请求后,会根据Content-Length中的值来确定请求的长度,并从请求中读取相应长度的字节数,直到读取完整个请求内容。
这种基于Content-Length字段的拆包机制可以确保服务器正确接收到完整的请求,避免了请求的丢失和截断问题。
HTTP为什么不安全?
HTTP由于是明文传输,所以安全上存在以下三个风险:
1.窃听风险:比如通信链路上可以获取通信内容
2.篡改风险:比如强制植入垃圾广告
3.冒充风险:比如冒充淘宝网站
HTTPS在HTTP和TCP层之间加入SSL/TLS协议,可以很好的解决以上问题:
1.信息加密:交互信息无法被获取
2.校验机制:无法篡改通信内容,篡改了就不能正常显示
3.身份证书
HTTP和HTTPS的区别
1.HTTP是超文本传输协议,信息是明文传输,存在安全问题。而HTTPS则解决了HTTP不安全的缺陷,在TCP和HTTP网络层之间加了SSL/TLS安全协议,使得报文能够加密传输。
2.HTTP连接建立相对简单,只需在TCP三次握手之后便可进行报文传输。而HTTPS在TCP三次握手之后,还需进行SSL/TLS的握手过程,才能进行报文加密传输。
3.两者的默认端口不一样,HTTP的默认端口号是80,HTTPS默认的端口号是443。
4.HTTPS协议需要向CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。
HTTPS是如何防范中间人的攻击?
主要通过加密和身份校验机制来防范中间人的攻击。
加密:https握手过程中会通过非对称加密的方式协商出对称加密密钥。
身份校验机制:服务器会向证书颁发机构申请数字证书,证书中包含服务器的公钥和其他相关信息。当服务器与客户端建立连接时,服务器会将证书发送给客户端,客户端会校验证书的合法性,如果校验通过,客户端会使用证书中的公钥来加密通信数据,并将加密后的数据发送给服务器,然后服务器用私钥解密。
中间人攻击的关键在于攻击者冒充服务器与客户端建立连接,并同时与服务器进行连接。但由于攻击者无法获取服务器的私钥,因此无法解密客户端发来的加密数据。同时,客户端会校验服务器发来的证书,如果证书校验失败或存在问题,那么客户端会发出警告或中止连接。
HTTP1.1和2.0的区别是什么?
HTTP/2相比于HTTP/1.1性能上的改进:
1.头部压缩:HTTP/2会压缩头,如果你同时发送多个请求,它们的头是一样的或类似的,协议会帮你消除重复的部分。这就是所谓的HPACK算法,由服务器和客户端同时维护一张头信息表,所有字段都存储在这张表中,生成一个索引号,以后就不用发送字段信息,只发送一个索引号,这样就能提高速度了。
2.二进制格式:HTTP/2不再像HTTP/1.1里的纯文本形式的报文,而是全面采用了二进制格式,头信息和数据体都是二进制格式,统称为帧:头信息帧和数据帧,计算机在收到报文后,不再需要将明文的报文转化成二进制,而是直接解析二进制的报文,这样增加了数据传输的效率。
3.并发传输:引入了stream的概念,多个stream复用在一条TCP连接。解决了HTTP/1.1队头阻塞的问题。
4.服务器主动推送资源:HTTP/2还在一定程度上改善了传统的请求-应答模式,服务器不再是被动的响应,可以主动的向客户端发送消息。
HTTP进行TCP连接之后,在什么情况下会中断
1.当服务器或客户端执行close系统调用的时候,会发送FIN报文,执行四次挥手的过程。
2.当发送方发送数据之后,接收方超过一段时间没有响应ACK报文,发送方重传数据达到最大次数的时候,就会断开TCP连接。
3.当HTTP长时间没有进行请求和响应的时候,超过一定时间,就会释放连接。
HTTP、SOCKET和TCP的区别
HTTP是应用层协议,用于定义服务器和客户端之间交换的数据规则和格式;SOCKET是通信的一端,提供了网络通信的接口;TCP是传输层协议,负责在网络中建立可靠的数据传输连接。它们在网络通信中扮演不同的角色和层次。
1.HTTP是一种用于传输超文本数据的协议,用于服务器和客户端之间传输和显示web页面。
2.SOCKET是计算机网络中的一种抽象,用于描述通信链路的一端,提供了网络通信的接口,可实现不同计算机之间的数据交换。
3.TCP是一种面向连接的、可靠的传输层协议,负责在通信的两端之间建立可靠的数据传输连接。
DNS了解么
DNS全称是domain name system(域名系统),它是互联网中用于将域名转换为对应IP地址的分布式数据库系统。DNS中的域名都是用句点来分隔的,每个句点代表了不同层次之间的界限。在域名中,越靠右的位置表示其层级越高。
DNS域名解析的工作流程
1.客户端首先发送一个DNS请求,查询ip地址,并发给本地DNS服务器(也是就客户端的TCP/IP设置中填写的DNS服务器地址)。
2.本地域名服务器收到客户端的请求后,如果缓存的表格里面能找到,则直接返回它的ip地址,如果没有,本地DNS则会去询问根域名服务器。
3.根域名服务器不会直接用于域名解析,在收到本地DNS的请求后,发现后置是.com,于是将.com顶级域名服务器的地址发给本地DNS。
4.本地DNS收到顶级域名服务器地址后,向它发起询问。
5.顶级域名服务器将负责具体ip地址区域的权威DNS服务器地址发送给本地DNS。
6.本地DNS向权威DNS服务器发送询问。
7.权威DNS服务器查询后将对应的ip地址返回给本地DNS。
8.本地DNS再将IP地址返回客户端,客户端和目标建立连接。
DNS的端口是多少?
DNS的默认端口号是53。
DNS的底层使用TCP还是UDP?
DNS基于UDP协议实现,DNS使用UDP协议进行域名解析和数据传输,因为基于UDP协议实现DNS能够提供低延迟、简单快速、轻量级的特性,更适合DNS这种需要快速响应的域名解析服务。
低延迟:UDP是一种无连接的协议,不需要在数据传输前建立连接,因此可以减少传输时延,更适合DNS这种需要快速响应的应用场景。
简单快速:UDP相比于TCP更简单,没有TCP的连接管理和流量控制机制,传输效率更高。
轻量级:UDP头部较小,占用较少的网络资源,对于小型请求和响应来说更加轻量级,适合DNS这种频繁且短小的数据交换。
HTTP到底是不是无状态的?
HTTP是无状态的,这意味着每个请求都是独立的,服务器不会在多个请求之间保存关于客户端的状态信息。在每个请求中,服务器不会记住之前的请求或会话状态,因此每个请求都是相互独立的。但可以通过一些机制来实现状态保持,其中最常见的方式就是使用cookie和session来跟踪用户状态。
cookie和session有什么区别?
1.存储位置:Cookie的数据存储在客户端(通常是浏览器);Session的数据存储在服务器端。
2.数据容量:单个Cookie的大小限制通常在4kb左右,而且大多数浏览器对每个域名的总Cookie数量也有限制。Session存储在服务器上,理论上不受数据大小的限制,主要受限于服务器的内存大小。
3.安全性:Cookie相对不安全,因为数据存储在客户端,容易受到XSS(跨站脚本攻击)或CSRF(跨站请求伪造)的攻击。Session通常认为比Cookie更安全,因为敏感数据存储在服务器端。
4.生命周期:Cookie可以设置过期时间,到期会自动删除,也可以设置为会话Cookie,即浏览器关闭时自动删除。Session在默认情况下,当用户关闭浏览器时,Session结束。但服务器也可以设置Session的超时时间,超过这个时间未活动,Session也会失效。
5.性能:使用Cookie时,因为数据会随着请求发送到服务器,可能会影响网络传输效率,特别是当Cookie数据较大时。使用Session时,因为数据存储在服务器端,每次请求都需要查询服务器上的Session数据,这可能会增加服务器的负载,特别是在高并发的场景下。
token,session,cookie的区别?
session存储于服务器中,可以理解为一个状态列表,拥有一个唯一识别符号sessionid,通常存放在cookie中,服务器收到cookie后解析出sessionid,再去session列表中查找,才能找到相应session,依赖cookie。
cookie类似一个令牌,装有sessionid,存储在客户端,浏览器通常会自动添加。
token也类似一个令牌,无状态,用户信息都被加密到token中,服务器收到token后解密就可知道是哪个用户,需要开发者手动添加。
如果我把数据存储到 localStorage,和Cookie有什么区别?
1.存储容量:Cookie的存储容量通常较小,每个Cookie的大小限制在几kb左右,而localStorage的存储容量通常较大,一般限制在几MB左右。因此,如果需要存储大量数据,localStorage通常更合适。
2.数据发送:Cookie在每次HTTP请求中都会自动发送到服务器,这使得Cookie适合用于在客户端和服务器之间传递数据。而localStorage的数据不会自动发送到服务器,它仅在浏览器端存储数据,因此,localStorage适合用于在同一域名下的不同页面之间共享数据。
3.生命周期:Cookie可以设置一个过期时间,使得数据在指定时间后自动删除,而localStorage的数据永久存储在浏览器中,除非通过js代码手动删除。
4.安全性:Cookie的安全性较低,因为Cookie在每次HTTP请求时都会自动提交到服务器端,存在被窃取和篡改的风险,而localStorage的数据仅在浏览器端存储,不会自动发送到服务器,相对而言更加安全。
什么数据应该存在到cookie,什么数据存放到 Localstorage
Cookie适合用于客户端和服务器之间传递数据、跨域访问和设置过期时间;而localStorage适合用于在同一域名下的不同页面之间共享数据、存储大量数据和永久存储数据。
JWT 令牌和传统方式有什么区别?
1.无状态性:JWT是无状态的令牌,不需要在服务器端存储会话信息,相反,JWT令牌中包含了所有必要的信息,如用户身份、权限等。这使得JWT在分布式系统中更加适用,可以方便的进行扩展和跨域访问。
2.安全性:JWT使用密钥对令牌进行签名,确保令牌的完整性和真实性。只有持有正确密钥的服务器才能对令牌进行验证和解析。这种方式比传统的基于会话和cookie的验证更加安全,有效防止了CSRF(跨站请求伪造)等攻击。
3.跨域支持:JWT令牌可以在不同域之间传递,适用于跨域访问的场景,通过在请求的头部或参数中携带JWT令牌,可以实现无需Cookie的跨域身份验证。
JWT 令牌都有哪些字段?
JWT由头部(Header)、载荷(Payload)、签名(Signature)构成。其中头部和载荷都是JSON格式,签名部分是对头部、载荷和密钥进行签名后的结果。
JWT 令牌为什么能解决集群部署,什么是集群部署?
在传统的基于会话和Cookie的身份验证方式中,会话信息通常存储在服务器内部或数据库中。但在集群部署中,不同服务器之间没有共享的会话信息,这会导致用户在不同服务器之间进行切换时需要重新登陆,或者需要引入额外的共享机制(如Redis),增加了复杂性和性能开销。
而JWT令牌通过在令牌中包含所有必要的身份验证和会话信息,使得服务器无需存储会话信息,从而解决了集群部署中的身份验证和会话管理问题。当用户进行登录认证后,服务器会生成一个JWT令牌并返回给客户端,客户端在后续的请求中携带该令牌,服务器可以对该令牌进行验证和解析来获取用户身份和权限信息,而无需访问共享的会话存储。
由于JWT令牌是自包含的,服务器可以独立的对令牌进行验证,无需依赖其他的服务器或共享存储,这使得集群中的每个服务器都可以独立的处理请求,提高了系统的可伸缩性和容错性。
jwt的缺点是什么?
JWT一旦派发出去,在失效之前都是有效的,无法撤销。解决这个问题的方法是在业务层增加判断逻辑,比如增加一个黑名单,如果想要某个JWT失效就直接将其加入到黑名单中,然后每次使用JWT进行请求时都先判断该JWT是否存在于黑名单之中。
JWT 令牌如果泄露了,怎么解决,JWT是怎么做的?
1.及时失效令牌:当检测到JWT令牌泄露或存在风险时,可以立即将令牌标记为失效状态。服务器在收到带有失效状态的令牌时,会拒绝对其进行任何操作,从而保护了用户身份和数据安全。
2.刷新令牌:JWT令牌通常具有一定的有效期,过期后需要重新获取新的令牌。当检测到令牌泄露后,可以立即刷新令牌,即重新生成一个新的令牌,并将旧令牌标记为失效状态。这样即使旧令牌被恶意使用,也很快会失效,减少了被攻击者滥用的风险。
3.使用黑名单:服务器可以维护一个令牌的黑名单,将泄露的令牌都添加到黑名单中,当接收到令牌时,先对令牌进行检测,看其是否在黑名单中,如果在则拒绝对其进行操作。这样的方法虽然会对性能有一定的影响,但可以有效的保护泄露的令牌不被滥用。
HTTP长连接与WebSocket有什么区别?
全双工和半双工:TCP协议本身是全双工的,但我们最常用的HTTP/1.1,虽然是基于TCP的协议,但它是半双工的,对于大部分需要服务器主动推送数据到客户端的场景,都不太友好,所以我们需要使用支持全双工的WebSocket协议。
应用场景区别:在HTTP/1.1里,只要客户端不问,服务端就不答,基于这样的特点,对于登陆页面这样的简单场景,可以使用定时轮询或长轮询的方式实现服务器推送的效果。对于客户端和服务端需要频繁交互的场景,比如网页游戏,就可以考虑使用WebSocket协议。
Nginx有哪些负载均衡算法?
1.轮询:按照顺序依次将请求分配给后端服务器,这种方法最简单,但无法解决某个节点变慢或客户端操作有连续性的情况。
2.IP哈希:根据客户端IP地址的哈希值来确定分配请求的后端服务器,适用于需要保持同一客户端的请求始终发送给同一后端服务器的应用场景,如会话保持。
3.URL哈希:按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以提高后端缓存服务器的效率。
4.最短响应时间:按照后端服务器的响应时间来分配请求,响应时间短的优先分配。适用于后端服务器性能不均的场景,能够将请求发送给响应时间快的服务器,实现负载均衡。
5.加权轮询:按照权重分配请求给后端服务器,权重越高的服务器获得更多的请求,适用于后端服务器性能不同的场景,可以根据服务器权重分配请求,提高高性能服务器的利用率。
Nginx位于七层网络结构中的哪一层?
位于应用层,nginx是七层负载均衡。
#八股##面试常问题系列##计算机网络知识点汇总##Java选手#