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

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

    
     10
  • Colin.Tao
    2018-09-23
    旧书不厌百回读,熟读深思子自知啊。

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

    感谢老师的讲解,让我有了新的想法和收获。
    展开

    作者回复: 赞

     2
     49
  • krugle
    2018-08-17
    流量控制和拥塞控制什么区别

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

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

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

     1
     45
  • Jerry银银
    2019-05-17
    看了大家的留言,很有感触,对于同一个技术点,技术的原理是一样的,可是每个人都有自己的理解,和自己独有的知识关联,因为每个人过往所积累的知识体系有所不同。

    我对TCP,甚至整个网络知识,喜欢用「信息论」中的一些理论去推演它们。我觉得在现在和未来的时代,「信息论」是一把利器。

    信息论中,有个很重要的思想:要想消除信息的不确定性,就得引入信息。将这个思想应用到TCP中,很容易理解TCP的三次握手和四次挥手的必要性:它们的存在以及复杂度,就是为了消除不确定性,这里我们叫「不可靠性」吧。拿三次握手举例:
    为了描述方便,将通信的两端用字母A和B替代。A要往B发数据,A要确定两件事:
    1. B在“那儿”,并且能接受数据 —— B确实存在,并且是个“活人”,能听得见
    2. B能回应 —— B能发数据,能说话
    为了消除这两个不确定性,所以必须有前两次握手,即A发送了数据,B收到了,并且能回应——“ACK”

    同样的,对于B来说,它也要消除以上两个不确定性,通过前两次握手,B知道了A能说,但是不能确定A能听,这就是第三次握手的必要性。

    当然你可能会问,增加第四次握手有没有必要?从信息论的角度来说,已经不需要了,因为它的增加也无法再提高「确定性」
    展开
     3
     43
  • Adolph
    2019-03-27
    为什么要三次握手
    三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。

    第一次握手:Client 什么都不能确认;Server 确认了对方发送正常

    第二次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己接收正常,对方发送正常

    第三次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己发送、接收正常,对方发送接收正常

    所以三次握手就能确认双发收发功能都正常,缺一不可。
    展开
    
     27
  • Ender0224
    2018-06-11
    多谢分享,精彩。扫除了我之前很多的疑问。tcp连接的断开比建立复杂一些,本质上是因为资源的申请(初始化)本身就比资源的释放简单,以c++为例,构造函数初始化对象很简单,而析构函数则要考虑所有资源安全有序的释放,tcp断连时序中除了断开这一重要动作,另外重要的潜台词是“我要断开连接了 你感觉把收尾工作做了”

    作者回复: 谢谢

    
     25
  • Ender0224
    2018-06-14
    评论区不能互评,如下两个问题是我的看法,不对请指出 多谢


    我们做一个基于tcp的“物联网”应用(中国移动网络),如上面所说tcp层面已经会自动重传数据了,业务层面上还有必要再重传吗?如果是的话,业务需要多久重传一次?

    --- TCP的重传是网络层面和粒度的,业务层面需要看具体业务,比如发送失败可能对端在重启,一个重启时间是1min,那就没有必要每秒都发送检测啊.

    1、‘序号的起始序号随时间变化,...重复需要4个多小时’,老师这个重复时间怎么计算出来的呢?每4ms加1,如果有两个TCP链接都在这个4ms内建立,是不是就是相同的起始序列号呢。
    答:序号的随时间变化,主要是为了区分同一个链接发送序号混淆的问题,两个链接的话,端口或者IP肯定都不一样了.2、报文最大生存时间(MSL)和IP协议的路由条数(TTL)什么关系呢,报文当前耗时怎么计算?TCP层有存储相应时间?
    答:都和报文生存有关,前者是时间维度的概念,后者是经过路由跳数,不是时间单位.
    展开

    作者回复: 赞

    
     21
  • 小田
    2018-06-12
    人大了,就变得礼貌,优雅而警觉
    
     20
  • 零一
    2018-06-11
    可以用 netstat 或者 lsof 命令 grep 一下 establish listen close_wait 等这些查看
    
     16
  • eason2017
    2018-07-04
    老师好,我看书中说是计数器每4微妙就加1的。

    作者回复: 赞

    
     15
  • Adolph
    2019-03-27
    为什么要四次挥手
    任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接。

    举个例子:A 和 B 打电话,通话即将结束后,A 说“我没啥要说的了”,B回答“我知道了”,但是 B 可能还会有要说的话,A 不能要求 B 跟着自己的节奏结束通话,于是 B 可能又巴拉巴拉说了一通,最后 B 说“我说完了”,A 回答“知道了”,这样通话才算结束。

    作者回复: 是的

    
     11
  • 天天
    2019-05-13
    流量控制是照顾通信对象
    拥塞控制是照顾通信环境

    作者回复: 这个总结好

    
     10
  • hquery
    2018-07-24
    敲黑板,这是面试重点
     1
     10
  • HunterYuan
    2018-07-14
    老师回答,@正是那朵玫瑰的第一个问题,感觉稍微有点问题,我理解,不是每次数据交互的会发ack,有些ack是可以合并的,用于减少数据包量,通过wirshark抓包,也证实了。理由是,因为ack号是表示已收到的数据量,也就是说,它是告诉发送方目前已接收的数据的最后一个位置在哪里,因此当需要连续发送ack时,只要发送最后一个ack号就可以了,中间的可以全部省略。同样的机制还有ack号通知和窗口更新通知合并。这是我的理解,若有问题,希望老师多多指教。谢谢
    
     8
  • babos
    2018-07-02
    四次挥手是不是可以做成三次,把第二步和第三步的ACK和FIN一起发

    ———————
    因为b可能还有一些事情没做完,需要做完了才能结束
     1
     8
  • 姜戈
    2018-06-11
    Tcp三次握手设计被恶意利用 ,造就了ddos。

    作者回复: 是有连接攻击的

    
     8
  • 正是那朵玫瑰
    2018-06-12
    老师有几个疑问:
    1、当三次握手建立连接后,每次数据交互都还会ack吗?比如建立连接后,客户端发送数据包给服务器端,服务器成功收到数据包后会发送ack给客户端么?
    2、如果建立连接后,客户端和服务器端没有任何数据交互,双方也不主动关闭连接,理论上这个连接会一直存在么?
    3、2基础上,如果连接一直会在,双方又没有任何数据交互,若一方突然跑路了,另一方怎么知道对方已经不在了呢?在java scoket编程中,我开发客户端与服务器端代码,双方建立连接后,不发送任何数据,当我强制关闭一端时,另一端会收到一个强制关闭异常,这是如何知道对方已经强制关闭了呢?

    作者回复: 是的,每次都ack。可以有keepalive,如果不交互,两边都不像释放,那就数据结构一直占用内存,对网络没啥影响。必须是发送数据的时候,才知道跑路的事情。你所谓的强制关是怎么关?有可能还是发送了fin的

    
     7
  • 走过全世界。
    2019-06-03
    三次握手连接就是:
    A:你瞅啥
    B:瞅你咋地
    A:再瞅一个试试
    然后就可以开始亲密友好互动了😏

    作者回复: 哈哈哈

     1
     6
我们在线,来聊聊吧