趣谈网络协议
刘超
前网易研究院云计算技术部首席架构师
130416 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 51 讲
趣谈网络协议
15
15
1.0x
00:00/00:00
登录|注册

第11讲 | TCP协议(上):因性恶而复杂,先恶后善反轻松

异常情况的处理
四次挥手的过程
断开连接的目的
序号的问题
三次握手的过程
建立连接的目的
窗口大小
状态位
确认序号
包的序号
源端口号和目标端口号
其他数据结构处理连接状态
查看连接状态的方法
连接的建立和断开的过程
TCP包头复杂,关注五个问题
TCP状态机
TCP四次挥手
TCP的三次握手
TCP包头格式
总结
TCP协议

该思维导图由 AI 生成,仅供参考

上一节,我们讲的 UDP,基本上包括了传输层所必须的端口字段。它就像我们小时候一样简单,相信“网之初,性本善,不丢包,不乱序”。
后来呢,我们都慢慢长大,了解了社会的残酷,变得复杂而成熟,就像 TCP 协议一样。它之所以这么复杂,那是因为它秉承的是“性恶论”。它天然认为网络环境是恶劣的,丢包、乱序、重传,拥塞都是常有的事情,一言不合就可能送达不了,因而要从算法层面来保证可靠性。

TCP 包头格式

我们先来看 TCP 头的格式。从这个图上可以看出,它比 UDP 复杂得多。
首先,源端口号和目标端口号是不可少的,这一点和 UDP 是一样的。如果没有这两个端口号。数据就不知道应该发给哪个应用。
接下来是包的序号。为什么要给包编号呢?当然是为了解决乱序的问题。不编好号怎么确认哪个应该先来,哪个应该后到呢。编号是为了解决乱序问题。既然是社会老司机,做事当然要稳重,一件件来,面临再复杂的情况,也临危不乱。
还应该有的就是确认序号。发出去的包应该有确认,要不然我怎么知道对方有没有收到呢?如果没有收到就应该重新发送,直到送达。这个可以解决不丢包的问题。作为老司机,做事当然要靠谱,答应了就要做到,暂时做不到也要有个回复。
TCP 是靠谱的协议,但是这不能说明它面临的网络环境好。从 IP 层面来讲,如果网络状况的确那么差,是没有任何可靠性保证的,而作为 IP 的上一层 TCP 也无能为力,唯一能做的就是更加努力,不断重传,通过各种算法保证。也就是说,对于 TCP 来讲,IP 层你丢不丢包,我管不着,但是我在我的层面上,会努力保证可靠性。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

TCP协议是网络传输中的重要协议,通过对TCP包头格式的解析,展现了TCP协议的复杂性和可靠性保证。TCP协议通过包序号、确认序号、状态位、窗口大小等机制,解决了乱序、丢包、连接维护、流量控制和拥塞控制等问题。文章以幽默的比喻和生动的描述,将TCP协议比喻为“社会老司机”,强调了TCP协议在面对恶劣网络环境时的稳重、靠谱和自我控制的特点。总之,TCP协议的复杂性源于其对网络环境的悲观认知,但通过各种算法和机制的努力,保证了数据传输的可靠性和稳定性。读者通过本文可以快速了解TCP协议的重要特点和工作原理,对网络传输有更深入的理解。文章通过幽默的比喻和生动的描述,将TCP协议的复杂性和可靠性保证展现得淋漓尽致。TCP协议通过包序号、确认序号、状态位、窗口大小等机制,解决了乱序、丢包、连接维护、流量控制和拥塞控制等问题。TCP协议的复杂性源于其对网络环境的悲观认知,但通过各种算法和机制的努力,保证了数据传输的可靠性和稳定性。通过本文,读者可以快速了解TCP协议的重要特点和工作原理,对网络传输有更深入的理解。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《趣谈网络协议》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(191)

  • 最新
  • 精选
  • code4j
    置顶
    老师您好,昨天阿里云出故障,恢复后,我们调用阿里云服务的时后出现了调用出异常 connection reset。netstat看了下这个ip发现都是timewait,链接不多,但是始终无法连接放对方的服务。按照今天的内容,难道是我的程序关闭主动关闭链接后没有发出最后的ack吗?之前都没有问题,很不解
    2018-06-28
    9
    58
  • 进阶的码农
    置顶
    状态机图里的不加粗虚线看不懂什么意思 麻烦老师点拨下

    作者回复: 其他非主流过程

    2018-06-11
    23
  • Lin
    旧书不厌百回读,熟读深思子自知啊。 再一次认识下TCP这位老司机,这可能是我读过的最好懂的讲TCP的文章了。同时有了一个很爽的触点,我发现但凡复杂点儿的东西,状态数据都复杂很多。还有一个,也是最重要的,我从TCP中再一次认识到了一个做人的道理,像孔子说的:“不怨天,不尤人”。人与人相处,主要是“我,你,我和你的关系”这三个处理对象,“你”这个我管不了,“我”的成长亦需要时间,我想到的是“我和你的关系”,这个状态的维护,如果能“无尤”,即不抱怨。有时候自己做多点儿,更靠谱点,那人和人的这个连接不是会更靠谱么?这可能是我从TCP这儿学到的最棒的东西了。 感谢老师的讲解,让我有了新的想法和收获。

    作者回复: 赞

    2018-09-23
    8
    132
  • 灯盖
    流量控制是照顾通信对象 拥塞控制是照顾通信环境

    作者回复: 这个总结好

    2019-05-13
    3
    123
  • krugle
    流量控制和拥塞控制什么区别

    作者回复: 一个是对另一端的,一个是针对网络的

    2018-08-17
    3
    116
  • monkay
    如果是建立链接了,数据传输过程链接断了,客户端和服务器端各自会是什么状态? 或者我可以这样理解么,所谓的链接根本是不存在的,双方握手之后,数据传输还是跟udp一样,只是tcp在维护顺序、流量之类的控制

    作者回复: 是的,连接就是两端的状态维护,中间过程没有所谓的连接,一旦传输失败,一端收到消息,才知道状态的变化

    2018-06-11
    5
    86
  • Adolph
    为什么要四次挥手 任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接。 举个例子:A 和 B 打电话,通话即将结束后,A 说“我没啥要说的了”,B回答“我知道了”,但是 B 可能还会有要说的话,A 不能要求 B 跟着自己的节奏结束通话,于是 B 可能又巴拉巴拉说了一通,最后 B 说“我说完了”,A 回答“知道了”,这样通话才算结束。

    作者回复: 是的

    2019-03-27
    6
    58
  • 麋鹿在泛舟
    多谢分享,精彩。扫除了我之前很多的疑问。tcp连接的断开比建立复杂一些,本质上是因为资源的申请(初始化)本身就比资源的释放简单,以c++为例,构造函数初始化对象很简单,而析构函数则要考虑所有资源安全有序的释放,tcp断连时序中除了断开这一重要动作,另外重要的潜台词是“我要断开连接了 你感觉把收尾工作做了”

    作者回复: 谢谢

    2018-06-11
    2
    46
  • 麋鹿在泛舟
    评论区不能互评,如下两个问题是我的看法,不对请指出 多谢 我们做一个基于tcp的“物联网”应用(中国移动网络),如上面所说tcp层面已经会自动重传数据了,业务层面上还有必要再重传吗?如果是的话,业务需要多久重传一次? --- TCP的重传是网络层面和粒度的,业务层面需要看具体业务,比如发送失败可能对端在重启,一个重启时间是1min,那就没有必要每秒都发送检测啊. 1、‘序号的起始序号随时间变化,...重复需要4个多小时’,老师这个重复时间怎么计算出来的呢?每4ms加1,如果有两个TCP链接都在这个4ms内建立,是不是就是相同的起始序列号呢。 答:序号的随时间变化,主要是为了区分同一个链接发送序号混淆的问题,两个链接的话,端口或者IP肯定都不一样了.2、报文最大生存时间(MSL)和IP协议的路由条数(TTL)什么关系呢,报文当前耗时怎么计算?TCP层有存储相应时间? 答:都和报文生存有关,前者是时间维度的概念,后者是经过路由跳数,不是时间单位.

    作者回复: 赞

    2018-06-14
    3
    42
  • 李小四
    网络_11 读完今天呢内容后,有一个强烈的感受:技术的细节非常生动。 之前对于TCP的感知就是简单的“三次握手”,“四次挥手”,觉得自己掌握了精髓,但随便一个问题就懵了,比如, - 客户端什么时候建立连接? > 根据以前的认知,会以为是“三次握手”后,双方同时建立连接。很显然是做不到的,客户端不知道“应答的应答”有没有到达,以及什么时候到达。。。 - 客户端什么时候断开连接? > 不仔细思考的话,就会说“四次挥手”之后喽,但事实上,客户端发出最后的应答(第四次“挥手”)后,永远无法知道有没有到达。于是有了2MSL的等待,在不确定的网络中,把问题最大程度地解决。 TCP的状态机,以及很多的设计细节,都是为了解决不稳定的网络问题,让我们看到了在无法改变不稳定的底层网络时,人类的智慧是如果建立一个基本可靠稳定的网络的。

    作者回复: 赞

    2019-08-07
    5
    27
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部