每日八股:计算机网络

tcp的头部

序列号:在建立连接时由计算机生成的随机数作为其初始值,通过SYN包传给接收端主机,每发送一次数据,就累加一次该数据字节数的大小。用来解决网络包乱序问题。

确认应答号:指下一次期望收到的数据的序列号,发送端收到这个确认应答之后可以认为在这个序号以前的数据都已经被正常接收。用来解决丢包的问题。

控制位:

1.ACK:该位为1时,确认应答的字段变为有效。

2.RST:该位为1时,表示TCP连接中出现异常必须强制断开连接。

3.SYN:该位为1时,表示希望建立连接,并在其序列号的字段进行序列号初始值的设定。

4.FIN:该位为1时,表示今后不会再有数据发送,希望可以断开连接。

TCP三次握手过程说一下?

TCP是面向连接的协议,所以使用TCP之前必须先建立连接,而建立连接是通过三次握手来进行的。

一开始,客户端和服务端都处于close状态,先是服务端主动监听某个端口,处于listen状态。

三次握手的第一个报文:SYN报文

客户端会随机初始化序号(client_isn),将此序号置于TCP首部的序列号字段中,同时把SYN标志位置为1,表示SYN报文。接着把第一个SYN报文发送给服务端,表示向服务端发起连接,该报文不包含任何应用层数据,之后客户端处于SYN-SENT状态。

三次握手的第二个报文:SYN+ACK报文

服务端收到客户端的SYN报文后,首先服务端也随机初始化自己的序号,将此序号填入TCP首部的序列号字段中,其次把TCP首部的确认应答号字段填入client_isn+1,接着把SYN和ACK标志位置为1.最后把报文发给客户端,该报文也不含应用层数据,之后服务端处于SYN-RCVD状态。

三次握手的第三个报文:ACK报文

客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先该应答报文TCP首部ACK标志位置为1,其次确认应答号字段填入server_isn+1,最后把报文发送给服务端,这次报可以携带客户到服务端的数据,之后客户端处于ESTABLISHED状态。服务端收到客户端的应答报文后,也进入ESTABLISHED状态。

第三次握手是可以携带数据的,前两次握手是不可以携带数据的。

tcp为什么需要三次握手建立连接?

1.三次握手可以阻止重复历史连接的初始化。(主要原因)

2.三次握手可以同步双方的初始序列号。

3.三次握手可以避免资源浪费。

TCP 三次握手,客户端第三次发送的确认包丢失了会发生什么?

客户端收到服务端的SYN-ACK报文后,会给服务端回一个ACK报文,也就是第三次握手,此时客户端状态进入到ESTABLISH状态。

因为这个第三次握手的ACK是对第二次握手的SYN的确认报文,所以当第三次握手丢失了,如果服务端那一方迟迟收不到确认报文,就会触发超时重传机制,重传SYN-ACK报文,直到收到第三次握手,或者达到最大重传次数。

注意,ACK报文是不会由重传的,当ACK丢失了,就由对方重传对应的报文。

三次握手和 accept 是什么关系? accept 做了哪些事情?

TCP完成三次握手之后,连接会被保存到内核的全连接队列,调用accept就是把连接取出来给用户程序使用。

客户端发送的第一个 SYN 报文,服务器没有收到怎么办?

当客户端想跟服务端建立连接时,第一个发的就是SYN报文,然后进入到SYN_SENT状态。在这之后,如果客户端迟迟收不到服务端发来的SYN-ACK报文,就会触发超时重传机制,重传SYN报文,而且重传的SYN报文的序列号都是一样的。每次超时的时间都是上一次的2倍。

服务器收到第一个 SYN 报文,回复的 SYN + ACK 报文丢失了怎么办?

因为第二次握手报文里是包含对客户端的第一次握手的ACK确认报文,所以,如果客户端迟迟没有收到第二次握手,那么客户端可能觉得自己的SYN报文丢失了,于是客户端就会触发超时重传机制,重传SYN报文。

