关于TCP连接建立与终止那点事
0. 前言
最近在处理公司遗留项目的时候发现自己对TCP协议一点都不懂,所以补了点关于TCP连接的建立和终止的内容,这里简单写下自己了解的部分,省略了报文序号确认序号这些无关的字段,主要讨论TCP状态的转换以及Linux下的一些问题。
对于这篇文章来说,主要是记录自己遇到的一些问题以及学习到的一些东西。
关于TCP/IP协议,这里推荐一本书:《TCP/IP协议详解:卷1》
1. TCP连接的建立
学过计算机网络的都知道TCP连接的建立需要三次握手,当时在大学也这么听着,但是具体怎么三次还是最近补了才知道这么回事。
对于客户端/服务器模型来说:
1. 首先客户端发起连接(发送SYN报文,进入SYN_SENT状态)
2. 服务器接收到SYN,然后响应(发送SYN ACK,进入SYN_RCVD状态,注意这个时候连接并没有建立)
3. 客户端接受到后,发送确认报文(发送ACK,进入Established状态)
4. 服务器收到后才进入链路建立(Established)状态。
如下图(图为百度搜出来的)

2. TCP连接的终止
对于TCP连接的终止来说,却需要四次挥手来完成,这里以客户/服务器模型,客户端主动发起关闭来说明(这里服务器也可以发起主动发起关闭)。
1. 客户端发送FIN(进入FIN_WAIT_1状态)
2. 服务器接收到FIN后对发送ACK确认(此时服务器进入CLOSE_WAIT状态,客户端接受到该ACK后由FIN_WAIT_1 转为FIN_WAIT_2状态)
3. 服务器调用close发送FIN(进入LASK_ACK状态)
4. 客户端接收到服务器发送的FIN后发送ACK(进入TIME_WAIT状态)
5. 服务器接收到后结束(LASK_ACK状态转为虚拟的CLOSED,即已经没有状态了)
如下图所示:

3. TCP状态转换
其实如果看懂了上面连接的建立以及终止的话,很容易就可以看懂下面的状态转换图,上面两个就可以看做由它拆解出来的。

