详细分析TCP报文首部以及TCP三次握手和四次分手
详细分析TCP报文首部以及TCP三次握手和四次分手
TCP的报文首部
TCP首部各字段的意义和作用
1.source port and destination port (各占2个字节)
用来告知主机该报文段来自哪里,以及传送到那个应用程序(application port)。
2.sequence number(占4个字节)
TCP是面向字节流的,在TCP连接中传输的字节流中的每个字节都按照顺序编号。而序号字段值指的是本报文段所发送的数据的第一个字节的序号。
3.acknowledgemt number(占4个字节)
期望收到对方下一个报文段的序号值
TCP的可靠性在于建立在每一个数据报文都需要确认收到的基础上。说明通讯的任何一方在收到对方的一个报文之后,都要发送一个相应的确认报文,来表示确认收到,那么确认报文就会包含确认号
_4.offset _
是指TCP报文段的首部长度,TCP报文段的数据起始处距离TCP 报文的起始处的距离
5.Reserved
保留为今后使用(6位)
6.标志位TCP Flags(各占1位,共六位。每位的值1和0)
紧急URG
当 URG = 1 的时候,表示紧急指针(Urgent Pointer)有效。
它告诉系统此报文段中有紧急数据,应尽快传送,而不要按原来的排队顺序来传送。
URG 要与首部中的 紧急指针 字段配合使用。
确认ACK
当 ACK = 1 的时候,确认号(Acknowledgemt Number)有效。
一般称携带 ACK 标志的 TCP 报文段为「确认报文段]。
TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 设置为 1。
推送PSH
当PSH=1的时候,表示该报文段高优先级,接收方TCP应尽快推送给接收应用程序,不用等到整个TCP缓存都填满后再交付
复位RST
当RST=1时,表示TCP连接中出现严重错误,需要释放并重新建立连接。携带RST标志的TCP报文段为 [复位报文段]。
同步SYN
当SYN=1时,表示这是一个请求连接的报文段。携带SYN标志的TCP报文段为[同步报文段]。
终止FIN
当FIN=1时,表示此报文的发送方的数据已经发动完毕,并要求释放TCP连接。携带FIN 标志的报文段称为[释放报文段]
7.窗口大小 Windows size
指出现在允许对方发送的数据量,告诉对方本端的TCP接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。窗口大小的值是指,本报文段首部中的确认号算起,接收方目前允许对方发送的数据量。
8.校验和TCP Checksum
由发送端填充,接收端对TCP报文段执行CRC算法,以检验TCP报文段在传输过程中是否损坏。校验范围包括首部和数据两部分,是TCP可靠传输的重要保障。
9紧急指针
仅在 URG = 1 时才有意义,它指出本报文段中的紧急数据的字节数。
当 URG = 1 时,发送方 TCP 就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍是普通数据。
因此,紧急指针指出了紧急数据的末尾在报文段中的位置。
10.数据部分
TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。
TCP三次握手
TCP三次握手是建立连接的过程
TCP三次握手的具体过程:
1.客户端主动打开,发送请求连接报文段,此报文段中SYN=1,序号seq=x.此时客户端进入同步发送(SYN_SENT)状态,等待服务器端确认。
2.服务器端收到客户端发来的请求连接报文段,并向客户端发送同意链接的确认报文段,该报文段SYN=1,ACK=1,seq=y,ack=x+1.此时服务器端进入同步发送(SYN_RVCD)状态,这个状态称为半连接状态。
3.客户端再次进行确认,将ACK设置为1,seq=x+1,ack=y+1发向服务器,最后客户端与服务器端都将进入ESTABLISHED状态。
为什么在第三步中客户端还要再进行一次确认?
为了防止已经失效的连接请求报文端突然又传回到服务器。假如客户端发送的第一个连接请求报文只是在网络节点长时间滞留,以至于延误到连接释放以后的某个时间点才到达服务器,本来这个连接请求已经失效了,但服务器收到失效的连接请求报文段后,误认为 这是客户端发出的一次新的请求连接,假设不采用三次握手,那么服务器端发出确认,就会建立连接,一直等待服务器端发来数据,这样服务器端的许多资源就浪费了。所以有第三次握手,客户端不向服务器端发送确认请求,服务器端由于收不到确认,就知道客户端并没有要建立连接。
TCP四次挥手
TCP四次挥手是TCP连接释放的过程
当客户端没有数据再需要发送给服务器端时,就需要释放客户端的连接
四次挥手的具体过程:
数据传输结束后,通讯的双方都可以释放连接,此时,客户端和服务器将处于ESTABLISHED(已建立连接)状态。
1.例如客户端向先释放连接,客户端向服务器端发出释放连接报文段,该报文段FIN=1,seq=u.此时客户端将从ESTAB_LISHED状态切换到FIN_WAIT1(终止等待1)状态,等待服务器的确认。
2.服务器收到客户端发来的请求释放报文段后向客户端发出确认报文,该报文段ACK=1,seq=v,ack=u+1.此时服务器进入CLOSE_WAIT(关闭等待)状态。客户端进入FIN_WAIT2(终止等待2)状态。
此时处于半关闭状态,A已经没有数据发送的情况了,如果B还有数据发送,不会立即断开连接,要等数据全部发送完成以后。
3.服务器向客户端发起释放连接请求报文,该报文FIN-1,ACK=1,seq=w,ack=u+1,此时服务器进入LAST_ACK(最后确认)状态。等待客户端确认。
4.客户端收到服务器的连接释放报文段后,必须对此报文进行确认,此报文段ACK=1,seq=u+1,ack=w+1.客户端在收到服务器发来的终止连接的数据包并返回一个数据包后,客户端将进入TIME-WAIT状态再等待两个MSL时间之后,从TIME-WAIT切换到了CLOSE关闭状态。服务器将再收到最后确认后从LAST_ACK切换到CLOSE关闭状态。