1.TCP建立连接,三次握手

建立的TCP连接可靠的连接,必须经过三次握手建立连接才能正式通信彼此传输数数据。

客户端请求服务端建立连接

第一次握手:客户给服务发送一个请求报文SYN, 客户端的状态置SYN_SENT状态

第二次握手:服务端在收到客户端发过来的SYN请求报文后,开始给客户端发送ACK报文和SYN报文,状态置为SYN_RECE

第三次握手:客户端口收到服务端口过来的SYN报文和ACK报文后,状态由原来的SYN_SENT状态变为ESTABLISHED;并且给服务发送一个ACK报文告知对方已经送到服务端发送的SYN报文,服务端收到报文后,由原来的SYN_RECE变为ESTABLISHED

至此客户到服务端,服务端到客户端的双向连接建立好了并且处理ESTABLISHED。双方可以进行数据交换了。

2.TCP断开连接,四次挥手。

当客户端把所有数据传送完毕的时候,给服务端口送一个FIN报文,告知服务端:我这边没有数据可传,希望关闭客户端到服务端方向的连接。之后其状态由原来的

ESTABLISHED 变为FIN_WAIT_1,;

服务端收到客户的FIN报文后,送一个ACK报文给客户端,告知“我服务端知道你客户端口已经没有数据可传,但是我这边什么关闭连接,还需要等我的数据传完;如果我这里数据也传送完了,我也会给发送一个FIN报文。”。此时服务端发送ACK报文后,状态由之前的ESTABLISHED 变为CLOSE_WAIT

客户端端收到服务的ACK报文,将FIN_WAIT_1置FIN_WAIT_2,同时,继续等来的服务发送FIN报文。

当服务端数据传送也完毕的后,开始给客户端发送FIN包,发送FIN包后,其状态CLOSE_WAIT置为LAST_ACK

客户端口收到了服务的发过来的FIN包后,又给服务端发送ACK。发送ACK后,状态由原来的FIN_WAIT_2置为TIME_WAIT,客户在经过2MSL 时间进入CLOSE状态

服务端口收到客户端发送的ACK后,由LAST_ACK也进入CLOSE

3.TCP迁移状态:

LISTEN:服务端已经启动一个socket,其状态处于监听状态,等待客户发起请求连接。

ESTABLISHED:客户端和服务端经过三次握手建立,两个方向上连接状态都建立,状态置为ESTABLISHED

客户端状态变迁:(主动端)

FIN_WAIT_1: 发送FIN给服务端口。

FIN_WAIT_2:收到服务端的ACK报文

TIME_WAIT :收到服务端发过来的FIN报文,发送ACK报文给服务端口。主动关闭连接端,接收到服务(TIME_WAIT是主动端关闭)之后进入2MSL时间的等待

CLOSE:2MSl过后,关闭进入初始化状态。

服务端状态变迁:(服务端)

CLOSE_WAIT:收到客户端FIN报文,给客户端发送ACK状态后,表示知道客户端要关闭连接请求,服务端可能数据还没有传送完,所以处于等

等待关闭状态。(CLOSE_WAIT是被动端关闭)

LAST_ACK:服务端数据传输完毕,发送FIN报文给客户端,同时等待客户端发ACK报文状态

CLOSE:收到客户端ACK报文后,进入初始化状态

连接是双方建立的。发送数据的端客户也转变为接受数据的服务端口,服务端和客户角色是相互转换的

4.MSL时间:

MSL就是maximum segment lifetime(最大分节生命期),这是一个IP数据包能在互联网上生存的最长时间,超过这个时间IP数据包将在网络中消失 。MSL在RFC 1122上建议是2分钟,而源自berkeley的TCP实现传统上使用30秒

TIME_WAIT状态维持时间

TIME_WAIT状态维持时间是两个MSL时间长度,也就是在1-4分钟。Windows操作系统就是4分钟。

5.用于统计当前各种状态的连接的数量的命令

#netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

返回结果如下:

LAST_ACK 14

SYN_RECV 348

ESTABLISHED 70

FIN_WAIT1 229

FIN_WAIT2 30

CLOSING 33

TIME_WAIT 18122

学习参考资料 TIME_WAIT状态原理分析:http://elf8848.iteye.com/blog/1739571

学习参考资料 TIME_WAIT状态过多解决方法:http://blog.sina.com.cn/s/blog_8e5d24890102w9yi.html

