TCP协议的建立与释放及TCP的有限状态基

一、TCP的链接建立(三次握手)

如下图所示:假定最初两端的TCP进程都处于关闭状态。下图中,client主动打开链接,server被动打开链接

创建过程:

①、server的TCP服务器进程先创建传输控制块TCB(存储了每一个链接中的重要信息),准备接受client进程的连接请求。然后服务器进程就处于LISTEN(收听)状态,等待客户的连接请求。如有,作出响应。

②、client的TCP客户进程也是首先创建传输控制模块TCB,然后向server发出连接请求报文段,这时首部中的同步位SYN =1,同时选择一个初始序号 seq =1000,TCP规定,SYN报文段不能携带数据,但要消耗一个序号。这时,TCP客户进程进入SYN-SENT(同步以发送)状态。mss表示最大段尺寸,

如果一个段太大,封装成帧后超过了链路层的最大帧长度,就必须在IP 层分片,为了避免这种情况,客户端声明自己的最大段尺寸,建议服务器端发来的段不要超过这个长度。

③、server收到连接请求报文段后,如同意建立连接,则向client发送确认。在确认报文段中应把SYN 为和ACK 位都置1,确认号是ack =1001,同时也为自己选择一个初始序号seq=8000。这个报文段也不能携带数据,但同样要消耗一个序号。这时TCP服务器进程进入SYN-RCVD(同步收到)状态。

④、TCP客户进程收到server的确认后,还要向server给出确认,确认报文段ACK 置1,确认号ack =8001,而自己序号为seq=1002,TCP的标准规定,ACK 报文段可以携带数据。但如果不携带数据则不消耗序号,这种情况下,下一个数据报文段的序号仍是seq =1002.这时,TCP连接已经建立,client进去ESTABLISHED(已建立连接)状态。

⑤、当servers收到client的确认后,也进入ESTABLISHED状态。

****************为什么client还要发送一次确认呢?主要是为了防止已失效的连接请求报文段突然又传送到了server,因而产生错误。**********************

二、TCP的连接释放(四次挥手)

如下图所示:

释放连接过程:

①、数据传输结束后,通信的双方都可释放连接。现在client和server都处于ESTABLISHED状态。client的应用进程先向其TCP发出连接释放,并停止再发送数据,主动关闭TCP连接。client把连接释放报文段首部的FIN置1,其序号 seq=1021,它等于前面已传送过的数据的最后一个字节的序号加1.这是client进入FIN-WAIT-1(终止等待1)状态,等待server的确认。TCP规定,FIN报文段即使不携带数据,它也消耗一个序号。

②、server收到连接释放报文段后即发出确认,确认号是ack=1022,然后server就进入CLOSE-WAIT(关闭等待)状态。TCP服务器进程这时应通过高层应用进程,而从client到server这个方向的连接就释放了,这时的TCP连接处于半关闭(half-close)状态,即client已经没有数据要发送了,但server若发送数据,client仍要接收。也就是说server到client这个方向的连接并未关闭。

③、client收到来自server的确认后,就进入FIN-WAIT-2(终止等待2)状态,等待server发出的连接释放报文段。若server已经没有要向client发送的数据,其应用进程就通知TCP 释放连接。这是B发出的连接释放报文段必须使FIN=1 。现假定server的序号为8011.这是server就进入LAST-ACK(最后确认状态),等待client的确认。

④、client在收到server的连接释放报文段后,必须对此发出确认,在确认报文段中把ACK置1 ,序号为8012,然后进入到TIME-WAIT(时间等待)状态。这时候TCP连接还没有释放掉。必须经过时间等待计时器设置的时间2MSL后,client才进入到CLOSE状态。时间MSL叫做最长报文段寿命,建议设置为2分钟。

⑤、server接收到了client发出的确认,就进入CLOSED状态。

**************为什么client在TIME-WAIT状态必须等待2MSL时间呢?**********

第一,为了保证client发送的最后一个ACK报文段能够到达server。

第二,防止“已失效的连接请求报文段”出现在本连接中。

三、TCP有限状态基

每个方框中的大写英文字符串是TCP标准所使用的TCP连接状态名。状态之间的箭头表示可能发生的状态变迁。箭头旁边的字,表明引起这种变迁的原因,或表明发生状态变迁后又出现什么动作。图中三种不同的箭头表示的意义不同,粗实箭头表示对客户进程的正常变迁,粗虚箭头表示对服务器进程的正常变迁。另外一种细线箭头表示异常变迁。

①、CLOSED 状态时初始状态。

②、LISTEN:被动打开,服务器端的 状态变为LISTEN(监听)

③、SYN-RECVD:服务器端收到SYN后,状态为SYN;发送SYN ACK;

④、SYN_SENTY:应用程序发送SYN后,状态为SYN_SENT;

⑤、ESTABLISHED:当连接已经建立,客户端进入ESTABLISHED状态,服务器端收到客户端的确认后,服务器端也进入ESTABLISHED状态。

⑥、FIN_WAIT_1:应用程序端发送FIN,准备断开TCP连接

⑦、CLOSE_WAIT:服务器端在收到FIN后,发送ACK,状态为CLOSE_WAIT

⑧、FIN_WAIT_2:当客户端收到来自服务器端的确认后,就进入FIN_WAIT_2.

