tcp状态介绍和解释

转眼间,从事服务器后台开发,已经快三年了,最近想多总结些东西,先从最基本的开始写起吧!

在公司经历了两个框架的开发和重构,其中一个点,就是把服务器内部通信的机制,从UDP转为TCP。

先讲下TCP的基本应用,还有其中的各个状态的情况。

以下的TCP的状态流程图:

 tcp建立连接,涉及的函数,主要有:

服务端:socket bind listen  accept read write close

客户端:socket connect write read close

其中,状态的变化主要有:

syn_sent  syn_rcvd  established  fin_wait_1 fin_wait_2 close_wait time_wait last_ack

close 等各种状态。

tcp的建立和释放,简单说,就是三次握手和四次释放。

三次握手的过程如下:

1. 服务器调用socket,bind,listen,完成被动打开的过程,进入listen的状态;

2. 客户端调用 connect 主动打开,向服务器发送syn1,进入syn_sent的状态;

3. 服务器确认客户端的syn,同时自己发送一个syn2和ack,对客户端进行确认,进入syn_rcvd状态;

4. 客户端接受到服务器发送的确认信息,进入establish状态,对服务器发送ack,服务器接受到ack,也进入到establish状态。

这个过程中的包,通过tcpdump,抓取tcp连接的包时,经常就可以收到。

四次释放的过程如下:

1. 主动关闭的一方,调用close,发送fin M,表示不再发送数据,进入fin_wait_1状态;

2. 被动关闭的一方,接收到fin M,进入close_wait状态,发送ack M+1;

3. 主动关闭的一方,接收到 ack M+1,进入 fin_wait_2 状态;

3. 被动关闭的一方,发送fin N,进入last_ack状态;

4. 主动关闭的一方,接收到fin N, 进入time_wait状态,发送ack N+1, 被动关闭的一方接收到

ack,进入 closed状态

特殊的情况,是主动关闭的一方,发送fin M,没有接收到ack M+1,而是接收到 fin N, 表示对方

也是要马上关闭数据,所以,马上转入closed状态。

tcp的释放,为什么需要四次握手?

如果一方执行主动关闭,只能保证本方不再发送数据,但是,无法确定是否要继续接收数据;

为什么需要time_wait状态?

1. 可靠地实现TCP全双工连接的终止

网络数据的传输,肯定要考虑丢包的情况,如果最后一次ack丢失,被动关闭的一方,将重新发送

它的FIN,因此主动关闭的一方,必须维持状态,允许自身重新发送最终的ACK。

2. 允许老的重复分节在网络中消逝

time_wait状态保持2msl的时间,msl指的是网络包在网络中存活的最长时间。

假设没有time_wait状态,客户端A向服务器B发送数据,并进入closed状态。过一段时间,又用原来

的端口和IP,重新建立连接,这时,之前在网络中传输的包,过一段时间,就可能被服务器接收到,

而这个不是服务器期望接收到的。

服务器为什么会处于close_wait状态?

服务器接收到客户端主动关闭的请求,但是自身还没执行主动关闭,就会处于close_wait状态。

如果服务器在recv数据包的时候,可能fin没有接收到,tcp代为回复了ack包,这时就进入close_wait

状态。

如果服务器上面,绝大多数连接都处于close_wait状态,那么很可能是因为服务器本身接收并处理完

客户端的数据,没有close连接导致的。

本文内容,参考了

unix网络编程卷一的内容

时间: 2024-08-27 09:31:33

tcp状态介绍和解释的相关文章

TCP的三次握手以及TCP状态转换图详解

今天来讨论一下TCP的三次握手以及TCP的状态转换图.首先发一个三次握手的流程图如下: 圖 2.4-3.三向交握之封包连接模式A:封包发起当用戶端想要对服务器端发起连接时,就必須要送出一個要求连线的封包,此时用戶端必须随机取用一個大于1024 以上的端口來做为程序通信的通道.然后在 TCP 的表头当中,必须带有 SYN 的主动连线(SYN=1),並并且记下发送给服务器端的序列号(Sequence number = 10001) .B:封包接收与确认封包发送当服务器端收到这个包,并且确定要接受这个

读懂TCP状态转移

