TCP是面向字节流的可靠协议,传输的数据单元叫报文段,报文段包括:首部和数据。
TCP报文段首部的几个字段的含义:
- 序号:本报文段发送的数据的第一个字节的序号
- 确认号:希望收到对方下一个报文段的第一个字节的序号
- 确认ACK:连接请求报文段的ACK=0,建立连接后ACK=1(ACK=1时确认号有效,ACK=0时确认号无效)
- 同步SYN:当SYN=1,ACK=0这是连接请求报文段,若对方同意则响应报文段SYN=1,ACK=1
- 终止FIN:当FIN=1,表示此报文段发送方的数据已发送完毕,要请求释放连接
三次握手过程:
- A向B发连接请求报文段,同步SYN=1,确认ACK=0,序号seq=x(不携带数据也要消耗1个序号),确认ACK=0确认号ack无效
- B收到连接请求报文段后,若同意建立连接,向A发送确认报文段,同步SYN=1,确认ACK=1,序号seq=y(不携带数据也要消耗1个序号),确认号ack=x+1(不携带数据)
- A收到B的确认后,还要发送确认报文段,同步SYN=0(SYN不需要了),确认ACK=1,序号seq=x+1,确认号ack=y+1
四次挥手过程:
- A的数据传送完毕,A向B发送连接释放报文段,终止FIN=1,序号seq=u(不携带数据也要消耗1个序号)
- B收到连接释放报文段后,若同意释放,向A发送确认报文段,确认ACK=1,序号seq=v(v=B已发送的数据的最后一个字节序号+1),确认号ack=u+1
- 此时A到B方向的连接就释放了,TCP处于半关闭状态,B到A方向的连接未关闭,若B要发送数据,A仍要接收。若在半关闭状态B又发送了一些数据,B的数据传送完毕,B向A发送连接释放报文段,终止FIN=1,确认ACK=1,序号seq=w(w=B已发送的数据的最后一个字节序号+1),确认号ack=u+1
- A收到连接释放报文段后,向B发送确认报文段,确认ACK=1,序号seq=u+1,确认号ack=w+1
注:若B收到A的连接释放报文段后,不再发送数据了,第2和3步合并为一个即只发送一个确认报文段,终止FIN=1,确认ACK=1,序号seq=v(w=B已发送的数据的最后一个字节序号+1),确认号ack=u+1,第4步变为:A收到连接释放报文段后,向B发送确认报文段,确认ACK=1,序号seq=u+1,确认号ack=v+1