TCP是面向连接、可靠的进程到进程通信的协议。TCP提供双全工服务,即数据可在同一时间双向传输,每一个TCP都有发送缓存和接受缓存,用来临时存储数据。
TCP协议规定,端口号拼接到IP地址即构成套接字——TCP连接的端点。
套接字(socket)=[IP地址:端口号】
TCP连接用式子表示为
TCP连接::={socket1,socket2}={(IP1:port1) ,(IP2:port2)}
在面向连接通信中,连接的建立和断开是非常频繁的过程。TCP连接的建立采用客户服务器方式,主动发起连接建立的应用进程成为客户,而被动等待连接的应用进程成为服务器。
源端口号:数据发起者的端口号,16bit。
目的端口号:数据接收者的端口号,16bit。
序号:32bit的序列号,由发送方使用。
确认序号:32bit的确认号,是接收数据方期望收到发送方的下一个报文段的序号,因此确认序号应当是上次已成功收到数据字节序号加1。
首部长度:首部中32bit字的数目,可表示15*32bit=60字节的首部。一般首部长度为20字节
保留:6bit, 均为0
紧急URG:当URG=1时,表示报文段中有紧急数据,应尽快传送。
确认比特ACK:ACK = 1时代表这是一个确认的TCP包,取值0则不是确认包。
推送比特PSH:当发送端PSH=1时,接收端尽快的交付给应用进程。
复位比特(RST):当RST=1时,表明TCP连接中出现严重差错,必须释放连接,再重新建立连接。
同步比特SYN:在建立连接是用来同步序号。SYN=1, ACK=0表示一个连接请求报文段。SYN=1,ACK=1表示同意建立连接。
终止比特FIN:FIN=1时,表明此报文段的发送端的数据已经发送完毕,并要求释放传输连接。
窗口:用来控制对方发送的数据量,通知发放已确定的发送窗口上限。
检验和:该字段检验的范围包括首部和数据这两部分。由发端计算和存储,并由收端进行验证。
紧急指针:紧急指针在URG=1时才有效,它指出本报文段中的紧急数据的字节数。
选项:长度可变,最长可达40字节.。
序列号(sequence number):Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
确认号(acknowledgement number):Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。
<1>由客户端向服务器发送一段TCP报文:
●控制位为SYN,SYN置“1”,表示“请求建立新连接”;
●序号为Seq=X(X一般为0);
随后客户端进入SYN-SENT阶段。
<2>服务器端接收到来自客户端的TCP报文之后,结束LISTEN阶段。并向客户端发送一段TCP报文:
●控制位为SYN和ACK,SYN、ACK置“1”,表示“确认客户端的报文Seq序列号有效,服务器能正常接收客户端发送的数据,并同意创建新连接”(即告诉客户端,服务器收到了你的数据);
●序列号为Seq=y(y一般为0);
●确认号为Ack=x+1,表示收到客户端的序列号Seq并将其值加1作为自己确认号Ack的值;
随后服务器端进入SYN-RCVD阶段。
<3>客户端接收到来自服务器端的确认收到数据的TCP报文之后,明确了从客户端到服务器的数据传输是正常的,结束SYN-SENT阶段。并返回最后一段TCP报文:
●控制位为ACK,ACK置“1”,表示“确认收到服务器端同意连接的信号”。
●序列号为Seq=x+1,表示收到服务器端的确认号Ack,并将其值作为自己的序列号值;
●确认号为Ack=y+1,表示收到服务器端序列号Seq,并将其值加1作为自己的确认号Ack的值;
随后客户端进入ESTABLISHED阶段。
服务器收到来自客户端的“确认收到服务器数据”的TCP报文之后,明确了从服务器到客户端的数据传输是正常的。结束SYN-SENT阶段,进入ESTABLISHED阶段。此后客户端和服务器端进行正常的数据传输。这就是“三次握手”的过程。
<1>首先客户端想要断开连接,向服务器端发送一段TCP报文:
●控制位为FIN,FIN置“1”,表示“请求释放连接“;
●序列号为Seq=W;
随后客户端进入FIN-WAIT-1阶段,即半关闭阶段。并且停止在客户端到服务器端方向上发送数据,但是客户端仍然能接收从服务器端传输过来的数据。
<2>服务器端接收到从客户端发出的TCP报文之后,确认了客户端想要释放连接,随后服务器端结束ESTABLISHED阶段,进入CLOSE-WAIT阶段(半关闭状态)并返回一段TCP报文:
●控制位为ACK,ACK置“1”,表示“接收到客户端发送的释放连接的请求”;
●序列号为Seq=Z;
●确认号为Ack=W+1,表示是在收到客户端报文的基础上,将其序号Seq值加1作为本段报文确认号Ack的值;
随后客户端结束FIN-WAIT-1阶段,进入FIN-WAIT-2阶段。
<3>服务器端自从发出ACK确认报文之后,再次向客户端发出一段TCP报文:
●控制位为FIN、ACK,FIN、ACK置“1”,表示“已经准备好释放连接了”。注意:这里的ACK并不是确认收到服务器端报文的确认报文。
●序列号为Seq=Z;
●确认号为Ack=W+1;表示是在收到客户端报文的基础上,将其序号Seq值加1作为本段报文确认号Ack的值。
随后服务器端结束CLOSE-WAIT阶段,进入LAST-ACK阶段。
<4>客户端收到从服务器端发出的TCP报文,确认了服务器端已做好释放连接的准备,结束FIN-WAIT-2阶段,进入TIME-WAIT阶段,并向服务器端发送一段报文:
●控制位为ACK,ACK置“1 ”,表示“接收到服务器准备好释放连接的信号”。
●序列号为Seq=W+1;表示是在收到了服务器端报文的基础上,将其确认号Ack值作为本段报文序号的值。
●确认号为Ack=Z+1;表示是在收到了服务器端报文的基础上,将其序号Seq值增加1作为本段报文确认号的值。
随后客户端结束TIME-WAIT阶段,进入CLOSED阶段,由此完成“四次挥手”。
mu
#####第一个包#######PC1##########
192.168.100.5###源IP###
192.168.100.6###目标IP###
63659###源端口号###
22###目标端口###
Seq=0、SYN=1
#####第二个包#######PC2##########
192.168.100.6###源IP###
192.168.100.5###目标IP###
22###源端口号###
63659###目标端口###
Seq=0、ACK=1、SYN=1
#####第三个包#######PC1##########
192.168.100.5###源IP###
192.168.100.6###目标IP###
63659###源端口号###
22###目标端口###
Seq=1、ACK=1
#####第一个包#######PC1##########
192.168.100.5###源IP###
192.168.100.6###目标IP###
55426###源端口号###
22###目标端口###
ACK=1、FIN=1
#####第二个包#######PC2##########
192.168.100.6###源IP###
192.168.100.5###目标IP###
22###源端口号###
55426###目标端口###
ACK=1
#####第三个包#######PC2##########
192.168.100.6###源IP###
192.168.100.5###目标IP###
22###源端口号###
55426###目标端口###
ACK=1、FIN=1
#####第四个包#######PC1##########
192.168.100.5###源IP###
192.168.100.6###目标IP###
55426###源端口号###
22###目标端口###
ACK=1
PS:在实际抓包操作中,连接释放四挥手进程并不一定需要完整的四层,其中RST包邮强制断开连接的作用