镇安| 普兰店| 庆元| 布拖| 寿阳| 阿克塞| 南平| 前郭尔罗斯| 松阳| 西丰| 吴起| 汝阳| 荆门| 蔚县| 上饶县| 施秉| 锦屏| 西峡| 嘉禾| 库伦旗| 白玉| 杜集| 罗甸| 泉港| 太康| 霞浦| 宿州| 乃东| 怀宁| 崇信| 万全| 井冈山| 凤山| 龙井| 唐海| 玉屏| 巩留| 雷波| 潘集| 岐山| 庆安| 临武| 崇左| 永定| 同心| 湖州| 扶绥| 诸城| 浪卡子| 张掖| 弥渡| 塔什库尔干| 桃江| 长顺| 开封市| 大港| 黄埔| 淳安| 自贡| 八达岭| 东西湖| 金沙| 香港| 雷波| 叶城| 南乐| 察隅| 盘锦| 高陵| 桑日| 扎兰屯| 苏尼特左旗| 轮台| 台中县| 洱源| 扶沟| 长丰| 丹棱| 惠山| 高县| 阿拉善左旗| 鹿泉| 噶尔| 新洲| 建始| 夏县| 东西湖| 宜州| 麦盖提| 宝清| 陇南| 新疆| 溆浦| 梧州| 新疆| 寿光| 鲁甸| 涡阳| 五峰| 柳林| 遵义市| 鄱阳| 江川| 澎湖| 秦皇岛| 潮阳| 赤峰| 潮南| 巢湖| 营山| 武宁| 建瓯| 当涂| 阳城| 南皮| 灞桥| 龙泉| 台北市| 辽阳县| 柳江| 安乡| 汉南| 鄱阳| 武威| 石家庄| 台前| 山丹| 嘉祥| 长乐| 铁山| 连江| 镇康| 临泽| 魏县| 革吉| 临潼| 松溪| 阳城| 崇明| 乐山| 韩城| 吉县| 福海| 新绛| 台湾| 红河| 射阳| 公主岭| 代县| 盐津| 桂林| 天山天池| 汾西| 固镇| 涟源| 临淄| 娄底| 侯马| 吉水| 公主岭| 合水| 中牟| 台中县| 庆云| 赣县| 湘潭县| 临江| 乌兰察布| 麻栗坡| 额尔古纳| 平塘| 台州| 休宁| 沭阳| 门头沟| 新平| 澎湖| 泸水| 宜良| 桃园| 惠水| 绍兴县| 龙口| 汾阳| 栾城| 长安| 吕梁| 阿坝| 合山| 米易| 潞西| 君山| 积石山| 泸西| 广元| 云溪| 平南| 凤台| 天长| 河池| 武穴| 达拉特旗| 台南县| 樟树| 惠水| 甘孜| 建德| 惠水| 故城| 丹凤| 西峡| 渠县| 泸水| 拜泉| 苗栗| 镇坪| 烈山| 滕州| 贵德| 马尔康| 长海| 周至| 资阳| 叶城| 兴化| 邳州| 嘉兴| 大龙山镇| 浙江| 栖霞| 汉寿| 仙桃| 桦甸| 湘潭市| 任县| 行唐| 南昌市| 沈丘| 电白| 蕉岭| 江山| 焦作| 贵港| 治多| 饶阳| 哈巴河| 稻城| 衢江| 高台| 普陀| 阳谷| 桂林| 金塔| 民勤| 南靖| 皮山| 石景山| 寿县| 日土| 平原| 黑水| 白云| 红河| 通许| 百家乐破解
0

我的帖子

个人中心

设置

  发新话题

TCP 三次握手和四次挥手的问题在面试中是最为常见的考点之一。很多读者都知道三次和四次,但是如果问深入一点,他们往往都无法作出准确回答。

本篇尝试使用动画来对这个知识点进行讲解,期望读者们可以更加简单的理解 TCP 交互的本质。

TCP 三次握手

TCP 三次握手就好比两个人在街上隔着 50 米看见了对方,但是因为雾霾等原因不能 100% 确认,所以要通过招手的方式相互确定对方是否认识自己。

张三首先向李四招手(syn),李四看到张三向自己招手后,向对方点了点头挤出了一个微笑(ack)。

张三看到李四微笑后确认了李四成功辨认出了自己(进入 estalished 状态)。

但是李四还有点狐疑,向四周看了一看,有没有可能张三是在看别人呢,他也需要确认一下。

所以李四也向张三招了招手(syn),张三看到李四向自己招手后知道对方是在寻求自己的确认。

于是也点了点头挤出了微笑(ack),李四看到对方的微笑后确认了张三就是在向自己打招呼(进入 established 状态)。

于是两人加快步伐,走到了一起,相互拥抱。