然后,因为第二次握手中包含服务端的SYN报文,所以当客户端收到后,需要给服务端发送ACK确认报文(第三次握手),服务端才会认为该SYN报文被客户端收到了。那么,如果第二次握手丢失了,服务端就收不到第三次握手,于是服务端这边会触发超时重传机制,重传SYN-ACK报文。

第一次握手,客户端发送SYN报后,服务端回复ACK报,那这个过程中服务端内部做了哪些工作?

服务端收到客户端发来的SYN报文后,内核会把该连接存储到半连接队列,并向客户端响应SYN-ACK报文,接着客户端会返回ACK,服务端收到第三次握手的ACK后,内核会把连接从半连接队列移除,然后创建新的全连接队列,并将其添加到accept队列,等待进程调用accept函数时把连接取出来。

不管是半连接队列还是全连接队列,都有最大长度限制,超过限制时,内核会直接丢弃,或返回 RST 包。

TCP 四次挥手过程说一下?

客户端主动调用关闭连接的函数,于是会发送FIN报文给服务端,这个FIN报文代表客户端不会再发送数据了,进入FIN_WAIT_1状态。

服务端收到了FIN报文,然后马上回复一个ACK确认报文,此时服务端进入CLOSE_WAIT状态。在收到FIN报文的时候,TCP协议栈会为FIN包插入一个文件结束符EOF到接收缓冲区中,服务端应用程序可以通过read调用来感知这个FIN包,这个EOF会被放在已排队等候的其他已接收的数据之后,所以必须要得继续read接收缓冲区已接收的数据。

接着,当服务端在read数据的时候,最后会读到EOF,接着read()就会返回0,这时服务端应用程序如果有数据要发送的话,就发送完数据后再调用关闭连接的函数,如果没有,则可以直接调用关闭连接的函数,这时服务端就会发送一个FIN包,这个FIN代表服务端之后都不会发送数据了,之后处于LAST_ACK状态。

客户端接收到服务端发来的FIN包,并发送ACK确认包给服务端,此时客户端进入TIME_WAIT状态。

服务端收到ACK确认包之后,就进入到最后的CLOSE状态。

客户端在经过2MSL时间之后,也进入CLOSE状态。

为什么4次挥手中间两次不能变成一次

服务器在收到客户端发来的FIN报文后,内核会马上回复ACK确认报文,但是服务端应用程序可能还有数据要发送,所以不能马上发送FIN报文,而是将发送FIN报文的控制权交给服务端应用程序:

如果服务端应用程序有数据要发送的话,就发送完数据后再调用关闭连接的函数;

如果服务端应用程序没有数据要发送的话,则可以直接调用关闭连接的函数。

第二次和第三次挥手能合并嘛

当被动关闭方在TCP挥手过程中,没有数据要发送且开启了TCP延迟确认机制,那么第二和第三次挥手就会合并传输,这样就出现了三次挥手。

第三次挥手一直没发,会发生什么?

当主动方收到ACK报文后,会处于FIN_WAIT2状态,就表示主动方的发送通道已经关闭,接下来将等待对方发送FIN报文,关闭对方的发送通道。

这时,如果连接是用shutdown函数关闭的,连接可以一直处于FIN_WAIT2状态,因为它可能还可以发送或接收数据,但对于close函数关闭的孤儿连接,由于无法再发送和接收数据,所以这个状态不可以持续太久,而tcp_fin_timeout控制了整个状态下连接的持续时长,默认值是60秒。它意味着对于孤儿连接,如果在60秒后还没有收到FIN报文,连接就会直接关闭。

第二次和第三次挥手之间,主动断开的那端能干什么

如果主动断开的一方,是调用了shutdown函数来关闭连接,并且只选择了关闭发送能力且没有关闭接收能力的话,那么主动断开的一方在第二次和第三次挥手之间还可以接收数据。

断开连接时客户端 FIN 包丢失,服务端的状态是什么?

当客户端调用close函数后,就会向服务端发送FIN报文,此时客户端进入FIN_WAIT_1状态。正常情况下,如果能及时收到服务端返回的ACK报文,那么客户端连接就会进入FIN_WAIT_2状态。

