TCP建立连接的三次握手和TCP连接断开的四次挥手

1. TCP建立连接的3次握手

2. TCP断开连接的四次挥手

【注意】中断连接端可以是Client端,也可以是Server端。

图3—Client端主动发起关闭连接请求

1. 假设Client端主动发起中断连接请求,也就是发送FIN报文

2. Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。此时Server端进入ClOSE_WAIT状态。

3当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。

4.Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以Client端发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

【问题1】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可能最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

为什么是2MSL,主要是为了考虑到如果最后一个ACK丢失,服务端会重新发FIN,客户端等待2MSL,才能接收到服务端重新发送的FIN报文。

在服务器的日常维护过程中,会经常用到下面的命令:

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

它会显示例如下面的信息:

TIME_WAIT 814
CLOSE_WAIT 1
FIN_WAIT1 1
ESTABLISHED 634
SYN_RECV 2
LAST_ACK 1

常用的三个状态是:ESTABLISHED 表示正在通信,TIME_WAIT 表示主动关闭,CLOSE_WAIT 表示被动关闭。

原文地址:https://www.cnblogs.com/whx7762/p/9402495.html

时间: 2024-09-29 04:04:14

TCP建立连接的三次握手和TCP连接断开的四次挥手的相关文章

TCP建立连接通过三次握手,释放连接通过四次挥手

tcp建立连接通过三次握手.释放连接通过四次挥手 一.tcp建立连接通过三次握手 首先tcp的特性:tcp是面向连接的安全可靠的传输协议. 传输连接是用来传送tcp报文的.tcp传输连接的建立和释放是每一次面向连接的通信中必不可少的过程.因此,传输连接就有三个阶段:连接建立.数据传输.连接释放.传输连接的管理就是使传输连接的建立和释放都能正常的进行. 在tcp连接建立的过程中要解决以下三个问题: 1.要使每一方都能够确知对方的存在. 2.要允许双方协商一些参数(如最大窗口值.是否使用窗口扩大选项

TCP连接的三次握手,TCP/UDP区别联系,socket连接和http连接的区别

TCP连接的三次握手 1.第一次握手:客户端发送SYN + J包(syn = j)到服务器,并进入SYN_SEND状态,等待服务器确认: 2.第二次握手:服务器收到syn包,必须确认客户的SYN(A出口= j+1),同时自己也发送一个SYN+K包(syn =k),即SYN +ACK包,向服务器发送确认包ACK(ack = k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手, TCP/UDP区别联系 1.TCP的全称是传输控制协议,这种协议可以提供面向连接的,可靠地

tcp 建立连接的三次握手,以及关闭连接的4次挥手

TCP连接的三次握手 第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; (客户端问服务器:你爱我吗?) 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; (服务器回答:我爱你,你也爱我吗?) 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABL

小tips:TCP的三次握手、长连接、 短连接、 SPDY 协议

当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次握手的,而释放则需要4次挥手,所以说每个连接的建立都是需要资源消耗和时间消耗的. TCP的三次握手 三次握手建立连接: 第一次握手:客户端发送syn包(seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包

详解TCP连接的“三次握手”与“四次挥手”(下)

上文链接: 详解TCP连接的"三次握手"与"四次挥手"(上) 四.TCP的四次挥手(Four-Way Wavehand) 0.前言 对于"三次握手"我们耳熟能详,因为其相对的简单.但是,我们却不常听见"四次挥手",就算听过也未必能详细地说明白它的具体过程.下面就为大家详尽,直观,完整地介绍"四次挥手"的过程. 1."四次挥手"的详解 所谓的四次挥手即TCP连接的释放(解除).连接的释放必

tcp连接的三次握手

为什么tcp连接需要三次握手才能建立连接 主要是为了初始化sequence number的初始值,通信的双方要互相通知双方的sequence number,这个要作为以后数据通信的序号,保证以后不会因为网络上的传输问题而乱序,tcp会使用这个序号来拼接数据.因此,在服务器回发它的sequence number以后,还需要发送确认报文发送给服务器告知服务器客户端已经收到了你的报文. 因此,如果只是两次握手的话,那么client发送一个请求,server接收到,在回复一个,这就表示server收到了

Java网络原理之连接管理:TCP三次握手和TCP四次挥手

问题:TCP为什么是三次握手?而不是两次或者四次? TCP作为种可靠传输控制协议,其核心思想:既要保证数据可靠传输,又要提高传输的效率,而用三次恰恰可以满足以上两方面的需求! TCP可靠传输的精髓: TCP连接的 发送方A,由操作系统动态随机选取-个32位长的序列号(InitialSequence Number),假设A的初始序列号为1000,以该序列号为原点,对自己将要发送的每个字节的数据进行编号,1001, 1002, 100... 并把自己的初始序列号ISN告诉B,让B有一个思想准备,什么

TCP协议中的三次握手和四次挥手(图解)【转】

建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. [更新于2017.01.04 ]该部分内容配图有误,请大家见谅,正确的配图如下,错误配图也不删了,大家可以比较下,对比理解效果更好.这么久才来更新,抱歉!! 错误配图如下: 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源.Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了. 那如何断开连接呢?

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

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