我们看到这个过程中一共是如下四个动作:

  • 张三招手
  • 李四点头微笑
  • 李四招手
  • 张三点头微笑

其中李四连续进行了 2 个动作,先是点头微笑(回复对方),然后再次招手(寻求确认),实际上可以将这两个动作合一,招手的同时点头和微笑(syn+ack)。

于是四个动作就简化成了三个动作,张三招手→李四点头微笑并招手→张三点头微笑。这就是三次握手的本质,中间的一次动作是两个动作的合并。

我们看到有两个中间状态,syn_sent 和 syn_rcvd,这两个状态叫做「半打开」状态,就是向对方招手了,但是还没来得及看到对方的点头微笑。

syn_sent 是主动打开方的「半打开」状态,syn_rcvd 是被动打开方的「半打开」状态。客户端是主动打开方,服务器是被动打开方。

  • syn_sent:syn package has been sent
  • syn_rcvd:syn package has been received

TCP 数据传输

TCP 数据传输就是两个人隔空对话,差了一点距离,所以需要对方反复确认听见了自己的话。

张三喊了一句话(data),李四听见了之后要向张三回复自己听见了(ack)。

如果张三喊了一句,半天没听到李四回复,张三就认为自己的话被大风吹走了,李四没听见,所以需要重新喊话,这就是 TCP 重传。

也有可能是李四听到了张三的话,但是李四向张三的回复被大风吹走了,以至于张三没听见李四的回复。

张三并不能判断究竟是自己的话被大风吹走了还是李四的回复被大风吹走了,张三也不用管,重传一下就是。

既然会重传,李四就有可能同一句话听见了两次,这就是「去重」。「重传」和「去重」工作在操作系统的网络内核模块都已经帮我们处理好了,用户层是不用关心的。

张三可以向李四喊话,同样李四也可以向张三喊话,因为 TCP 链接是「双工的」,双方都可以主动发起数据传输。

不过无论是哪方喊话,都需要收到对方的确认才能认为对方收到了自己的喊话。

张三可能是个高射炮,一连说了八句话,这时候李四可以不用一句一句回复,而是连续听了这八句话之后,一起向对方回复说前面你说的八句话我都听见了,这就是批量 ACK。

但是张三也不能一次性说太多话,李四的脑子短时间可能无法消化太多,两人之间需要有协商好的合适的发送和接受速率,这个就是「TCP 窗口大小」。

网络环境的数据交互同人类之间的对话还要复杂一些,它存在数据包乱序的现象。

同一个来源发出来的不同数据包在「网际路由」上可能会走过不同的路径,最终达到同一个地方时,顺序就不一样了。

操作系统的网络内核模块会负责对数据包进行排序,到用户层时顺序就已经完全一致了。

TCP 四次挥手

TCP 断开链接的过程和建立链接的过程比较类似,只不过中间的两步并不总是会合成一步走。

所以它分成了如下 4 个动作:

  • 张三挥手(fin)
  • 李四伤感地微笑(ack)
  • 李四挥手(fin)
  • 张三伤感地微笑(ack)

之所以中间的两个动作没有合并,是因为 TCP 存在「半关闭」状态,也就是单向关闭。

张三已经挥了手,可是人还没有走,只是不再说话,但是耳朵还是可以继续听,李四呢继续喊话。

等待李四累了,也不再说话了,朝张三挥了挥手,张三伤感地微笑了一下,才彻底结束了。

上面有一个非常特殊的状态 time_wait,它是主动关闭的一方在回复完对方的挥手后进入的一个长期状态。

这个状态标准的持续时间是 4 分钟,4 分钟后才会进入到 Closed 状态,释放套接字资源。不过在具体实现上这个时间是可以调整的。

它就好比主动分手方要承担的责任,是你提出的要分手,你得付出代价。这个后果就是持续 4 分钟的 time_wait 状态,不能释放套接字资源(端口),就好比守寡期,这段时间内套接字资源(端口)不得回收利用。

它的作用是重传最后一个 ack 报文,确保对方可以收到。因为如果对方没有收到 ack 的话,会重传 fin 报文,处于 time_wait 状态的套接字会立即向对方重发 ack 报文。

同时在这段时间内,该链接在对话期间于网际路由上产生的残留报文(因为路径过于崎岖,数据报文走的时间太长,重传的报文都收到了,原始报文还在路上)传过来时,都会被立即丢弃掉。

4 分钟的时间足以使得这些残留报文彻底消逝。不然,当新的端口被重复利用时,这些残留报文可能会干扰新的链接。

4 分钟就是 2 个 MSL,每个 MSL 是 2 分钟。MSL 就是 Maximum Segment Lifetime——最长报文寿命。

这个时间是由官方 RFC 协议规定的。至于为什么是 2 个 MSL 而不是 1 个 MSL,我还没有看到一个非常满意的解释。

