8、总结描述TCP三次握手四次挥手
TCP三次握手
TCP数据报文结构:
三次握手主要用到了序列号(seq)&确认号(ack)及两个标志位(ACK&SYN):
seq:序列号和确认号ack是tcp传输可靠性的关键部分,序列号的随机取值范围为0-2^32-1 ack:下一个希望收到的序列号且代表之前序列号传输的数据已经被正确的收到,此字段只有ACK标志位为1的时候才有效
ACK:确认标志位,确认序号标志,为1时表示确认号(ack)有效,建立链接后所有数据的ACK都应为1
SYN:同步/链接标志位---->当SYN=1且ACK=0时,代表这是一个连接请求报文,TCP规定SYN=1时不能携带数据,但要消耗一个序号。
三次握手流程:
第一次握手:
客户端向服务器发送一个请求连接报文,进入SYN_SENT状态。
报文数据如下:
SYN=1:我(Client)想跟你(Server)进行连接
seq=100:我(client)这条数据的序列号是100
当Server解析该条报文为连接请求且可以建立连接时触发第二次握手
第二次握手:
服务器向客户端发送同意连接报文,进入SYN_RECV状态。
报文数据内容:
SYN=1:我(server)可以跟你(client)进行连接啦
ACK=1:你(client)的确认号有效
seq=200:我(server)这条数据的序列号是200
ack=101:我(server)已经收到你(client)序列号为100的数据了,下次你(client)给我(server)发的数据序列号应该是101哦
此时client已经知道client发送的数据server可以正常收到,且server发送的数据client也可以正常收到,但是server 并不知道client能不能正常的收到server的数据,由此则衍生出第三次握手.
第三次握手:
client向server发送自己已经收到server发的数据了,可以连接的了,进入ESTABLISHED状态。
报文数据:
ACK=1:你(server)的确认号是有效的
seq=101:我(client)这条数据序列号是你(server)希望我发的101
ack=201:我(client)已经收到你(server)序列号为200的数据了,下次你给我发的数据序列号应该是201哦
至此server也进入ESTABLISHED状态,现在双端已建立稳定的连接了,之后就可以互相发送数据。
简述TCP四次挥手
四次挥手主要用到了两个标志位(ACK&FIN:
ACK:确认标志位,确认序号标志,为1时表示确认号ack有效,建立连接后所有数据的ACK都就为1。
FIN:终止数据传输标志位,当FIN为1的时候代表此数据为终止断开连接的请求。
四次挥手流程:
TCP连接是全双工(full-duplex)模式。
第一次挥手:发送第一次挥手,进入FIN-WAIT状态
客户端向服务器请求断开连接
seq: client这条数据的序列号是300
FIN:client已经没有数据给你发送了 我要断开连接
当服务器收到客户端终止连接请求的时候需要做出响应即第二次挥手
第二次挥手:
Server表示已经收到了Client断开连接的请求,发送第二次挥手确认包,进入CLOSE-WAIT状态;然后Client收到Server的确认ACK包后,进入FIN-WAIT2状态。
ack: server已经收到client序列号为300的数据了
ACK:服务器表示client断开连接的请求server这边已经正确收到了
至此客户端到服务器的连接关闭,但服务器还存在部分数据没有发送给客户端的情况 当服务器发送完成数据会向客户端发送断开连接的请求即第三次挥手
第三次挥手:服务器收到客户端断开连接且已经没有数据需要发送给客户端的时候向客户端请求断开连接。Server主动发送第三次挥手,进入LAST-ACK最后确认状态
seq: Server这条数据的序列号400
FIN: Server已经没有数据给Client发送了,要断开连接
当客户端收到服务器终止连接请求的时候需要做出响应即第四次挥手
第四次挥手:Client表示已经收到了Server断开连接的请求,向Server发送第四次确认包,进入TIME-WAIT状态
ack: Client已经收到Server序列号为400的数据了
ACK: 客户端表示Server断开连接的请求Client这边已经正确收到了
至此服务器到客户端的连接关闭CLOSED,客户端到服务器的连接也关闭CLOSED了。 四次挥手保证了双端正确的断开连接。