TCP握手
TCP/IP协议网络封包格式
- 以太网头
-
IP头
-
TCP头
TCP可靠传输,通过确认和重发机制.
TCP把所有要发送的数据进行编号(每一个字节用一个号)
发送时从当前数据位置开始,发送window大小的数据
SYN和ACK的表示:
举例 SYN = 999, ACK =1000,表示前面999个字节都收到,请从1000号开始分配。 -
UDP头
三次握手
- seq:序号。占4B,范围0~2^23-1。TCP是面向字节流的,所以TCP连接传送的字节流中每个字节都需要按顺序编号。序号字段值指的是本报文段所发送数据的第一个字节的序号。
例如:一段报文的序号字段的值是301,而携带的数据共有100B,表明本报文段的数据的最后一个字节的序号是400,因此下一个报文段的数据序号应从401号开始。 - ack:占4B,是期望收到收到对方下一个报文段的第一个数据字节的序号。若确认号为N,则表明到序号N-1为止的所有数据都已收到。
例如:B正确收到了A发送过来的一段报文,其序号字段是501,而数据长度是200B(序号501~700),这表明B正确收到了A发送的到序号700为止的数据。因此B期望收到A的下一个序列号是701,于是B在发送给A的确认报文段中吧确认号置为701。 - ACK:仅当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。
连接的建立经过以下3个步骤,通常称为3次握手。
连接建立前,服务器进程处于Listen状态,等待客户的连接请求。
-
第一步:客户机的TCP首先向服务器的TC发送连接请求报文,这个特殊报文段的首部中同步为SYN置1同时选择一个初始序号seq=x。TCP规定,SYN报文段不能携带数据,但要消耗一个序号。这时,TCP客户进程进入SYN-SENT(同步已发送)状态。
-
第二步:服务器的TCP收到连接请求的报文段后,如同意建立连接,则向客户机发送确认,并为该TCP连接分配缓存和变量。在确认报文段中,把SYN和ACK位都置1,确认号是ack = x+1,同时也为自己选择一个初始序号seq=y。注意:报文段不能携带数据,但要消耗一个序列号。这时TCP服务器进入TCP-RCVD(同步收到)状态。
-
第三步:当客户机收到服务器发送的确认报文段后,还要向服务器给出确认,并为该TCP连接分配缓存和变量。确认报文段的ACK位置置1,确认号ack=y+1,序号seq=x+1.该报文段可携带数据,若不携带数据则不消耗序号,这时TCP客户进程就进入ESTABLISHED(已建立连接状态)。
四次握手
参与TCP连接的两个进程中的任何一个都能终止该连接。TCP连接释放的过程通常称为四次握手。
- 第一步:客户机打算关闭连接时,其向TCP发送连接释放报文段,并停止发送数据,主动关闭TCP连接,该报文段的终止位FIN置1,序号seq=u,它他等于前面已传送过的数据的最后一个字节的序号加1,FIN报文段不携带数据,也消耗一个序号。这时,TCP客户进程进入FIN-WAIT-1(终止等待1)状态。TCP是全双工的,即可以想象为一条TCP连接上有两条数据通路,发送FIN的一端不能再发送数据,即关闭了一条数据通路,但对方还能发送数据。
- 第二步:服务器收到连接释放报文段后发出确认,确认号是ack=u+1,序号seq=v,等于它前面已传送数据的最后一个字节号加1.然后服务器进入CLSOE-WAIT(关闭等待)状态。此时,从客户机到服务器这个方向的连接就释放了,TCP连接处于半关闭状态,但服务器若发送数据,客户机仍要接收,即从服务器到客户机这个方向的连接并未关闭。
- 若服务器以及没有要向客户机发送的数据后,就通知TCP释放连接,此时,其发出FIN=1的连接释放报文段。设该报文段的序号为w(在半关闭状态可能又发送了一些数据),还需重复上次已发送的确认号ack = u+1.这时服务器进入LAST-ACK(最后确认)状态。
- 第四步:客户机收到连接释放报文段后,必须发出确认。把报文段中的确认位ACK置1,确认号ack=w+1,序号seq=u+1,此时TCP连接还未释放,必须经过时间等待计数器置位的时间2MSL后,客户机才进入CLOSED(连接关闭)状态。