4. 遇到CLOSE_WAIT状态的一些情况
前面说了,最近在维护一些历史遗留的项目,那代码简直是叼炸天了,直接使用两个进程共用一个select,在accept前加上文件锁,select只监听服务器端fd,其它fd不监听....(此处省略一千字),然后现在出现了大量的CLOSE_WAIT状态,我在想难道以前就没出现过?奇葩。不过被DDoS攻击有些也会出现这种现象。最后讨论了一下午说怎么样才能少改动原来的代码....最后老大拍板,重写select部分~^~,使用epoll实现。
上面的状态图可以看出,服务器由于接收到客户端发来的FIN,会进入CLOSE_WAIT,如果此时没有监听该客户端fd并且没有调用close,那么这时会导致占用的FD没有被释放,资源就这么被泄漏掉了,这样也会导致存在大量的CLOSE_WAIT状态,以至于后续FD消耗完了的时候(一般系统默认1024),accept就会失败。(注:这里CLOSE_WAIT状态是由于应用程序没有调用close导致的,系统不会释放该资源,即会一直存在)
(注:即使accept失败,但是对于链路来说,还是能建立成功的,因为对于Linux TCP底层实现来说,存在两个队列,一个为半链路队列,另一个为三次握手成功但是没有被服务器accept取走的链接的队列。)
后续对于Linux下的服务器来说一般都是使用epoll来处理,效率比select高。
5. 补充
这里看到一些博客说通过设置系统参数来改变CLOSE_WAIT的维持等待时间,我查阅了一下,并且也尝试过(其实不用试)。不能够通过设置系统参数来更改的,因为这时应用程序内部导致的,,而且根本就不存在说CLOSE_WAIT维持时间一说,该状态只有应用程序调用close才会转为其它状态(或者关闭应用程序),这里说通过修改系统参数一般指的时TIME_WAIT状态的维持时间。
关于TCP连接建立与终止那点事的更多相关文章
- 动手学习TCP:TCP连接建立与终止
TCP是一个面向连接的协议,任何一方在发送数据之前,都必须先在双方之间建立一条连接.所以,本文就主要看看TCP连接的建立和终止. 在开始介绍TCP连接之前,先来看看TCP数据包的首部,首部里面有很多重 ...
- TCP连接建立和终止小结
TCP连接建立(三次握手) 如图: 请求端发送一个SYN到服务器的相应端口,以及初始序号ISN 服务器发送包含服务器的初始序号的SYN作为应答,同时确认序号设置为客户的ISN+1 客户将确认序号设置为 ...
- TCP连接建立与终止,及状态转换
TCP连接建立 三路握手 三路握手发生在客户端发起connect请求到服务端accept返回中,在三路握手发生前,服务端必须准备好接受外来连接,这通常通过服务端调用 (socket.bind.list ...
- 传输控制协议(TCP) -- 连接建立及终止过程
TCP简介 相对于不可靠.无连接的用户数据报协议(User Datagram Protocol, UDP),传输控制协议(Transmission Control Protocol, TCP)是可靠的 ...
- TCP连接建立和关闭中的疑难点
TCP连接建立和关闭中的疑难点 作者:夏语岚 撰写日期:2011-10-29 近日在阅读<Unix网络编程>,以前在<计算机网络>课程中学到TCP,当时只是简单了解了TC ...
- TCP连接建立与关闭
http://hi.baidu.com/psorqkxcsfbbghd/item/70f3bd91943b9248f14215cd TCP连接建立与关闭 TCP 是一个面向连接的协议,无论哪一方向另一 ...
- 计算机网络传输层之TCP协议(tcp协议特点、tcp报文段首部格式、tcp连接建立---三次握手、tcp连接释放---四次握手)
文章转自:https://blog.csdn.net/weixin_43914604/article/details/105516090 学习课程:<2019王道考研计算机网络> 学习目的 ...
- 《TCP/IP详解 卷一》读书笔记-----TCP连接建立
1.在每个TCP报文段中,头部的flag字段里的SYN,FIN,RST,PSH可以多个有效,并没有限定为必须只有一个 2.TCP连接建立过程: 1)客户端发送一个SYN报文段,其中包含了客户端要传送的 ...
- TCP 连接建立和断开,以及状态转换
1. TCP报文结构 TCP是一种可靠.面向连接.全双工的传输层协议,其报文格式如下所示: 源端口.目的端口:16位长.标识出远端和本地的端口号. 顺序号:32位长.表明了发送的数据 ...
随机推荐
- Java经典实例:使用DateFormatter来格式化日期时间
Java版本:1.8开始 import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; ...
- css 属性选择器
css2的属性选择器 1.[class~="flower"]:选中有flower的class class="flower ss" class="ss ...
- JAVASCRIPT中经典面试题
//1.try catch finally中的return var n=1; function fun(){ try{ n++; m++;//报错 return n; }catch(err){ n++ ...
- CSS常见兼容性问题
DOCTYPE 影响 CSS 处理 Firefox: div 设置 margin-left, margin-right 为 auto 时已经居中, IE 不行 Firefox: body 设置 tex ...
- swift学习笔记之-泛型
//泛型(Generics) import UIKit /*泛型(Generics):泛型代码可以让你编写适用自定义需求以及任意类型的灵活可重用的函数和类型.它的可以让你避免重复的代码,用一种清晰和抽 ...
- SharePoint 2013 开发文档管理字段小记
前言 最近有这样一个需求,就是要求在列表库里管理文档,需要多文档管理.带版本控制.可以单独授权等基本操作.于是乎,就开发了一个自定义段,这里介绍一下字段的思路,里面有一些遇到的问题,在群友的帮助下已解 ...
- [javascript svg fill stroke stroke-width points polyline 属性讲解] svg fill stroke stroke-width points polyline 绘制折线属性讲解
<!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title ...
- 你真的了解UITextField吗?
一:首先查看一下关于UITextField的定义 NS_CLASS_AVAILABLE_IOS(2_0) @interface UITextField : UIControl <UITextIn ...
- 【代码笔记】iOS-改变导航条标题的颜色为红色
一,效果图. 二,代码. RootViewController.m - (void)viewDidLoad { [super viewDidLoad]; // Do any additional se ...
- XML解析之DOM详解及与SAX解析方法的比较
XML解析(DOM) XML文件解析方法介绍 我们所用到的NSXMLParser是采用SAX方法解析 SAX(Simple API for XML) 只能读,不能修改,只能顺序访问,适合解析大型XML ...