如果第一次挥手丢失了,客户端迟迟收不到服务端返回的ACK报文,就会触发超时重传机制,重传FIN报文,重传次数由内核参数控制。当客户端的重传FIN次数超过设置的值后,就不再发送FIN报文,会再等待一段时间(时间为上一次超时时间的2倍),如果过了这段时间还未收到第二次挥手,那么客户端直接进入到close状态,而此时服务端仍然处于ESTABLISHED状态。

服务端出现大量的timewait有哪些原因?

1.HTTP没有使用长连接。

2.HTTP长连接请求超时。

3.HTTP长连接的请求数量达到上限。

TCP和UDP区别是什么?

1.连接:TCP是面向连接的传输层协议,传输数据前要先建立连接,而UDP是不需要连接,即刻传输数据。

2.服务对象:TCP是一对一的两点服务,即一条连接只有两个端点;而UDP支持一对一、一对多、多对多的交互通信。

3.可靠性:TCP是可靠交付数据的,数据可以无差错、不丢失、不重复、按序到达;UDP是尽最大努力交付,不保证可靠交付数据。但是我们可以基于UDP传输协议实现一个可靠的传输协议,比如QUIC协议。

4.拥塞控制、流量控制:TCP有拥塞控制、流量控制机制,保证数据传输的安全性;UDP则没有,即使网络非常拥堵了,也不影响UDP的发送速率。

5.首部开销:TCP首部长度较长,会有一定的开销,首部在没有使用选项字段时长度为20个字节,如果使用了选项字段,长度则会更长。UDP首部只有8个字节,并且是固定不变的,开销较小。

6.传输方式:TCP是流式传输,没有边界,但保证顺序和可靠;UDP是一个包一个包的发送,是有边界的,但可能会丢包和乱序。

TCP为什么可靠传输

TCP主要靠以下几点来保证传输的可靠性:连接管理、序列号、确认应答、超时重传、流量控制、拥塞控制。

怎么用udp实现http?

UDP是不可靠的传输,但基于UDP的QUIC协议可以实现类似TCP的可靠性传输。

连接迁移:QUIC支持在网络变化时快速迁移连接,比如从WIFI切换到移动网络,以保证连接的可靠性。

重传机制:QUIC使用重传机制来确保丢失的数据包能够被重传发送,从而提高数据传输的可靠性。

前向纠错:QUIC可以使用前向纠错技术,在接收端修复部分丢失的数据,降低重传的需求,提高可靠性和传输效率。

拥塞控制:QUIC内置了拥塞控制机制,可以根据网络状况动态的调整数据传输速率,以避免网络拥塞和丢包,提高可靠性。

tcp粘包怎么解决?

粘包的问题出现是因为不知道用户消息的边界在哪,如果知道了边界在哪,接收方就可以通过边界来划分出有效的用户消息。有以下三种方式分包:

1.固定长度的消息。

2.特殊字符作为边界。

3.自定义消息结构。

描述一下打开百度首页后发生的网络过程

1.解析URL:分析URL所需要使用的传输协议和请求的资源路径,如果输入的URL中的协议或资源路径不合法,将会把地址栏中输入的内容传递给搜索引擎,如果没有问题,浏览器会检查URL中是否出现了非法字符,有则对非法字符进行转义后再进行下一个操作。

2.缓存判断:浏览器缓存->系统缓存->路由器缓存->ISP的DNS缓存,如果其中某个缓存存在,则直接返回服务器的IP地址。

3.DNS解析:如果缓存未命中,浏览器向本地DNS服务器发起请求,最终可能经过根域名服务器、顶级域名服务器、权威域名服务器逐级查询,直到获取目标域名的IP地址。

