TCP,Transmission Control Protocol,传输控制协议。位于第三层传输层。TCP/IP的四层模型从下到上为:链路层(Link layer),网络层(Internet Layer),传输层(Transport Layer),应用层(Application Layer)。对应OSI参考模型的第四层——传输层。三次握手和四次挥手是建立连接和拆除连接的详细过程。
因为TCP是面向连接的服务协议,这一点跟UDP不同。什么是面向连接?简单说就是在传输数据前需要在网络中建立一个虚拟通路,而不需要时再拆除连接。这种服务特性能保证传输质量,是可靠的服务(而UDP是尽力而为的服务,也即放到网络中传输就了事了)。TCP建立连接时的3次握手和拆除时的4次挥手就是面向连接的实例。
SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)这六个位码是TCP数据包中的标志位,每个位对应一个bit,可标识为1或0(默认)。绿色的是今天要讲到的。
而Sequence number(顺序号码) 是发送方发送消息的序列号,相当于标识每一条消息的id。Acknowledge number(确认号码)是表示确认收到上一条,请对方发送下一条。注意这里的Ack number和标志位Ack不同。Ack只有一位,而Ack number一般为接收到的seq number + 1,不止一位。它们在数据包中位于两个不同位置。
TCP的三次握手是为了建立TCP连接(连接服务器指定端口)进而传输数据。在Socket编程中,由客户端的connect()函数触发三次握手。建立连接的过程也会交换TCP窗口大小的信息。由wireShark就可以抓包看到。
第一次握手:主机A发送位码为SYN=1,随机产生seq number=1234567的数据包到服务器,主机A进入SYN_SEND状态,主机B由SYN=1知道,A要求建立联机;
第二次握手:主机B收到请求后要确认联机信息,向A发送Ack number=(主机A的seq+1)=1234568,SYN=1,
ACK=1,随机产生seq=7654321的包,此时B进入SYN_RECV状态,一直到第三次握手之前,AB之间是半连接状态;
第三次握手:主机A收到后检查ack number是否正确,即ack number 是否 = 第一次发送的seq number+1,以及位码ACK是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ACK=1,主机B收到后确认seq值与ACK=1则此后双方进入ESTABLISHED状态,连接建立成功,。
完成三次握手,主机A与主机B开始传送数据。
------------------------------------------------------------------
三次挥手是由客户端发起的,而四次挥手不一样,客户端或服务器均可主动发起挥手动作请求关闭,在socket编程中,任何一方执行close()操作即可产生挥手操作。
第一次挥手: 主动方B向被动方A发送位码FIN = 1, Ack number = x,Seq number = k的数据包,这里的Ack number = x,则表示已收到对方seq = x - 1的数据包,告知对方可发送下一个数据包;
第二次挥手: 被动方发送Ack number = k + 1,seq = x 的数据包;
第三次挥手: 依然是被动方发送位码FIN = 1,Ack number = k ,seq = y的数据包;
第四次挥手: 主动方发送 Ack number = y ,seq = k的数据包。