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,完全对称。