每个 TCP 都包含源端口和目的端口,这两个值加上 IP 部首当中的源 IP 和目的 IP 地址唯一确定到一个 TCP 链接。
一个 IP 地址和一个端口号也称为一个插口( socket )。
序号标识从 TCP 发端到 TCP 收端的数据字节流,序号是 32 位的无符号数,到达了 2^32 - 1 后从 0 开始。
确认序号应当是上次已成功收到数据字节序号加 1。只有 ACK 为 1 时候确认号才有效。
首部长度给出TCP首部的字节数目。需要这个值是因为任选字段的长度是可变的。保留:6bit, 均为0。
TCP首部中有6个标志位。
窗口大小来进行TCP的流量控制。窗口大小为字节数,起始于确认序号字段指明的值,这个值是接受端期望接受的字节。
检验和覆盖了整个的TCP报文段:TCP首部和TCP数据。这是一个强制性的字段,一定由发端进行计算和存储,并由收端进行检验。
紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。
第一次握手:客户端向服务器发送连接请求包,标志位SYN(同步序号)置为1,序号为X
第二次握手:服务器收到客户端发过来报文,由SYN=1知道客户端要求建立联机。向客户端发送一个SYN和ACK都置为1的TCP报文,设置初始序号 Y,将确认序号(ack)设置为客户的序列号加1,即 X+1。
第三次握手:客户端收到服务器发来的包后检查确认序号(ack)是否正确,即第一次发送的序号加1(X+1)。以及标志位ACK是否为1。若正确,客户端再次发送确认包,ACK标志位为1,SYN标志位为0。确认序号(ack) Y+1,发送序号为X+1=1。客户端收到后确认序号值与ACK=1则连接建立成功,可以传送数据了。
第一次挥手:客户端给服务器发送TCP包,用来关闭客户端到服务器的数据传送。将标志位FIN和ACK置为1,序号为X,确认序号(ack)为Z。
第二次挥手:服务器收到FIN后,发回一个ACK(标志位ACK=1),确认序号为收到的序号加1,即(ack)X+1。序号为收到的确认序号Z。
第三次挥手:服务器关闭与客户端的连接,发送一个FIN。标志位FIN和ACK置为1,序号为Y ,确认序号为X+1。
第四次挥手:客户端收到服务器发送的FIN之后,发回ACK确认(标志位ACK=1),确认序号为收到的序号加1,即Y+1。序号为收到的确认序号X+1。
【参考资料】
http://www.seanyxie.com/wireshark%E6%8A%93%E5%8C%85%E5%9B%BE%E8%A7%A3-tcp%E4%B8%89%E6%AC%A1%E6%8F%A1%E6%89%8B%E5%9B%9B%E6%AC%A1%E6%8C%A5%E6%89%8B%E8%AF%A6%E8%A7%A3/
TCP/IP详解 卷1:协议
—EOF—