读懂TCP状态变换的过程,对于理解网络编程颇有帮助,本文将对TCP状态转移过程进行介绍,但各个状态(总共11个)的含义不在本文介绍的范围. 内容来源:<UNIX网络编程>第一卷第二章2.6节,若是读者对某个知识点不太理解,请参考原文. TCP状态转换图(state transition diagram) 1. 建立连接(three-way hand shake) 主动打开(passive open):服务器必须准备好接受外来的连接,通常通过socket.bind和listen完成. 被动打开(

基于Socket的UDP和TCP编程介绍

一.概述 TCP(传输控制协议)和UDP(用户数据报协议是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议. TCP:传输控制协议,一种面向连接的协议,给用户进程提供可靠的全双工的字节流,TCP套接口是字节流套接口(streamsocket)的一种. UDP:用户数据报协议.UDP是一种无连接协议.UDP套接口是数据报套接口(datagram socket)的一种. 二.TCP和UDP介绍 1)基本TCP客户—服务器程序设计基本框架 说明:(三路握手)         1.客户端发

Linux统系统开发12 Socket API编程3 TCP状态转换 多路IO高并发select poll epoll udp组播 线程池

[本文谢绝转载原文来自http://990487026.blog.51cto.com] Linux统系统开发12 Socket API编程3 TCP状态转换 多路IO高并发select  poll  epoll udp组播 线程池 TCP 11种状态理解: 1,客户端正常发起关闭请求 2,客户端与服务端同时发起关闭请求 3,FIN_WAIT1直接转变TIME_WAIT 4,客户端接收来自服务器的关闭连接请求 多路IO转接服务器: select模型 poll模型 epoll模型 udp组播模型 线

基于 Socket 的 UDP 和 TCP 编程介绍

基于 Socket 的 UDP 和 TCP 编程介绍 一.概述 TCP(传输控制协议)和UDP(用户数据报协议是网络体系结TCP/IP模型中传输层一层中的两个不同的通信协议. TCP:传输控制协议,一种面向连接的协议,给用户进程提供可靠的全双工的字节流,TCP套接口是字节流套接口(stream socket)的一种. UDP:用户数据报协议.UDP是一种无连接协议.UDP套接口是数据报套接口(datagram socket)的一种. 二.TCP和UDP介绍 1)基本TCP客户-服务器程序设计基本

TCP 状态详解 -转载

TCP 是一个面向连接的协议,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接.本节将详细讨论一个TCP 连接是如何建立的以及通信结束后是如何终止的. 建立一个 TCP 连接 TCP使用三次握手 ( three-way handshake ) 协议来建立连接,图 3-10 描述了三次握手的报文序列.www.2cto.com 这三次握手为: 请求端(通常称为客户)发送一个 SYN 报文段( SYN 为 1 )指明客户打算连接的服务器的端口,以及初始顺序号( ISN ). 服务器发回包

TCP状态详解

        CLOSED: 这个没什么好说的了,表示初始状态. LISTEN: 这个也是非常容易理解的一个状态,表示服务器端的某个SOCKET处于监听状态,可以接受连接了. SYN_RCVD: 这个状态表示接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本 上用netstat你是很难看到这种状态的,除非你特意写了一个客户端测试程序,故意将三次TCP握手过程中最后一个ACK报文不予发送.因此这种状态 时,当收到客

TCP状态知识总结(图解)

tcp状态: LISTEN:侦听来自远方的TCP端口的连接请求 SYN-SENT:再发送连接请求后等待匹配的连接请求 SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认 ESTABLISHED:代表一个打开的连接 FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认 FIN-WAIT-2:从远程TCP等待连接中断请求 CLOSE-WAIT:等待从本地用户发来的连接中断请求 CLOSING:等待远程TCP对连接中断的确认 LAST-ACK:等待原来

TCP状态迁移,CLOSE_WAIT &amp; FIN_WAIT2 的问题

TCP状态迁移 大家对netstat -a命令很熟悉,但是,你有没有注意到STATE一栏呢,基本上显示着established,time_wait,close_wait等,这些到底是 什么意思呢,在这篇文章,我将会详细的阐述. 大家很明白TCP初始化连接三次握手吧:发SYN包,然后返回SYN/ACK包,再发ACK包,连接正式建立.但是这里有点出入,当请求者收到SYS /ACK包后,就开始建立连接了,而被请求者第三次握手结束后才建立连接.但是大家明白关闭连接的工作原理吗?关闭连接要四次握手:发FI