- tcp头部
seq(序列号):表示该数据包第一个数据的字节的序号.例如,第一个包(序号为1)的长度为4个字节,第二个包的序号就为5.
ack(确认号):表示之前的数据包已经接收,需要接收该序号的数据包.例如收到第一个包后,再请求下一个包,这个请求的seq就为5.
ACK(确认号标识位):为0时表示ack无效,为1时表示确认号有效.
SYN:请求同步,请求建立连接,并在其序列号的字段进行序列号的初始值设定。建立连接,设置为1.
FIN:请求断开连接
- 三次握手
第一次握手:客户端发送(SYN=1,ACK=0,seq=x(x表示任意))SYN数据包,进入SYN_SENT状态
第二次握手:服务端接收客户端,响应(SYN=1,ACK=1,seq=y(y表示任意),ack=x+1)SYN+ACK数据包,进入SYN_RECV状态.
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送(ACK=1,ack=y+1,seq:x+1)的数据包,客户端进入ESTAB_LISHED(TCP连接成功)状态,服务器接收后也进入ESTAB_LISHED,完成三次握手。
未连接队列: 在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包时,删除该条目,服务器进入ESTAB_LISHED状态。
-
四次挥手
第一次挥手:客户端示意关闭连接,发送(FIN=1,seq=u(u表示任意))数据包,进入FIN-wait-1
第二次挥手: 服务器确认,收到后发送(ACK=1,ack=u+1,seq=v)ACK包.
第三次挥手:服务器示意关闭连接,发送(FIN=1,ACK=1,ack=u+1,seq=w)数据包
第四次挥手:客户端确认,发送(ACK=1,seq=u+1,ack=w+1)数据包,进入半关闭状态,需要等待2MSL的时间,才能彻底关闭。(等待一段时间的原因:客户端确认包可能丢失,如果此时关闭后,服务器可能继续发送,而客户端已经关闭).
- 滑动窗口
客户端与服务器都有接收与发送窗口,并且服务器的发送窗口与客户端接收窗口大小需要一致,才能保证双方传输速率一致,滑动窗口根据tcp缓冲区大小决定,并且在建立连接的时候已经协商好了.发送端将滑动窗口里的多个数据包发送出去,接收端接收后,发送确认接收下一个数据包,然后发送端的滑动窗口开始移动,并将之前的缓存清除,发送下一个数据包.