TCP三次握手连接和TCP四次挥手及大量TIME_WAIT解决方法:的更多相关文章

  1. TCP三次握手,数据传输,四次挥手

    TCP包结构 一个TCP包结构如下: 一个TCP包主要由TCP包头和数据部分组成,包头固定部分为20字节,选项和数据部分根据实际情况设置为4N(N可以为0)字节. 1.16bit源端口和目的端口号,它 ...

  2. iOS 开发:TCP三次握手连接

    在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次握 ...

  3. TCP三次握手连接

    在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次握 ...

  4. TCP ,UDP概念和TCP三次握手连接 的知识点总结

    OSI 计算机网络7层模型 TCP/IP四层网络模型 传输层提供应用间的逻辑通信(端到端),网络层提供的是主机到主机的通信,传输层提供的是可靠服务. TCP 中常说的握手指的是:连接的定义和连接的建立 ...

  5. 详解TCP三次握手(建立TCP连接过程)

    在讲述TCP三次握手,即建立TCP连接的过程之前,需要先介绍一下TCP协议的包结构. 这里只对涉及到三次握手过程的字段做解释 (1) 序号(Sequence number) 我们通过 TCP 协议将数 ...

  6. TCP三次握手连接与四次握手断开

    http://blog.csdn.net/whuslei/article/details/6667471(三次握手与四次握手) 1. TCP的三次握手最主要是防止已过期的连接再次传到被连接的主机. 如 ...

  7. Python--day30--tcp协议(建立链接三次握手,断掉链接四次挥手)和UDP协议

    TCP协议: tcp是可靠的,面向连接的.建立全双工通信. 建立链接的三次握手 链接一旦建立一定是全双工工通信,必然是双方通信. UDP协议: TCP协议和UDP协议的对比: QQ使用的是UDP,因为 ...

  8. Linux网络编程一、tcp三次握手,四次挥手

    一.TCP报文格式 (图片来源网络) SYN:请求建立连接标志位 ACK:应答标志位 FIN:断开连接标志位 二.三次握手,数据传输,四次挥手 (流程图,图片来源于网络) (tcp状态转换图,图片来源 ...

  9. TCP三次握手及TCP连接状态 TCP报文首部格式

    建立TCP连接时的TCP三次握手和断开TCP连接时的4次挥手整体过程如下图: 开个玩笑 ACK: TCP协议规定,只有ACK=1时有效,连接建立后所有发送的报文ACK必须为1 SYN(SYNchron ...

随机推荐

  1. ubuntu16.04下安装docker

    原文地址:传送门 本文开发环境为Ubuntu 16.04 LTS 64位系统,通过apt的docker官方源安装最新的Docker CE(Community Edition),即Docker社区版,是 ...

  2. 熟悉并了解uml的使用(一)

    本资料对UML各种模型图的构成和功能进行说明,通过本资料的学习达到可以读懂UML模型图的目的.本资料不涉及模型图作成的要点等相关知识. UML简介 UML (Unified Modeling Lang ...

  3. http中使用json封装数据的性能测试

    http中使用json封装数据的性能测试     一个项目使用json封装数据,接口例如:   客户端发送:   POST /list.do HTTP/1.1   Host: zoomi.com.cn ...

  4. 微软企业库5.0 学习之路——第七步、Cryptographer加密模块简单分析、自定义加密接口及使用—下篇

    在上一篇文章中, 我介绍了企业库Cryptographer模块的一些重要类,同时介绍了企业库Cryptographer模块为我们提供的扩展接口,今天我就要根据这些 接口来进行扩展开发,实现2个加密解密 ...

  5. logrotate日志轮转

    1)基本介绍 适合应用服务日志,系统日志按天切割 如果没有日志轮转,日志文件会越来越大 将丢弃系统中最旧的日志文件,以节省空间 logrotate本身不是系统守护进程,它是通过计划任务crond每天执 ...

  6. magento批量上传产品

    Step1:表格仔细检查无误后,将准备好的图片上传至 media/import中.如果使用专用的图片服务器,把图片上传到服务器上,当然表格中的图片地址要做相应的修改. Step2:然后,登陆Magen ...

  7. python3连接使用sqlite3

    一直比较喜欢sqlite,业余爱好不需要大型数据库,原来在windows下最常用的就是access,使用很方便,但是linux下没法用,后 来从php+sqlite2开始使用,编程时间很少,代码量很小 ...

  8. POJ 2253 Frogger【最短路变形/最小生成树的最大权/最小瓶颈树/A到B多条路径中的最小的最长边】

    Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fiona Frog who is sit ...

  9. Linux命令之chgrp

    chgrp [选项] … GROUP FILE … chgrp [选项] … --reference=RFILE FILE … chgrp命令是用来改变文件的组所有权.将改变每一个FILE的所属组为G ...

  10. Python开发基础-Day19继承组合应用、对象序列化和反序列化,选课系统综合示例

    继承+组合应用示例 class Date: #定义时间类,包含姓名.年.月.日,用于返回生日 def __init__(self,name,year,mon,day): self.name = nam ...