您的位置:首页 > 理论基础 > 计算机网络

TCP的三次握手(建立连接)和四次挥手(关闭连接)

2016-09-20 16:15 513 查看
TCP(Transimission Control Protocol)传输控制协议

三次握手(建立连接):

TCP是主机到主机层的传输控制协议,提供可靠的连接服务,这种“可靠”的来源也是由于它是面向连接的服务,采用的是三次握手建立连接。

状态描述:

SYN_SENT(客户端积极尝试去建立连接的请求)

SYN_RCVD(服务端接收到建立连接请求)

ACK(acknowledgement确认)

ESTABLISHED(表示该端口已经建立了一个连接)

CLOSED(表示这个端口现在不被使用)

图解:

过程: 第一次握手:建立连接时,客户端发送SYN包(SYN=J)到服务器端,并进入SYN_SENT状态,等待服务器确认,如果得不到确认,客户端会在一定间隔内重复发送SYN包。

第二次握手:服务器端收到了SYN包,必须给客户端发送一个对SYN的确认包(ack=J+1),并且发送一个自己的SYN包(SYN=K),通过SYN+ACK来实现本次,这时候服务器端进入了SYN_RCVD状态。

第三次握手:客户端收到了从服务器端传来的SYN+ACK包后,向服务器段发送确认包来建立连接,即ACK=K+1,至此,客户端和服务器端建立了连接。

注意点:①每一次握手都包含了一个发送序列号,这是本端发送到对端时随机的一个数,以及一个标志位,这个标志位就是告诉我们这是干什么的包

 ②确认号:其数值等于对端发送序号+1,也就是“我希望接收的下一个包的序列号”

 ③由于是tcp的三次握手,有必要了解一下TCP的包格式:

源端口 16位

目标端口 16位

序列号 32位

回应序号 32位

TCP头长度 4位

reserved 6位

控制代码 6位

窗口大小 16位

偏移量 16位

校验和 16位

选项 32位(可选)

这样我们得出了TCP包头的最小长度,为20字节

————————————————————————————————————————————————————

四次挥手(断开连接)

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。比如说客户端发送完信息后就可以用包含FIN标志的包去中断连接,这里的中断只是从客户端到服务器端的中断,也许服务器这边还没有处理完你的请求,就不能使用三次去完成中断。但跟三次握手类似,同样是客户端主动断开,发送请求去断开TCP连接,三次握手也是客户端主动,服务器端被动,这样的客户端-服务器端模式,有利于减少服务器端的压力。

状态描述:

FIN-WAIT-1(等待远程TCP的连接中断请求,或先前的连接中断请求的确认,“已经告诉你我要中断”后处于的状态)

FIN-WAIT-2(本端的连接中断了,并且等待远程TCP的连接中断,“既然你知道要中断,那把事情办完了再确认”时处于的状态)

CLOSE_WAIT(被动关闭状态)

LAST_ACK(服务器段处理完某些请求后,也给出自己FIN包来中断,而这个FIN包需要客户端确认才行)

TIME_WAIT(等待服务器端处理完数据包时处于此状态)

CLOSED(连接彻底断开)

图解:

过程: 第一次挥手:客户端发送一个FIN,用来关闭客户端到服务器端的数据数据传送。(“男的说我要分手”)

第二次挥手:服务器端收到这个FIN,并回复一个ACK包,确认号是收到的FIN包的序号+1,和SYN一样FIN也是标志位的一员,代表中断。(“女方已经知道男的意思,并且男方对女方已经没有联系”)

第三次握手:服务器关闭客户端的连接,发送一个FIN。(女方终于也受不了男方,把男方托咐的事情办完后,对男方说拜拜)

第四次握手:客户端收到服务器端的FIN包,并发送一个ACK确认。(男方如愿以偿,两人再无瓜葛,中断完毕)

注意点:①关于TCP的三次握手和四次挥手都可以用wireshark抓包查看

 ②TCP是全双工的,它存在一个双向的读写通道,任何一个方向有一次连接的建立和断开,都是单独的。所以在TCP的一端收到一个FIN后,仍然可以发送数据。

 ③“读”是对端到本端的数据流,“写”是本段到对端的数据流

 ④服务器和客户端都可以主动发起关闭FIN,完全对称。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tcp 网络