今天犯懒了,本来自己也做了一些相应的笔记,但是发现这篇写的更好一些,简单易懂,而且有图有真相,为了方便以后查看,在此转载了,在此基础上加了自己的笔记

     
          TCP正常建立和关闭的状态变化
        
                         
 
TCP连接的建立可以简单的称为“三次握手”,而连接的中止则可以叫做“四次握手”。
 
    建立连接
 
    在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送syn包到服务器,同时,当S标志位置1时,报文携带开始序号 j,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包,虽然是被动建立连接,但是同样要申请一个不同的开始序号 k,送往客户端,即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据,也就是ESTABLISHED状态。

结束连接 (连接终止协议)

TCP有一个特别的概念叫做half-close,这个概念是说,TCP的连接是全双工(可以同时发送和接收)连接,因此在关闭连接的时候,必须关闭传和送两个方向上的连接。客户机给服务器一个FIN为1 的TCP报文,然后服务器返回给客户端一个确认ACK报文,并且发送一个FIN报文,当客户机回复ACK报文后(四次握手),连接就结束了。然而,如果服务器返回给客户端一个确认ACK的报文之后,可以继续往客户端发送数据报,直到服务器应用程序发送完成之后,向客户端发送FIN报文,客户端向应用程序交付eof之后回复服务器ACK报文,完成四次握手。也就是说,它们之间进行数据的收发并不冲突,当客户端结束发送后,由于TCP连接没有完全断开,仍然是可以接收数据的。

TCP的半关闭如何实现:

如果应用程序不调用close而调用shutdown,且第2个参数值为1,则接口的API支持半关闭,然而,大多数的应用程序是通过调用close终止两个方向的连接。

连接建立的超时(第一次:5.5~6s  第二次:24s)

最大报文段长度(默认536字节,最终的IP数据报为:536+20+20=576字节):MSS会以建立连接的双方(含SYN字段)的最小MSS值传送报文段。但如果两端的MSS值比较大,但是中间有一段网络的MTU值很小,为了避免分片,只能采用路径上的MTU发现机制。

TCP状态变迁图
                   

这是一个看起来比较复杂的状态迁移图,因为它包含了两个部分---服务器的状态迁移和客户端的状态迁移,如果从某一个 角度出发来看这个图,就会清晰许多,这里面的服务器和客户端都不是绝对的,发送数据的就是客户端,接受数据的就是服务器。

客户端的状态可以用如下的流程来表示:

CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED

以上流程是在程序正常的情况下应该有的流程,从书中的图中可以看到,在建立连接时,当客户端收到SYN报文的ACK以后,客户端就打开了数据交互地 连接。而结束连接则通常是客户端主动结束的,客户端结束应用程序以后,需要经历FIN_WAIT_1,FIN_WAIT_2等状态,这些状态的迁移就是前 面提到的结束连接的四次握手。

服务器的状态可以用如下的流程来表示:

CLOSED->LISTEN->SYN收到 ->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED

在建立连接的时候,服务器端是在第三次握手之后才进入数据交互状态,而关闭连接则是在关闭连接的第二次握手以后(注意不是第四次)。而关闭以后还要 等待客户端给出最后的ACK包才能进入初始的状态。

其他状态迁移

书中的图还有一些其他的状态迁移,这些状态迁移针对服务器和客户端两方面的总结如下

1. LISTEN->SYN_SENT,对于这个解释就很简单了,服务器有时候也要打开连接的嘛。
2. SYN_SENT->SYN收到,服务器和客户端在SYN_SENT状态下如果收到SYN数据报,则都需要发送SYN的ACK数据报并把自己的状态 调整到SYN收到状态,准备进入ESTABLISHED
3. SYN_SENT->CLOSED,在发送超时的情况下,会返回到CLOSED状态。
4. SYN_收到->LISTEN,如果受到RST包,会返回到LISTEN状态。
5. SYN_收到->FIN_WAIT_1,这个迁移是说,可以不用到ESTABLISHED状态,而可以直接跳转到FIN_WAIT_1状态并等待关 闭。

2MSL等待状态

书中给的图里面,有一个TIME_WAIT等待状态,这个状态又叫做2MSL状态,说的是在TIME_WAIT2发送了最后一个ACK数据报以后, 要进入 TIME_WAIT状态,这个状态是防止最后一次握手的数据报没有传送到对方那里而准备的(注意这不是四次握手,这是第四次握手的保险状态)。这个状态在 很大程度上保证了双方都可以正常结束,但是,问题也来了。

由于插口的2MSL状态(插口是IP和端口对的意思,socket),使得应用程序在2MSL时间内是无法再次使用同一个插口的,对于客户程序还好 一些,但是对于服务程序,例如httpd,它总是要使用同一个端口来进行服务,而在 2MSL时间内,启动httpd就会出现错误(插口被使用)。为了避免这个错误,服务器给出了一个平静时间的概念,这是说在2MSL时间内,虽然可以重新 启动服务器,但是这个服务器还是要平静的等待2MSL时间的过去才能进行下一次连接。


FIN_WAIT_2状态