4.获取MAC地址:当浏览器得到IP地址后,数据传输还需要知道目的主机的MAC地址,因为应用层下发数据给传输层,TCP协议会指定源端口号和目的端口号,然后下发给网络层。网络层会将本机地址作为源地址,获取的IP地址作为目的地址。然后下发给数据链路层,数据链路层的发送需要加入通信双方的MAC地址,本机的MAC地址作为源MAC地址,目的MAC地址需要分情况处理。通过将IP地址与本机的子网掩码相结合,可以判断是否与请求主机在同一个子网里,如果在一个子网里,可以使用ARP协议获取到目的主机的MAC地址,如果不在一个子网里,那么请求应该转发给网关,由它代为转发,同样可以通过ARP协议获取网关的MAC地址,此时目的主机的MAC地址应该为网关的地址。

5.建立TCP连接:主机将使用目标IP地址和目标MAC地址发送一个TCP SYN包去请求服务器连接,然后交给路由器转发,服务器收到请求连接后,会回复一个SYN-ACK包确认请求连接,然后主机收到服务器发来的确认包后会回复一个ACK包,确认已收到服务器的确认,此时TCP连接就建立完成。

6.HTTPS的TLS四次握手:如果使用的是HTTPS协议,在通信前还需要进行TLS的四次握手。

7.发送HTTP请求:连接建立后,浏览器会向服务器发送HTTP请求,请求中包含了用户需要获取的资源信息,例如网页的URL、请求方法等。

8.服务器处理请求并返回响应:服务器收到请求后,会根据请求的内容进行相应的处理。

什么是ddos攻击?怎么防范?

分布式拒绝服务(DDoS)攻击是通过大规模互联网流量淹没目标服务器或其周边基础设施,以破坏目标服务器、服务或网络正常流量的恶意行为。

DDoS攻击是通过连接互联网的计算机网络进行的。这些网络由计算机和其他设备组成,它们感染了恶意软件,从而被攻击者远程控制。这些个体设备称为机器人,一组机器人则成为僵尸网络。

一旦建立了僵尸网络,攻击者就可以通过向每个机器人发送指令来发动攻击。当僵尸网络将受害者的服务器或网络作为目标时,每个机器人会将请求发送到目标的IP地址,从而造成服务器或网络不堪重负,进而造成对正常流量的拒绝服务。由于每个机器人都是合法的互联网设备,所以很难分辨出攻击流量和正常流量。

常见的DDoS攻击:

1.网络层攻击:比较典型的攻击类型是UDP反射攻击,这类攻击主要利用大流量拥塞被攻击者的网络带宽,导致被攻击者的业务无法正常响应客户访问。

2.传输层攻击:比较典型的攻击类型包括SYN Flood攻击、连接数攻击,这类攻击通过占用服务器的连接池资源从而达到拒绝服务的目的。

3.会话层攻击:比较典型的攻击类型是SSL连接攻击,这类攻击占用服务器的SSL会话资源从而达到拒绝服务的目的。

4.应用层攻击:比较典型的攻击类型包括DNS flood攻击、HTTP flood攻击、游戏假人攻击,这类攻击占用服务器的应用处理资源,极大的消耗服务器处理性能从而达到拒绝服务的目的。

为了防范DDoS攻击,可以采取以下措施:

1.增强网络基础设施:提升网络带宽、增加服务器的处理能力和承载能力,通过增强基础设施的能力来抵御攻击。

2.使用防火墙和入侵检测系统:配置防火墙规则,限制不必要的网络流量,阻止来自可疑IP地址的流量。入侵检测系统可以帮助及时发现并响应DDoS攻击。

3.流量清洗和负载均衡:使用专业的DDoS防护服务提供商,通过流量清洗技术过滤掉恶意流量,将合法流量转发给目标服务器。负载均衡可以将流量均匀的分配给多台服务器,减轻单一服务器的压力。

4.配置访问控制策略:限制特定IP地址或IP段的访问,设置访问频率限制,防止过多请求集中在单个IP上。

SQL注入问题是什么?

SQL注入发生在当应用程序直接使用用户提供的输入作为SQL查询的一部分时。当用户输入被错误的用作数据库查询的一部分,而应用程序没有对其进行适当的验证和转义,就可能会发生SQL注入。

解决SQL注入问题的方法主要有以下几种:

1.输入验证和转义:在将用户输入作为SQL查询的一部分之前,先对输入进行验证和转义。确保输入符合预期格式,并防止任何可能导致SQL注入的特殊字符。

2.使用参数化查询:使用参数化查询可以避免直接将用户输入嵌入到SQL查询语句中。参数化查询使用预定义的变量来接收用户输入,并将其传递给数据库,而不是将其直接用作查询的一部分。这样可以防止SQL注入攻击。

3.限制数据库权限:限制数据库用户的权限,只授予它们执行操作所需的最低权限。攻击者可能具有比预期更多的权限,这可能会使攻击更加容易。

4.实施输入过滤:在某些情况下,实施输入过滤可以进一步减少SQL注入的风险。这可能涉及检查和过滤用户输入中的特殊字符和词汇,以排除可能存在的恶意输入。

CSRF攻击是什么?

CSRF(跨站请求伪造)是一种攻击手段,攻击者通过诱导用户执行恶意操作,从而获取用户数据或执行恶意代码。CSRF攻击通常通过伪造一个合法的HTTP请求来实现,这个请求看起来是合法的,但实际上是为了执行一个攻击者控制的操作。

解决CSRF攻击的方法主要有以下几种:

1.验证用户会话:在服务器端对用户会话进行验证,确保请求的会话标识符与当前会话标识符匹配。这样可以防止攻击者伪造会话标识符。

2.使用双重验证:除了会话验证,还可以使用其他的验证方式,例如验证码、签名验证等,这些验证方式可以增加验证的难度。

3.防止跨站请求:通过设置CSP(内容安全策略)来防止跨站请求,限制网页中可执行的脚本源,减少攻击者诱导用户执行恶意操作的可能性。

4.避免使用自动提交表单:禁用默认的自动提交功能,要求用户再提交表单之前确认操作,防止攻击者诱导用户在未经授权的情况下提交表单。

5.强制Referer头部:在服务器端检查请求的Referer头部,确保请求来自可信来源。

XSS攻击是什么?

XSS是跨站脚本攻击,攻击者通过在web页面中插入恶意脚本代码,然后诱导用户访问该页面,从而使得恶意脚本在用户浏览器中执行,从而获取用户信息、会话信息等敏感数据,甚至控制用户账户。

XSS攻击可以分为3类:存储型(持久型)、反射型(非持久型)、DOM型。

存储型XSS:注入型脚本永久存储在目标服务器上,当浏览器请求数据时,脚本从服务器上传回并执行。

反射型XSS:当用户点击一个恶意链接、或者提交一个表单、或者进入一个恶意网站时,注入脚本进入被攻击者的网站。web浏览器将注入脚本,比如一个错误信息、搜索结果等返回到用户的浏览器上,由于浏览器认为这个响应是来自可信任的服务器,所以会执行这段脚本。

基于DOM的XSS:通过修改原始的客户端代码,受害者浏览器的DOM环境改变,导致有效载荷的执行。也就是说,页面本身并没有什么变化,但由于DOM环境被恶意修改,导致有客户端代码被包含进了页面,并且意外执行。

预防XSS攻击的方法主要包括以下几点:

1。输入验证:对所有用户输入的数据进行有效性验证、过滤或转义特殊字符。

2.输出编码:在网页输出用户输入内容时,使用合适的编码方式。

3.Content Security Policy(CSP):通过设置CSP策略,限制网页中可执行的脚本源,有效防范XSS攻击。

4.使用HttpOnly标记:在设置Cookie时,设置HttpOnly属性,使得Cookie无法被js代码读取,减少收到XSS攻击的可能。

了解过DNS劫持吗?

DNS劫持的原理是攻击者在用户查询DNS服务器时篡改响应,将用户请求的域名映射到攻击者控制的虚假IP地址上,使用户误以为访问的是正常网站,实际上被重定向到攻击者操控的恶意网站。这种劫持可以通过植入恶意的DNS记录或劫持用户的DNS流量来实现。

#八股##Java选手##计算机网络#
全部评论

相关推荐

评论
1
6
分享

创作者周榜

更多
牛客网
牛客企业服务