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

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

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

TCP 包头格式

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

全部留言(190)

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

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

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

    作者回复: 赞

    8
    129
  • 灯盖
    流量控制是照顾通信对象 拥塞控制是照顾通信环境

    作者回复: 这个总结好

    3
    117
  • krugle
    流量控制和拥塞控制什么区别

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

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

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

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

    作者回复: 是的

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

    作者回复: 谢谢

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

    作者回复: 赞

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

    作者回复: 赞

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