⑨、LAST_ACK:当服务器端没有要向客户端发送的数据,其应用进程就通知TCP释放连接。服务器端重复上次已发送过得确认号。这时服务器端就进入LAST_ACK状态。

10、TIME_WAIT:客户端收到服务器端的连接释放报文段后,对此发出确认,然后客户端就进入了TIME_WAIT状态。

时间: 2024-12-19 16:46:25

TCP协议的建立与释放及TCP的有限状态基的相关文章

计算机网络(11)-----TCP连接的建立和释放

TCP连接的建立和释放 概述 TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程,运输连接有三个阶段:连接建立,数据传送和连接释放. TCP连接的建立 如图所示,假定A主机是客户端程序,B主机是服务端程序.最初两端的TCP进程都是出于CLOSED(关闭)状态. (1)B的TCP服务器进程先创建传输控制块TCB(transmission Control Block),准备接受客户进程的连接请求.然后服务器就进入LISTEN(监听)状态,等待客户端的连接请求. (2)A的TCP客户进程

【网络协议】TCP连接的建立和释放

转载请注明出处:http://blog.csdn.net/ns_code/article/details/29382883 TCP首部格式 先看TCP报文段的格式,例如以下; TCP报文段首部的前20个字节是固定的,后面有4N字节是依据须要而添加的选项.因此TCP报文段的最小长度为20个字节. 首部固定部分的各字段的意义例如以下: 1.源port和目的port:加上IP首部的源IP地址和目的IP地址,确定唯一的一个TCP连接.另外通过目的port来决定TCP将数据报交付于那个应用程序,从而实现T

tcp连接的建立与释放

1.TCP是面向连接的协议. 运输连接时用来传送TCP报文的.TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程.因此,运输链接就有三个阶段,即:连接建立.数据传送和连接释放. 在TCP连接建立过程中要解决以下三个问题: (1)要能使每一方都确知对方的存在. (2)要允许双方协商一些参数(如最大窗口值.是否使用窗口扩大选项和时间戳选项以及服务质量等). (3)能够对运输实体资源(如缓存大小.连接表中的项目等)进行分配. 2.TCP的连接建立 上面给出的连接建立过程叫做三次握手 2.

浅谈TCP协议(建立与断开连接)

TCP是面向连接的,可靠的进程到进程通信的协议.TCP提供全双工服务,即数据可在同一时间双向传输,每一个TCP都有发送缓存,用来临时存储数据.TCP将若干个字节构成一个分组,成为报文段(segment)TCP报文段封装在IP数据报中:TCP报文段的首部格式如图:首部长度为20--60字节,源端口号:他是16位字段,为发送方进程对应的端口号.目标端口号:他是16位字段,对应的是接收端的进程,接收端收到数据段后,根据这个端口号来确定把数据送给那个应用程序的进程.序号:当TCP从进程接收数据字节时,就

TCP协议的学习(三)TCP协议三次握手及攻击

(一)三次握手 ACK : TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1 SYN(SYNchronization) : 在连接建立时用来同步序号.当SYN=1而ACK=0时,表明这是一个连接请求报文.对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此, SYN置1就表示这是一个连接请求或连接接受报文. 发送序列号:Sequence Number 确认序列号:Acknowledgment Number CLOSED: 初始状态. LISTE

TCP协议的初始化及socket创建TCP套接字描述符

我们依然从start_kernel说起,它最后会执行: arch_call_rest_init() --> rest_init() --> Kernel_init() --> Kernei_init_freeable() --> do_basic_setup() --> do_initcalls() --> do_initcall_level(level) do_initcall_level(level)会根据level从0级开始以次执行相应先后等级的初始化函数. 第一

在Linux下使用tcpdump抓包分析TCP连接的建立与释放

笔者使用的环境为WIN7 64位旗舰版下使用VirtualBox安装的centOS6.5实验环境 建立连接 ---------------------------------------------------------------- 在终端1中进入root权限,键入 tcpdump tcp -vX -i eth2 #使用man手册查看tcpdump的使用方法 #eth2为接口,可以使用arp -a显示当前的接口 在终端2中键入 telnet www.baidu.com 80 #远程登录www

TCP协议及TCP正常连接与断开

一.TCP协议简介TCP,全称Transfer Control Protocol,中文名为传输控制协议,它工作在OSI的传输层,提供面向连接的可靠传输服务.TCP的工作主要是建立连接,然后从应用层程序中接收数据并进行传输.TCP采用虚电路连接方式进行工作,在发送数据前它需要在发送方和接收方建立一个连接,数据在发送出去后,发送方会等待接收方给出一个确认性的应答,否则发送方将认为此数据丢失,并重新发送此数据.下面我们来介绍一下TCP的报头结构和相关工作原理:1.TCP报头TCP报头总长最小为20个字

TCP连接的建立与终止

我们通过一个例子来说说TCP连接的建立与断开: 在这个例子中,客户端发起连接,发送请求,服务端响应请求,然后客户端主动关闭连接. 建立连接的过程: 1.客户端发出段1,SYN表示连接请求,如图中所示,序号是1000,每发送一个数据字节,这个序号就要加1,这样在接收端可以根据序号排出数据包的正确顺序,也可以发现丢包的情况,SYN和FIN位也要占一个序号,从第一段可以看出,这次发送的数据是0(即没有发送数据),但是由于SYN要占一位,因此下次发送数据要从1001开始.mss表示最大段尺寸,如果一个段