tcp协议总结

  • 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缓冲区大小决定,并且在建立连接的时候已经协商好了.发送端将滑动窗口里的多个数据包发送出去,接收端接收后,发送确认接收下一个数据包,然后发送端的滑动窗口开始移动,并将之前的缓存清除,发送下一个数据包.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章