TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的、可靠的、 基于IP的传输层协议。
TCP工作在网络OSI的七层模型中的第四层————传输层
数据从应用层发下来,会在每一层都会加上头部信息,进行 封装,然后再发送到数据接收端。
在数据传输之前,所有基于TCP协议进行通信都需要通过三次握手来建立可靠的连接。
先介绍TCP的三次握手、四次挥手
有关TCP标志位 flags:
SYN(synchronous建立联机)
ACK(acknowledgement 确认)
PSH(push传送)
FIN(finish结束)
RST(reset重置)
URG(urgent紧急)
Sequence number(顺序号码)
Acknowledge number(确认号码)
红框所圈处:TCP进行三次握手的数据包
第一次握手:主机A 通过向 主机B 发送一个带有(SYN)标志位和SEQ序列号的数据包 并且进入SYN SENT
状态 等待服务器确认,在下面的数据包中SYN
为1
,SEQ则为1812515538
第二次握手:主机B 收到 主机A 的请求后,会进入SYN-RECEIVE
状态,再回复一个带有确认应答(ACK)和请求同步序列号(SYN)标志位的数据段响应主机A,也告诉主机A两件事: 我已经收到你的请求了,你可以传输数据了,在下面的数据包中SYN
为1
,ACK确认
为1
,SEQ
为1891499098
,ack
为第一次握手中的SEQ+1
第三次握手:主机A收到这个数据段后,再发送一个确认应答,表示确认已收到 主机B 的数据段:"我已收到回复,我现在要开始传输实际数据了,这样3次握手就完成了,主机A和主机B 就可以传输数据了,此时的数据包为ACK
为1
,SEQ
为第一次握手中的SEQ+1
,ack
为第二次握手SEQ+1
,该报文发送完毕后,客户端和服务器端都进入ESTABLISHED
状态,完成TCP三次握手。
问题:每次发送请求时为什么ack要+1?
ack大家可以理解为代表下一个数据包的编号,这也就是为什么第二请求时,ack
是SEQ+1
,来保证下一次的通信时可用的,来认证的确是对方的信息
问题:SEQ的作用?
SEQ:序列号,什么意思呢?当发送一个数据时,数据是被拆成多个数据包来发送,序列号就是对每个数据包进行编号,这样接受方才能对数据包进行再次拼接。
总结图: