tcp详解 netstat理解

为了深入理解TCP协议, 我们需要了解TCP客户端/服务端的状态转移和正确性保持. 建议阅读Unix网络编程卷1第二章和第三章, 原书笔记

第二章的状态转移图


注:上图红框表示比较特殊的地方。


TCP状态转移图

上图中/符号左侧为收到的消息或发生的事件,/符号右侧表示响应的消息。比如SYN-RCVD左侧箭头上的"超时/RST"表示超时后会发送RST。



..后续看原文

第58行指明了当第三次握手失败时的处理操作,可以看出当失败时服务器并不会重传ack报文,而是直接发送RTS报文段,进入CLOSED状态。这样做的目的是为了防止SYN洪泛攻击。

书中提到的TCP问题

  1. 连接的建立和终止(握手) 2.6.1
  2. SYN的TCP选项 2.6.2
  3. 状态转换中的同时开启与同时关闭 第18章
  4. TIME_WAIT状态 2.7
    • 为什么该状态会持续2MSL.

      1. 可靠地实现TCP全双工连接的终止.
        • 如果最终的ACK丢失, 客户端可能要重传那个ACK
      2. 保证旧连接的重复分节在网络中消失.
        • TIME_WAIT状态的端口不可以建立新连接, 只有等该状态结束, 方可在原端口建立新连接
        • "TIME_WAIT状态的持续时间是MSL的2倍, 这足以让某个方向上的分组最多存活MSL秒即备丢弃, 另一个方向上的应答最多存活MSL秒也被丢弃". 我的理解是, 客户端收到FIN进入TIME_WAIT时, 服务端可能已经在此之前发过若干个"迷路了"的FIN, 还徘徊在网路中. MSL后, 这些FIN要么已经到达,要么则消逝了. 假如在MSL前收到了这批FIN, 则TIME_WAIT状态下的客户端自然要回复一批ACK. 这批ACK最多经过MSL时间会全部消逝.

        有人会说, 这只能确保在FIN出现迷路的场景下, 保证客户端收到的第一个FIN之前的那些迷路的FIN, 以及那些迷路FIN对应的ACK能在2MSL内消逝. 如果说FIN能正确送达,而ACK丢失, 那处于LAST_ACK状态的服务端就会不断重发FIN, 即使客户端到达了2MSL, 仍然可能有FIN在发送中
        针对这点, 文章开头的参考链接"若LAST_ACK一直收不到ACK怎么办"做了解释, 服务端发出FIN时, 客户端可能已经进入CLOSED状态, 于是回复一个RST, 强制关闭连接.
        我认为, 该文答案没有提到另一个例外, 就是客户端可能在TIME_WAIT状态结束后, 马上原地又建立了连接, 发送SYN, 进入SYN-SENT状态, 这时候, 如果服务端没收到SYN, 则客户端超时关闭socket; 如果收到了SYN, 则服务端正处于LAST_ACK状态. 我在状态转换图中没有看到当LAST_ACK收到SYN时会做什么行为, 有可能会返回RST(则客户端关闭socket), 或不返回任何报文(则客户端超时关闭socket). 这样的话, 都能保证客户端关闭socket.

    • 为什么主动关闭端会处于TIME_WAIT. 因为主动关闭端可能需要重传最后的ACK.

  5. accept前连接终止 5.11
  6. 第4章 建议看原书笔记
    • 4.3 connect三种出错返回情况(超时、拒绝、不可达), RST的产生条件
    • 4.5 listen
      • 未完成连接队列(SYN_RCVD)+完成连接队列(ESTABLISHED)之和不超过backlog
      • SYN到达时,如果队列已满,TCP忽略该SYN分节. 忽略而不是发送RST的原因是希望客户端通过重传来再次尝试连接,这样服务器在有空闲队列后可以接受该连接。
      • 未完成的连接在超时未收到ACK后会被移除,一般取RTT大小,TCPv3指出该值为185ms
      • 在三路握手完成后,但在服务器调用accept 之前到达的数据应由服务器TCP排队,最大数据量为相应已连接套接字的接收缓存区大小
    • SYN泛洪 通过发送大量带有随机ip的SYN,充斥半连接队列,使得真正的SYN无法访问,造成denial of service。大量电脑分布式发动攻击可造成DDOS。
      • 解决方法:1. 降低SYN timeout 2. 设置SYN cookie防止重复ip攻击。感觉还是很难解决来自随机有效ip的攻击,具体做法还是专业人士来解决吧
  7. 第五章
    • 5.7 展示了程序正常终止时连接的关闭方式。close会将socket的fd引用数减1,程序终止时也会关闭所有fd。当客户端socket的fd引用数为0时,内核会自动发送FIN, 并转换状态FIN_WAIT_1, 接到ACK后变为FIN_WAIT_2。
    • 5.11 返回连接前终止。 Berkeley会在收到RST错误后自动从全连接队列里将socket去除,而大多数实现会让accept返回一个错误。
    • 5.12 服务端进程终止。 客户端阻塞在某个特定源的输入
    • 5.14 客户端收到服务器发送的RST后,客户端继续读写会导致"Broken pipe"
  • 6.4 利用select/poll修正客户端程序,写/读事件触发的条件
  • 6.6 close与shutdown

常见TCP问题

  • TIME_WAIT过多的原因和解决
    • 原因: 大量高并发地发起短连接, 导致大量连接开启后没发什么信息就关闭
    • 解决: 客户端方面, 尽量转为长连接. 服务端方面, 应尽量让客户端来断开连接, 这样服务端能尽快进入CLOSED状态.

netstat检测TCP连接情况

通过netstat -a可以查看各个端口的连接状态, 如果是netstat -at则可以检测TCP连接.

recv-Q与send-Q含义

https://www.cnblogs.com/leezhxing/p/5329786.html
Use of Recv-Q and Send-Q

Recv-Q
Established: The count of bytes not copied by the user program connected to this socket.
Listening: Since Kernel 2.6.18 this column contains the current syn backlog.

Send-Q
Established: The count of bytes not acknowledged by the remote host.
Listening: Since Kernel 2.6.18 this column contains the maximum size of the syn backlog.

Recv-Q
Established状态下表示某socket没被用户程序接收的数据
Send-Q
Established状态下表示某socket没被远程主机ACK的数据

一些理解

如果是半连接队列中超时的连接,会由服务器关闭并发送RST。如果是由于队列满无法接受的连接,会直接抛弃(不必发送RST,以便客户端重传机制再连接)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354