四次挥手也并不总是四次挥手,中间的两个动作有时候是可以合并一起进行的。

这个时候就成了三次挥手,主动关闭方就会从 fin_wait_1 状态直接进入到 time_wait 状态,跳过了 fin_wait_2 状态。

总结

TCP 状态转换是一个非常复杂的过程,本文仅对一些简单的基础知识点进行了类比讲解。

关于 TCP 的更多知识还需要读者去搜寻相关技术文章进入深入学习。如果读者对 TCP 的基础知识掌握得比较牢固,高级的知识理解起来就不会太过于吃力。

作者:钱文品(老钱)

编辑:陶家龙、孙淑娟

出处:本文经授权转载自码洞(ID:codehole)微信公众号

钱文品(老钱),互联网分布式高并发技术十年老兵,目前任掌阅服务端技术专家。熟练使用 Java、Python、Golang 等多种计算机语言,开发过游戏,制作过网站,写过消息推送系统和 MySQL 中间件,实现过开源的 ORM 框架、Web 框架、RPC 框架等。运营个人公众号码洞(ID:codehole)




版主辛苦了,学习下基础知识



楼主辛苦,感谢分享。




这个解释好,生动形象接地气。



学习了




楼主辛苦,感谢分享。



颠覆了我的理解与认知 谢谢楼主



三路握手的目的就是获取seq?




辛苦了




感谢楼主分享




解释的很形象,通俗易懂






通俗易懂



‹‹ 上一贴:大牛总结出来的python基础知识实例,超详细! ...  
  发新话题
快速回复主题
关于我们 | 诚聘英才 | 联系我们 | 网站大事 | 友情链接 |网站地图
Copyright©2005-2018 51CTO.COM
本论坛言论纯属发布者个人意见,不代表51CTO网站立场!如有疑义,请与管理员联系:bbs@51cto.com
惠济路 八八街道 后坎 彭田 新塘社区
东安路青松城 六盘水市钟山区 王平村 北高镇 吉山三社区
电子游戏平台 ag电子游戏技巧 澳门百老汇游戏注册 银河国际娱乐 威尼斯人娱乐
阿丽亚娜电子游戏 百家乐网页游戏 博彩资讯网 澳门巴比伦赌场官网 澳门拉斯维加斯平台
澳门轮盘游戏赌场 澳门威尼斯人官网 威尼斯人赌城网址 永利娱乐游戏 大小点游戏官网
澳门葡京官网注册 银河平台 游戏平台有哪些 澳门威尼斯人官网 葡京注册网址
老虎机定位器 澳门大富豪网址 现金三公注册网址 牛牛游戏下载 现金骰宝 年度十大电子游戏 大小点游戏 玩什么游戏可以挣钱 电子游戏厅 方法奇葩赌博网 巴黎人网站 pt电子游戏哪个最会爆 澳门巴黎人游戏 澳门龙虎斗注册 澳门大富豪网站 押大小排行 真钱打牌 明升网站 十三水技巧 电子游戏下载 二十一点平台 现金网游戏开户平台 澳门百老汇游戏官网 皇博压大小 真钱捕鱼 跑马机游戏 赌博技巧 巴比伦赌场官网 现金三公 地下网址 捕鱼游戏技巧 英皇网站 手机玩游戏赚钱平台 现金网排行 pt电子游戏注册 赌博技巧 电脑玩游戏赚钱平台 海立方游戏 ag电子游戏排行 希尔顿官网 太阳网上压大小 现金赌钱游戏 现金棋牌游戏 真人网站网址 地下开户 九五至尊娱乐网址 澳门梭哈游戏官网 奇葩袖赌博网 鸿胜国际压大小 博狗扑克游戏 德州扑克游戏规则 庄闲代理 奔驰宝马老虎机下载 现金三公开户注册 免费试玩电子游戏 GT压大小 新濠天地注册 现金老虎机网站 纸牌赌博种类 乐天堂开户 澳门永利平台 电脑版捕鱼达人 玩电子游戏入门 斗牛游戏 bbin压大小 网上电子游戏网址 澳门网络下注平台 明升国际网址 明升娱乐 捕鱼达人电子游戏 mg电子游戏试玩 二十一点游戏赌场 澳门万利赌场官网 大小对比网站 现金电子游戏 电子游戏实用技术 老虎机破解器 澳门梭哈官网 澳门百老汇赌场注册 千炮捕鱼兑换现金 网上合法赌场 PT电子游戏 波克棋牌官方下载 天天棋牌 凤凰棋牌 美少女战士电子游戏 什么游戏可以赚人民币 银河国际娱乐 澳门番摊官网 澳门梭哈官网 胜博发电子游戏 电子游戏打鱼机 澳门现金网 大三巴网站 PT电子游戏 澳门银河国际娱乐