范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

字节一面TCP三次握手,问的好细

  大家好,我是小林。
  有位读者在面试字节时,被问到这么个问题:
  概括起来,是这两个问题:  TCP 三次握手中,客户端收到的第二次握手中 ack 确认号不是自己期望的,会发生什么?是直接丢弃 or 回 RST 报文?  什么情况下会收到不正确的 ack(第二次握手中的 ack) 呢?  问题解答
  不卖关子,直接说这个问题,是 回 RST 报文 。过程如下图:
  三次握手避免历史连接
  当客户端连续发送多次建立连接的 SYN 报文,然后在网络拥堵的情况,就会发生客户端收到不正确的 ack 的情况。具体过程如下:  客户端先发送了 SYN(seq = 90) 报文,但是被网络阻塞了,服务端并没有收到,接着客户端又重新发送了 SYN(seq = 100) 报文,注意不是重传 SYN,重传的 SYN 的序列号是一样的。  「旧 SYN 报文」比「最新的 SYN 」 报文早到达了服务端,那么此时服务端就会回一个 SYN + ACK 报文给客户端,此报文的确认号是 91(90+1)。  客户端收到后,发行自己期望收到的确认号应该是 100+1,而不是 90 + 1,于是就会回 RST 报文。  服务端收到 RST 报文后,就会中止连接。  后续最新的 SYN 抵达了服务端后,客户端与服务端就可以正常的完成三次握手了。
  上述中的「旧 SYN 报文」称为历史连接,TCP 使用三次握手建立连接的 最主要原因就是防止「历史连接」初始化了连接 。
  我们也可以从 RFC 793 知道 TCP 连接使用三次握手的首要原因:
  The principle reason for the three-way handshake is to prevent old duplicate connection initiations from causing confusion.
  简单来说,三次握手的首要原因是为了防止旧的重复连接初始化造成混乱。RFC 给出的三次握手防止历史连接的案例图如下:
  RFC 793
  如果是两次握手连接,就无法阻止历史连接,那 为什么 TCP 两次握手为什么无法阻止历史连接呢?
  我先直接说结论,主要是因为 在两次握手的情况下,「被动发起方」没有中间状态给「主动发起方」来阻止历史连接,导致「被动发起方」可能建立一个历史连接,造成资源浪费 。
  你想想,两次握手的情况下,「被动发起方」在收到 SYN 报文后,就进入 ESTABLISHED 状态,意味着这时可以给对方发送数据给,但是「主动发」起方此时还没有进入 ESTABLISHED 状态,假设这次是历史连接,主动发起方判断到此次连接为历史连接,那么就会回 RST 报文来断开连接,而「被动发起方」在第一次握手的时候就进入 ESTABLISHED 状态,所以它可以发送数据的,但是它并不知道这个是历史连接,它只有在收到 RST 报文后,才会断开连接。
  两次握手无法阻止历史连接
  可以看到,上面这种场景下,「被动发起方」在向「主动发起方」发送数据前,并没有阻止掉历史连接,导致「被动发起方」建立了一个历史连接,又白白发送了数据,妥妥地浪费了「被动发起方」的资源。
  因此, 要解决这种现象,最好就是在「被动发起方」发送数据前,也就是建立连接之前,要阻止掉历史连接,这样就不会造成资源浪费,而要实现这个功能,就需要三次握手 。 源码分析
  我说回 RST 就回 RST 吗?当然不是了,肯定得用源码证明我说的这个结论。
  听到要源码分析,可能有的同学就怂了。
  其实要分析我们今天这个问题,只要懂 if else 就行了,我也会用中文来表述代码的逻辑,所以单纯看我的文字也是可以的。
  这次我们重点分析的是,在 SYN_SENT 状态下,收到不正确的确认号的 syn+ack 报文是如何处理的。
  处于 SYN_SENT 状态下的客户端,在收到服务端的 syn+ack 报文后,最终会调用 tcp_rcv_state_process,在这里会根据 TCP 状态做对应的处理,这里我们只关注 SYN_SENT 状态。  // net/ipv4/tcp_ipv4.c int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) {  ...     int queued = 0;      ...     switch (sk->sk_state) {  case TCP_CLOSE:   ...  case TCP_LISTEN:   ...  case TCP_SYN_SENT:     ....   queued = tcp_rcv_synsent_state_process(sk, skb, th);   if (queued >= 0)    return queued;     ...  }
  可以看到,接下来,会继续调用 tcp_rcv_synsent_state_process 函数。  static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb,       const struct tcphdr *th) {  ....   if (th->ack) {   /* rfc793:    * "If the state is SYN-SENT then    *    first check the ACK bit    *      If the ACK bit is set    *   If SEG.ACK =< ISS, or SEG.ACK > SND.NXT, send    *        a reset (unless the RST bit is set, if so drop    *        the segment and return)"    */     // ack 的确认号不是预期的   if (!after(TCP_SKB_CB(skb)->ack_seq, tp->snd_una) ||       after(TCP_SKB_CB(skb)->ack_seq, tp->snd_nxt))       //回 RST 报文    goto reset_and_undo;    ... }
  从上面的函数,就可以得知了,客户端在 SYN_SENT 状态下,收到不正确的确认号的 syn+ack 报文会回 RST 报文。  小结
  TCP 三次握手中,客户端收到的第二次握手中 ack 确认号不是自己期望的,会发生什么?是直接丢弃 or 回 RST 报文?
  回 RST 报文。
  什么情况下会收到不正确的 ack(第二次握手中的 ack) 呢?
  当客户端发起多次 SYN 报文,然后网络拥堵的情况下,「旧的 SYN 报文」比「新的 SYN 报文」早抵达服务端,此时服务端就会按照收到的「旧的 SYN 报文」回复 syn+ack 报文,而此报文的确认号并不是客户端期望收到的,于是客户端就会回 RST 报文。
  完!
  用 RFC 文档+源码的方说明我的结论,这么严谨的小林,没谁了吧
  原文链接:https://mp.weixin.qq.com/s/sqkYBM-4l4qFFPkjY_zCJA

增城两日游泡稀有的苏打型温泉,游大丰门锦绣大瀑布秋日生活打卡季1day出发增城健康山谷度假温泉酒店泡温泉晚餐2day出发大丰门回家增城健康山谷度假温泉酒店酒店坐落在被誉为北回归线上的瑞士增城白水寨风景度假名胜区内。这是以七星级标公园城市上新!桂城8个名企百园启用(附定位)11月7日,佛山市南海区桂城街道第二批名企百园项目启用,包括平胜汇江公园海逸产业社区公园三山科创公园世纪StarPark公园等在内,8个主题园集中亮相,让桂城市民又多了一批休闲娱乐校长专访学会接受孩子的不完美,你的教育焦虑自然不药而愈记者丨陈兴隆开篇语一次没考好就如同天塌,班干部竞选失败就咬牙切齿再也不参加竞选,更有甚者,因为父母或者老师的一次批评,就做出最令人扼腕的冲动决定真实的生活,一定有风有雨。对于习惯了中国与缅甸交界的边境小村(乡愁)我家乡在祖国遥远的滇西中缅边境腾冲的一个小镇,离省会昆明700公里,这里山高云低,气候四季如春。高耸入云的高黎贡山贯穿全境,被喻腾冲人民的神山。野香蕉这里物产丰富,四季分明。既有高币圈著名空头棋局座谈会总结棋局是币圈一个老kol,以前微博用户名叫莱特币。出名于18年做空比特币,当然后面也因为做空错失了大牛市。以下是他的座谈会总结。前言我这几年活得有点混沌,我也不知道为什么,大家如果不东北大环线D30海拉尔阿尔山走西线,深入呼伦贝尔草原腹地海拉尔原本不在我们东北行的计划中,既然来了,当然要对这座陌生的城市做些了解。海拉尔是呼伦贝尔市辖区,是呼伦贝尔市政治经济文化中心,人口35万,因城市北部的海拉尔河而得名。由于时间有拯救太子计划失败!美媒支招勇士3换3报价火箭伊森加鲁巴勇士要和我火抢文班吗?一些球迷这样调侃。本赛季开始前恐怕没有多少人能预料到账面阵容强大的勇士会十战七败吧。汤神赛前表示自己感觉勇士很快就会迎来一波连胜!有球迷评价你不要学浓眉,他输11月中路梯队T0法师诞生,王昭君成为四巨头,杨玉环降级注T1的意思是指版本第一梯队的英雄,这类英雄会比普通英雄较为强势,而T0的意思是指凌驾于第一梯队,属于版本非ban必选的英雄。本榜单是结合了官方所公布的排位巅峰赛数据和KPL职业赛炒掉物业后,长沙一小区交房14年迎来首次分红,居民乐翻了11月5日上午,长沙市开福区滨江君悦香邸小区在第三届业委会第一届业主监督委员会和绝大多数业主的共同努力下,迎来了该小区交房14年来的第一次分红。去年年底,该小区业委会曾因物业公司收寻秋鄂城大美花湖心花怒放花马湖畔,春花秋月,走马观花,心花怒放。花湖之花,是花容月貌,闭月羞花。花湖之花,是稻花香里说丰年,听取蛙声一片的八庙,是何须浅碧深红色,自是花中第一流的刘钊,是兴尽晚回舟,误入藕出国工作为什么出入境不能带水果?在现代生活中,出国旅游的人数逐渐增加。出国旅游的人数比历史上任何一个国家都要多。这主要是因为经济的影响,人们变得富有,世界各地区之间的互动变得频繁。在安全稳定的环境下,出国旅游自然
六十岁后,人生只剩下三种朋友人的一生,不同年龄段有着不同的朋友,年轻时的朋友,是一群人的狂欢步入社会以后,朋友是利益往来晚年的朋友,则是一切随缘。六十岁后,人心淡了,看透了许多,也便懂得了放下,学会了珍惜,珍平安春运交警同行感谢他们,用行走的背影守护着万家平安春运是一场爱的迁徙对于交警来说春运是一场守候更是一种责任和担当人们归乡又返程他们始终坚守在路上为这场迁徙保驾护航守护平安春运,他们一直在路上保障着我们的平安出行!有一种安全叫交警的为爱徘徊余秀华,我在人生的舞台上出丑,然而我并不后悔为爱徘徊余秀华,我在人生的舞台上出丑,然而我并不后悔我喜欢看她写风花雪月,写光阴凉薄,写得来复失去,写爱而不能得。即使这些,都以苦痛颠簸为代价,她也能在废墟上,开出绮丽玫瑰。有时卑岁月流年岁月蹉跎,如诉如歌。壬寅将去,癸卯在来,总得为去岁稍作记忆。晓波说,当把生命浪费在美好的事物上。冯唐说,有意义的人生,当是心中一撮小火,身体离地半尺,不做蝼蚁不做神。相比之下,我属跟岁月握手言和,与生活不止不休这些年我们排过最长的队,抢过最多的菜,张过无数次的嘴,于三尺陋室惦记过窗外的风景,理解过许多混乱的信息,放弃了一次次想要自由的心情,终究是恍惚间从ICU走向了KTV人生的经历有时一创8年新低!三星四季度营业利润暴跌七成,头号支柱也要倒了?作者Hernanderz监制罗超在智能手机半导体齐齐进入寒冬的情况下,投资者和分析师们对三星的财报早已做好悲观预期。不过最终公布的数据,还是令人感到失望。当地时间1月30日公布的财消息称苹果iPhone15系列机型将支持WiFi6eIT之家1月26日消息,据MacRumors报道,根据巴克莱分析师BlayneCurtis和TomOMalley本周分享的一份研究报告,iPhone15系列机型将支持WiFi6E,三星将在印度专注于GalaxyA和5G,但仍将推出4G手机IT之家1月27日消息,三星去年在印度引领了5G智能手机市场,该公司最近表示希望在2023年让印度的5G民主化。三星希望让每个人都能使用5G智能手机,但即便如此,三星也不会停止提供乐高官网公布2023年首款乐高建筑系列套装乐高拼砌说明书服务器现在曝光了将在今年晚些时候到来的全新乐高建筑套装的首张图片。40585建筑奇观的世界包括中国长城泰姬陵佩特拉和帕台农神庙的微缩再现世界七大现代奇迹中的三个。目前魅族20系列正式定档春季发布,魅族10价比老人机上演砸场闹剧魅族科技宣布,魅族20系列正式定档今年春季发布,最快预计在2月下旬开启预热。作为吉利收购后的首款旗舰机,粉丝希望可以获得全新体验,一份专利授权图的曝光让广大魅友感到惊喜。值得一提的过年大鱼大肉吃太多,3个小妙招帮您减轻身体负担!一到过年时期,恐怕没有谁可以继续保持如同平时一般的规律性饮食吧?毕竟春节期间可是各种各样的美食的荟萃,看着餐桌上的红烧鲤鱼四喜丸子小酥肉锅包肉转着看一圈也难以找到几道素菜,过年的餐