标签:序列号
TCP报文段首部格式
TCP源端口(Source Port)和目的端口(Destination port):各占2个字节,分别写入源端口号和目的端口号。
TCP序号(序列码,Sequence Number):占4个字节,在TCP连接中传送的字节流中的每一个字节都按顺序编号首部中的序号字段值指本文段所发送的数据的第一个字节的序号。
TCP确认号:占4个字节,期望收到对方下一个报文段的第一个数据字节的序号。如果设置了ACK控制位,这个值表示一个准备接收的包的序列码。
TCP数据偏移(HLEN):占4位,包括TCP头大小,指示何处数据开始。
保留(Reserved):占6位,这些位必须是0。为了将来定义新的用途所保留。
标志(Code Bits):6位标志域。表示为:紧急标志、有意义的应答标志、推、重置连接标志、同步序列号标志、完成发送数据标志。按照顺序排列是:URG、ACK、PSH、RST、SYN、FIN。
窗口(Window):16位,发送本报文段的一方的接受窗口,窗口值告诉对方:从本报文段首段中的确认号算起,接收方目前允许对方发送的数据量。
校验和(Checksum):16位TCP头。源机器基于数据内容计算一个数值,收信息机要与源机器数值结果完全一样,从而证明数据的有效性。
紧急指针(Urgent Pointer):16位,指向后面是优先数据的字节,在URG标志设置了时才有效。如果URG标志没有被设置,紧急域作为填充。加快处理标示为紧急的数据段。
选项(Option):长度不定,但长度必须是一个字节。如果没有选项就表示这一个字节的域等于0。
注意 (A)不要将确认序号Ack与标志位中的ACK搞混了。
(B)确认方Ack=发起方Req+1,两端配对。
2.三次握手
客户端和服务端进程创建传输控制块TCB
(1)第一次:A向B发出连接请求报文段,此时同步位SYN=1,选择初始序号seq=n。TCP规定,SYN报文段不能携带数据,但要消耗一个序号。这时,TCP客户进程进入SYS—SENT(同步已发送)状态。
(2)第二次:B收到连接请求后同意建立连接,向A发送确认,此时把SYN和ACK置为1,确认号ack=n+1,同时也为自己选择一个初始序列号seq=k。这个报文段不能携带数据,但要消耗一个序号。
(3)第三次:TCP客户进程收到B点确认后,还要向B给出确认。将ACK置1,确认号ack=k+1,自己的序号seq=n+1。TCP规定,ACK报文段可以携带数据,但如果不携带数据则不消耗序号,在这种情况下,下一个数据报文段的序号仍是seq=n+1。这时,TCP已建立连接,A进入ESTABLISHED(已建立连接)状态。B收到A的确认后,也进入ESTABLISHED(已建立连接)状态。
3.四次挥手
AB处于ESTABLISHED(已建立连接)状态。
(1)第一次:A的应用进程向其TCP发出连接释放报文段,并停止发送数据,主动关闭TCP连接。A把FIN置1,序号seq=x,它等于前面已传达过的数据的最后一个字节的序号加1。这时A进入FIN-WAIT-1(终止等待1)状态,等待B确认。TCP规定,FIN报文段即使不携带数据也要消耗一个序号。
(2)第二次:B收到连接释放报文段后发出确认,确认号是ack=x+1,自己的序号seq=y。B进入CLOSE-WAIT(关闭等待)状态。此时,A到B这个方向的连接就释放了,这时TCP处于半关闭状态,即A已经没有数据发送了,但B若发送数据,A仍要接收。
A收到B的确认后,进入FIN-WAIT-2(终止等待2)状态,等待B发出连接释放报文段。
(3)若B已经没有数据向A发送了,其应用进程通知TCP释放连接。B把FIN置1,序号seq=i,确认号seq=x+1。这时B进入LAST-ACK(最后确认)状态,等待B确认。
(4)A在收到B的连接释放报文后,必须对此发出确认。把ACK置1,确认号是ack=i+1,自己的序号seq=x+1。B进入TIME-WAIT(时间等待)状态。此时,TCP连接还没有释放,必须经过时间等待计时器设置的时间2MSL后,A才进入到CLOSE状态。当A撤销相应的传输控制块TCP后,就结束了这次的TCP连接。
本文出自 “sunshine225” 博客,请务必保留此出处http://10707460.blog.51cto.com/10697460/1774698
标签:序列号
原文地址:http://10707460.blog.51cto.com/10697460/1774698