这就是著名的半关闭的状态了,这是在关闭连接时,客户端和服务器两次握手之后的状态。在这个状态下,应用程序还有接受数据的能力,但是已经无法发送 数据,但是也有一种可能是,客户端一直处于FIN_WAIT_2状态,而服务器则一直处于WAIT_CLOSE状态,而直到应用层来决定关闭这个状态。

RST,同时打开和同时关闭

RST是另一种关闭连接的方式,应用程序应该可以判断RST包的真实性,即是否为异常中止。而同时打开和同时关闭则是两种特殊的TCP状态,发生的 概率很小。

转载地址:http://www.cnblogs.com/ggjucheng/p/3348492.html

转载于:https://www.cnblogs.com/webber1992/p/5850765.html

TCP/IP状态详解相关推荐

  1. TCP/IP协议详解、TCP三次握手

    TCP/IP协议详解:TCP/IP协议详解_王佳斌-CSDN博客_tcp/ip协议认识HTTP协议它是互联网协议(Internet Protocol Suite),一个网络通信模型,是互联网的一个基本 ...

  2. 《TCP IP协议 详解》思考总结 · 三

    前言 这一篇文章主要围绕了IP协议,ICMP协议和UDP协议展开,希望可以在这里大概做一个总结,将<TCP/IP协议详解 卷一>书中TCP相关章节前面的内容做一个结束,在下一篇文章专心的去 ...

  3. TCP/IP协议详解卷一:Chapter21 笔记

    TCP/IP协议详解卷一:Chapter21 笔记 Chapter 21 TCP的超时与重传 21.3 往返时间测量 21.5 拥塞举例 21.6 拥塞避免算法 21.7 快速重传与快速恢复算法 21 ...

  4. TCP /IP协议详解【转】

    转自:https://www.jianshu.com/p/0cf648510bce?utm_campaign=maleskine&utm_content=note&utm_medium ...

  5. TCP/IP协议详解---概述

    工作之后,才发现以前在学校里学的东西忘得太快太干净了,现在需要一点点地捡起来了,要不然写几行程序会闹很多笑话会出现很多bug的.从今天开始,翻一翻<TCP/IP协议详解 卷1>这本书,希望 ...

  6. 04 TCP/IP协议详解

    目录 章节目标 4.1 概述 1.为什么会有TCP/IP协议 2.介绍 4.2 TCP/IP协议族 4.2.1 TCP/IP协议栈 1.协议的分层 2. 主机与主机之间通信的三要素 3.应用层 4.传 ...

  7. 【网络基础】TCP/IP协议详解

    TCP/IP协议定义 TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是在多个不同网络间实现信息传输的通信协议.是 ...

  8. iOS中 HTTP/Socket/TCP/IP通信协议详解 韩俊强的博客

    版权声明:本文为博主原创文章,未经博主允许不得转载. 每日更新关注:http://weibo.com/hanjunqiang  新浪微博 简单介绍: [objc] view plaincopy //  ...

  9. TCP/IP协议详解 卷一(阅读指导)

    1. 为了利用网络知识理解服务端网络架构.排查问题.解决问题. 真的没有必要背, wireshark 工具都给你解析的不能再细了.有没有重传,有没有乱序,数据包接收的时间,发送窗口多大,数据有没有拥塞 ...

最新文章

  1. 多媒体开发之--- live555 vs2010/vs2013下编译,使用,测试
  2. python简单代码画曲线图教程-Python绘制折线图和散点图的详细方法介绍(代码示例)...
  3. 如何制作印章_电子公章怎么制作
  4. synchronized同步方法
  5. c语言中系统函数设定像素,在imag中对每个像素应用自定义函数的快速方法
  6. 开源SUP对接API卡盟程序卡信乐v2.0源码
  7. 从MySql 数据库中导出数据并生成指定格式xml文件
  8. IT职场人生系列之二十:危险职业(续1)
  9. 博文视点大讲堂20期:Windows 7来了——知道你所不知道的Windows 7
  10. layey图片内容不居中
  11. 【转载】使用微博API接口获取数据
  12. 通过DXGI实现高效抓屏
  13. convert bitset descriptor - cv::Mat
  14. JAVA高并发多线程必须懂的50个问题
  15. http 404强制跳转到指定的网页地址
  16. windows 2008 r2或win7安装SP1补丁,安装sqlserver 2012
  17. Vue是什么?在前端学习中有什么作用呢?
  18. [other]毕业一年同学聚会
  19. 靶机渗透练习52-KB-VULN-FINAL
  20. google velvet_LG Velvet 5G值得推出新的设计方向

热门文章

  1. Mac 10.12安装粘贴板增加工具ClipMenu
  2. 【Mybatis框架】输出映射-resultType与resultMap
  3. UVA 1366 Martian Mining DP
  4. nagios配置文档
  5. 基于OS信号实现Java异步通知
  6. Android微信智能心跳方案 Android微信智能心跳方案
  7. 安装配置mysql-proxy
  8. 路由及路由器工作原理深入解析3:路由与port
  9. 如何将本地数据库迁移到数据库上?
  10. django 自定义日志配置