首页
学习
活动
专区
圈层
工具
发布

2021-Java后端工程师面试指南-(计算机网络)

HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。...如果不能到达,就会重新发送,直至到达。TCP 协议里面会有两个端口,一个是浏览器监听的端口,一个是电商的服务器监听的端口。操作系统往往通过端口来判断,它得到的包应该给哪个进程。...如果过一段时间还是没到,发送端的 TCP 层会重新发送这个包,还是上面的过程,直到有一天收到平安到达的回复。这个重试绝非你的浏览器重新将下单这个动作重新请求一次。...发出去的包应该有确认,要不然我怎么知道对方有没有收到呢?如果没有收到就应该重新发送,直到送达。这个可以解决不丢包的问题。作为老司机,做事当然要靠谱,答应了就要做到,暂时做不到也要有个回复。...客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。

44440

TCPUDP协议(二)

通俗描述为: 客户端A和服务器B四次握手: 客户端A: “B,我已经没有话说了,我不会再给你发消息了”; (等待B确认)(一次握手) 服务端B: “A,好的,我知道你不会给我发消息了”;(此时,A-...>B的这条通路会变为半关闭状态,A -> B这个方向的连接释放了,但是,B->A这个方向的还没释放,B发消息给A,A仍能接收到)(二次握手); 服务端B: “A,我也没话要跟你说了”;(等待A确认)(三次握手...TCP可以用于网络数据库,分布式高精度计算系统的数据传输 Tcp的可靠传输协议 (1)停止等待协议: 超时重传:A给B发送消息后,必须收到B返回的确认消息才算发送成功,A只要在发送后的一段时间内没有收到...B的确认消息,那就认为刚才发的消息丢失,就会重新发送刚才的消息,这就叫超时重传。...一种情况是,B在收到重传的消息后,又收到了之前丢失的消息,此时B也应该向A发送确认信息,但A会将这个信息丢弃,B也会将迟到的那个信息丢弃。

89730
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    理解TCP协议三次握手、四次挥手、流量控制、拥塞控制 、重传机制

    TCP黏包与粘包问题 什么是黏包与粘包 如何解决 TCP概述 TCP是一种面向连接的协议,在发送数据前通信双方必须在彼此间建立一条连接 所谓的连接其实就是客户端和服务器的内存里保存一份关于对方的信息...TCP规定,在连接建立后所有传送的报文段都必须把ACK置1 PSH:当两个应用在进行交互时,如果想要立马得到对方的回复就PSH设置为1 RST:RST为1时代表需要重新建立连接 SYN:在连接建立时用来同步序号...,累计确认 选择重传协议 发送窗口 新的分组落入发送区域缓冲区范围,发送->前沿移动 超时重发机制让发送端将超时的分组重新发送出去 来了乱序分组的确认->后沿不向前移动->新的分组无法落入发送缓冲区的范围...,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且重启2MSL计时器 2、防止类似与”三次握手中提到了"已经失效的请求报文段...如何解决 1、固定应用层发送消息的长度,如果不够就补充空格 2、在包尾添加回车换行符进行分割 3、将消息分为消息头与消息体,消息头中包含长度 4、更复杂的应用层协议

    69820

    Tcp是什么?_跟你说完了

    1、连接建立协议 TCP的连接,仿佛就像男女之间建立美妙的爱情关系 男:我爱你 女:嗯,我也爱你 男:嗯 相互的询问,相互的确认,爱情就这样产生。...2、连接断开协议 成年人的爱情就是龙卷风,来的快,走的快 女:对不起,我要跟你分手,我已经放下你了 男:嗯,我知道了 (男生并还没放下,男对女还是思念思念思念...)...时间内,虽然可以重新启动服务器,但是这个服务器还是要平静的等待2MSL时间的过去才能进行下一次连接。...这个ACK应该是在进行重传后的一个往返时间内对步骤1中重传确认。另外,这个ACK也应该是对丢失的分组和收到的第1个重复ACK之间的所有中间报文段的确认。...假如这只是一些报文段的重新排序,则在重新排序的报文段被处理并产生一个新的ACK之前,只可能产生1~2个重复的ACK。如果一连串收到3个或3个以上的重复ACK,就非常可能是一个报文段丢失了。

    1.2K30

    1万字30张图说清TCP协议

    SACK技术正是为改善这种情况而产生的,它使TCP只重新发送丢失的TCP报文段,而不用发送所有未被确认的TCP报文段。选择性确认选项用在连接初始化时,表示是否支持SACK技术。...接收方由此知道,应该按照什么顺序将它们还原成原始文件。 这里的编号就是TCP头中的确认号。wireshark显示的Seq和Ack是wireshark重新编号的。 ?...确认应答包丢失 这种情况指的是前面发送的数据包没有收到对应的确认应答。当收到后面数据包的确认应答包,表示前面的数据包已经成功被接收端接收了,发送端不需要重新发送前面的数据包了。如图所示。 ?...那么,如果在接收端收到的数据包,不是本应该要接收的数据包,那么就会给发送端返回消息,告诉发送端自己应该接收的数据包。...TCP连接的双方都没有向对方发送数据,则在两个TCP模块之间不交换任何信息。 只要两端的主机没有被重启,则连接依然保持建立,不管中间路由器可以崩溃和重启,还是电话线被挂断再连通。

    2.4K30

    腾讯二面:引入RabbitMQ后,你如何保证全链路数据100%不丢失 ?

    顾名思义,就是生产端投递的消息一旦投递到RabbitMQ后,RabbitMQ就会发送一个确认消息给生产端,让生产端知道我已经收到消息了,否则这条消息就可能已经丢失了,需要生产端重新发送消息了。...我们知道,RabbitMQ收到消息后将这个消息暂时存在了内存中,那这就会有个问题,如果RabbitMQ挂了,那重启后数据就丢失了,所以相关的数据应该持久化到硬盘中,这样就算RabbitMQ重启后也可以到硬盘中取数据恢复...挂了,这样消息还是丢失了,或者RabbitMQ在发送确认消息给生产端的过程中,由于网络故障而导致生产端没有收到确认消息,这样生产端就不知道RabbitMQ到底有没有收到消息,就不好做接下来的处理。...默认情况下,以下3种情况会导致消息丢失: 在RabbitMQ将消息发出后,消费端还没接收到消息之前,发生网络故障,消费端与RabbitMQ断开连接,此时消息会丢失; 在RabbitMQ将消息发出后,消费端还没接收到消息之前...如果RabbitMQ一直没有收到消费端的确认信号,并且消费此消息的消费端已经断开连接或宕机(RabbitMQ会自己感知到),则RabbitMQ会安排该消息重新进入队列(放在队列头部),等待投递给下一个消费者

    25310

    引入RabbitMQ后,你如何保证全链路数据100%不丢失?

    顾名思义,就是生产端投递的消息一旦投递到RabbitMQ后,RabbitMQ就会发送一个确认消息给生产端,让生产端知道我已经收到消息了,否则这条消息就可能已经丢失了,需要生产端重新发送消息了。...我们知道,RabbitMQ收到消息后将这个消息暂时存在了内存中,那这就会有个问题,如果RabbitMQ挂了,那重启后数据就丢失了,所以相关的数据应该持久化到硬盘中,这样就算RabbitMQ重启后也可以到硬盘中取数据恢复...挂了,这样消息还是丢失了,或者RabbitMQ在发送确认消息给生产端的过程中,由于网络故障而导致生产端没有收到确认消息,这样生产端就不知道RabbitMQ到底有没有收到消息,就不好做接下来的处理。...默认情况下,以下3种情况会导致消息丢失: 在RabbitMQ将消息发出后,消费端还没接收到消息之前,发生网络故障,消费端与RabbitMQ断开连接,此时消息会丢失; 在RabbitMQ将消息发出后,消费端还没接收到消息之前...如果RabbitMQ一直没有收到消费端的确认信号,并且消费此消息的消费端已经断开连接或宕机(RabbitMQ会自己感知到),则RabbitMQ会安排该消息重新进入队列(放在队列头部),等待投递给下一个消费者

    63030

    传输层协议TCP详解(上篇)

    但是其实可以发现,这样不就会发生无限套娃的情况吗,你发给我消息需要等待我的确认回应,我给你发消息需要等待你的确认回应,这样确认过去确认过来,无穷无尽。...如果接收到的报文段不连续,接收方可以通过TCP的重传机制请求发送方重新发送缺失的数据。...有时候,并不是总是客户端给服务器发消息,服务器也会给客户端发消息,双方地位是对等的,如果只用一个序号位,就搞不清谁发谁收,因此还是需要两种序号位。...自己这里认为发出,但是没有收到对方回复的消息会先保存到滑动窗口 我们知道发送的数据段是有可能没有收到ACK的,所以被发出的数据不应该立马被移除(计算机上的移除其实就是数据覆盖),应该先保存一段时间,如果发送的数据丢包了...TCP规定,建立连接后,ACK必须为1。 SYN:请求建立连接。携带SYN标识的称为同步报文段 作为服务端,如果我们想要知道客户端是想发消息还是想与我建立连接,就需要依靠这个标志位。

    1.2K21

    引入RabbitMQ后,如何保证全链路数据100%不丢失?

    顾名思义,就是生产端投递的消息一旦投递到RabbitMQ后,RabbitMQ就会发送一个确认消息给生产端,让生产端知道我已经收到消息了,否则这条消息就可能已经丢失了,需要生产端重新发送消息了。...我们知道,RabbitMQ收到消息后将这个消息暂时存在了内存中,那这就会有个问题,如果RabbitMQ挂了,那重启后数据就丢失了,所以相关的数据应该持久化到硬盘中,这样就算RabbitMQ重启后也可以到硬盘中取数据恢复...挂了,这样消息还是丢失了,或者RabbitMQ在发送确认消息给生产端的过程中,由于网络故障而导致生产端没有收到确认消息,这样生产端就不知道RabbitMQ到底有没有收到消息,就不好做接下来的处理。...默认情况下,以下3种情况会导致消息丢失: 在RabbitMQ将消息发出后,消费端还没接收到消息之前,发生网络故障,消费端与RabbitMQ断开连接,此时消息会丢失; 在RabbitMQ将消息发出后,消费端还没接收到消息之前...如果RabbitMQ一直没有收到消费端的确认信号,并且消费此消息的消费端已经断开连接或宕机(RabbitMQ会自己感知到),则RabbitMQ会安排该消息重新进入队列(放在队列头部),等待投递给下一个消费者

    54520

    TCP协议可靠性是如何保证之滑动窗口,超时重发,序列号确认应答信号

    当发送端将数据发出之后会等待对端的确认应答。如果有确认应答,说明数据已经成功到达对端。反之,则数据丢失的可能性很大。...另外通信完毕需要发送FIN包来关闭连接 这就是我们常常说的 三次握手建立连接 和四次挥手关闭连接 我之前也写了一篇 一文彻底搞懂 TCP三次握手、四次挥手过程及原理,大家有兴趣可以去看看,了解TCP连接时如何建立和关闭的...[window] 上图的是Tcpdump抓包的信息,在三次握手建立连接时,大家都交换了对方的MSS,目的是告诉对方,我能适应每次TCP数据传输单位最大是多少,后面通信双方就会按照这个MSS大小作为发送单位发送数据...这里我们还是分两种情况分析: 1.确认应答ACK未能正确返回的情况 在这种情况下,数据是已经被对端主机成功接收了的,是不需要进行重新发送的。...2.某个报文丢失的情况 如果当接收端主机接收到一个自己应该接收的序列号之外的数据包时,它会一直对当前接收到的数据包返回确认应答包。

    7.2K40

    计算机网络之传输层

    需要收到接受方的确认消息后,才会产生新的消息。...超时重传:如果发送方的消息在传输的过程种丢失了,接收方没有收到消息,就会进行超时重传;如果接收方发送的确认消息,在传输的过程中丢失,也会进行超时重传,因此 每发送一个消息,都需要设置一个定时器。...Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。...Client端收到FIN报文后,“就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。”...这也是等待计时器的作用,主要是为了确保发送方发送的第四次挥手报文可以正确的到达接收方,如果没有到达的话,接收方就会重新放松第三次挥手的报文,以正确得到释放这次连接。

    34210

    计算机网络常见面试题(一):TCPIP五层模型、TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议

    这个ACK报文段可能丢失,B收不到这个确认报文,就会超时重传连接释放报文段,A可以在这个2MSL时间内收到这个重传的连接释放报文段,接着A重传一次确认,并重新启动2MSL计时器,最后A和B都进入CLOSED...如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。4.重传机制:在数据包丢失或延迟的情况下,重新发送数据包,直到收到对方的确认应答(ACK)。...它的基本原理是每发完一个分组就停止发送,等待对方确认(回复ACK),若过了一段时间还是没收到ACK确认,就说明没有发送成功,需要重新发送,直到收到确认后再发下一个分组;若接收方收到重复分组,就丢弃该分组...因此每发送完一个分组需要设置一个超时计时器,其重传时间应比数据再分组传输的平均往返时间更长一些。这种自动重传方式常称为自动重传请求ARQ确认丢失和确认迟到确认丢失:确认消息在传输过程中丢失。...比如:发送方发送了5条信息,中间第三条丢失,接收方只能对前两个发送确认。

    48010

    【Java面试总结】计算机网络

    为什么要传回 SYN 接收端传回发送端所发送的 SYN 是为了告诉发送端,我接收到的信息确实就是你所发送的信号。 SYN 是 TCP/IP 建立连接时使用的握手信号。...它通过确认和超时这两个机制,在不可靠服务的基础上实现可靠的信息传输。如果发送方在发送后一段时间内没有收到确认帧,它通常会重新发送。ARQ包括停止等待ARQ协议和连续ARQ协议。...如果过了一段时间(超时时间后),还是没有收到ACK确认,说明没有发送成功,需要重新发送,知道收到确认再发送下一个分组; 在停止等待协议中,若收到对方重复分组,就丢弃该分组,但同时还要发送确认。...丢弃这个重复的M1消息,不向上层交付。 2. 向A发送确认消息。(不会认为已经发送过了,就不再发送。A能重传,就证明B的确认消息丢失)。 确认迟到:确认消息在传输过程中迟到。...过了一会,A收到了B第一次发送的对M1的确认消息(A也收到了2份确认消息)。处理如下:1. A收到重复的确认后,直接丢弃。2. B收到重复的M1后,也直接丢弃重复的M1。

    90720

    Linux下TCP连接过程总结

    Apache,java   一个应用至于到底是该使用短连接还是长连接,应该视具体情况而定。一般的应用应该使用长连接。...正在关闭的TCP将等待其关闭握手消息的确认信息,该确认信息表明在连接上传 输的所有数据已经安全地传输到了RecvQ中。只要收到了确认消息,该连接就变成"半关闭(Half closed)"状态。...当收到关闭握手确 认消息后,套接字数据结构的状态则改变为"半关闭"(专业术语称为"FIN_WAIT_2"),这种状态将一直持续,直到接收到另一端的关闭握手消息    关闭TCP连接的最后微妙之处在于对Time-Wait...如果在连接两端都完成了关闭握手后,它们都移除了其底层数据结 构,而此时在同样一对套接字地址之间又立即建立了新的连接,那么前一个连接在网络上传输时延迟的消息就可能在新连接建立后到达。...接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以 close这个SOCKET,发送FIN报文给对方,也即关闭连接。

    5.3K50

    RabbitMq 笔记,一篇文章入门

    代码里面使用false,建议; 只应答当前处理完成的; 消息自动重新入队 如果消费者由于某些原因失去连接(其通道已关闭,连接已关闭或 TCP 连接丢失), 导致消息未发送 ACK 确认,RabbitMQ...如果此时其他消费者可以处理, 它将很快将其重新分发给另一个消费者。这样,即使某个消费者偶尔死亡, 也可以确保不会丢失任何消息。...就是消费者没有返回ack,那么就将消息重新入队; RabbitMQ 持久化 为什么持久化 刚刚我们已经看到了如何处理任务不丢失的情况,但是如何保障当 RabbitMQ 服务停掉以后消 息生产者发送过来的消息不丢失...发布确认 我们之前为了消息不丢失,要求了队列持久化,消息持久化,但是在消息持久化到磁盘之前,rabbitmq宕机了,咋办,消息还是会丢失的,所以我们需要第三个,就是在消息确保到硬盘的时候,返回给发送者一个确认机制...是应该把这些消 息放到特定队列还是说把他们到许多队列中还是说应该丢弃它们。这就的由交换机的类型来决定。

    85530

    网络的救命稻草:重传机制如何确保数据顺利传输?

    在TCP中,当发送端的数据包到达接收主机时,接收主机会返回一个确认应答消息,表示已经成功接收到数据。然而,由于网络的不可靠性,有时候确认应答消息可能丢失或延迟到达。...接下来说说常见的重传机制:超时重传:当发送端发送了一个数据包后,会启动一个定时器,等待接收端的确认应答。如果在指定的时间内没有收到确认应答,发送端会认为数据包丢失,然后重新发送该数据包。...快速重传:在TCP中,如果发送端连续收到3个重复的确认应答,就会认为有一个数据包丢失了。此时,发送端会立即重传该数据包,而不再等待超时。...可以看出,D-SACK(Duplicate Selective Acknowledgment)具有以下几个优点:它可以提供给发送方有关丢包原因的信息,发送方可以知道是发送的数据包丢失了还是接收方的ACK...超时重传是最常见的重传机制,当发送端发送数据包后,等待一定时间内未收到确认应答时,会重新发送数据包。快速重传是基于数据的驱动重传,当发送端连续收到三个重复的确认应答时,会立即重传丢失的数据包。

    82410

    大数据系列之----海量数据下是kafka设计和实战演练

    生产者的发送方式应该设置为同步还是异步?...我曾经遇到过因为Kafka的Bug,导致kafka的其中一个broker有一段时间不可用,导致消息发送失败。理论上,对于这部分失败,通过把失败信息记录下来,然后通过重刷数据修复。      ...0表示消息发送不等待Leader的确认就继续发送下一条,1表示等待Leader确认后再发下一条,-1表示等待Leader和Follower确认后再发下一条。配置为0极其不可靠,我觉得几乎不用考虑。...假设消息写入Leader成功后,但follower还在同步,此时Leader挂掉,由于消息还没有得到确认,所以该消息会重新发送,并不会丢失。      ...设置为-1并不消息消息就一定不会丢失,如果Leader挂掉,重新选举的Leader也挂掉,也就是连续两个Leader都挂掉,是有可能出现消息丢失的。

    47030

    kafka生产者消息分区机制原理剖析

    acks=0 在该模式下,Producer不会等待Broker的确认反馈,即不关心Broker是否正确的将发送来的数据持久化,所以在这种模式下,很有可能会丢失数据。...因为如果Broker挂了,Producer不会被通知到,所以还会不停的发送数据导致数据丢失。在对数据完整性需求不强烈的场景下,这种模式可以提高性能。...当Producer没有收到Broker的确认反馈时,Producer会尝试重新发送数据。 当Leader Broker挂了,但是Replicas又没有持久化数据时,还是会丢失数据。...acks=all 该模式下,Producer同样需要等待Broker的确认,但是确认更为严格,需要所有的Partition(Leader + Replicas)都持久化数据后才返回确认信息。...这种问题可能在很短暂的时间内就会自动修复,那么在这种情况下,我们希望Producer在发送失败后能重新尝试发送。

    3.9K12

    TCP概述三次握手四次挥手报文首部,常用熟知端口号

    syn与发过来的syn匹配的信息,并发送ack信息(为了防止伪ip访问想获取数据连接) 客户端收到了syn与ack信息后,进入准备连接状态,再把ack消息发送给服务器 服务器收到ack消息后也进入连接状态与客户端进行连接...序号:占4个字节,TCP连接中传送的字节流中的每个字节都按顺序编号。例如,一段报文的序号字段值是 301 ,而携带的数据共有100字段,显然下一个报文段(如果还有的话)的数据序号应该从401开始....保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,...简单来说三次握手是让数据连接时候更加准确的服务端连接上客户端,也可以防止伪IP进行请求,四次挥手保证关闭前服务端已经成功把剩下的信息发送给客户端 3.如果已经建立连接,但是客户端突然出现故障关闭 TCP...若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。 简单来说服务器会等一段时间,如果在这时间内客户端依然没有发送消息给服务端,服务端会自动关闭连接

    1K20

    TCP 窗口缩放、时间戳和 SACK

    TCP 会自动重新发送未确认的数据。重传由计时器触发:如果超时,则 TCP 会将尚未收到确认的一个或多个数据包视为丢失。然后再发送一次。 但是,“尚未得到确认” 并不意味着该段已丢失。...必须重新发送的数据包在计算过程中必须被忽略。这是因为发送方无法判断重传数据段的 ACK 是在确认原来的传输数据(毕竟已到达)还是在确认重传数据。...如果发送方收到对 s_n 的确认,则 s_3 是唯一丢失的数据包。这是理想的情况。仅发送单个丢失的数据包。 如果发送方收到的确认段小于 s_n,例如 s_4,则意味着丢失了多个数据包。...如果只有一个数据包需要重新发送,第一种策略是快速的,但是当多个数据包丢失时,它花费的时间太长。 即使必须重新发送多个数据包,第二个也是快速的,但是以浪费带宽为代价。...如果两个端点都支持该扩展,则检测到数据流中丢失数据包的对等方可以将此信息通知发送方。

    1.7K10
    领券