一.TCP的段结构
源端口(16比特):表示发送方进程端口
目的端口(16比特):表示接收方进程端口
序列号seq(32比特):TCP对字节进行编号,例如,某数据段包括2000字节,若首字节编号为0,则下一个数据段首字节的序列号为0+2000=2000
确认号ack(32比特):是期望对方发送的下一个数据段的首字节序号,表示该序号之前的字节都已正确接收
报头长度(4比特):指出TCP报文的首部长度,随可选项的长度而改变
- URG:紧急比特。当为1时,表明此报文段中含有发送端应用进程标出的紧急数据,同时用“紧急指针”字段指出紧急数据的末字符。TCP必须通知接收方的应用进程“紧急数据”,并将“紧急指针”传送给应用进程
- ACK:确认字段。在TCP连接建立后所有的报文段必须把ACK标志位置1,而且只有ACK标志位为1时,确认号字段才有效
- PSH:推送功能。在进行Telnet或Rlogin等交互模式的连接时,该标志总是置位的。该标志置位,数据将尽快交付应用处理。
- RST:重置连接。用于复位相应的TCP连接,当通信过程中出现严重错误时,通信双方的任意一方发送RST位设置为1的报文段用于终止连接
- SYN:同步标志。用于在TCP建立连接时同步序号。在TCP连接建立请求报文和连接接受报文中,SYN置为1
- FIN:终止标志。发送方通过发送FIN为1的报文段说明数据发送已经结束,请求释放连接
二.搭建网络拓扑,配置设备参数
三.将模拟器切换到Simulation模式,建立TCP连接
在PC0的Web Browser的命令行中输入服务器的IP地址
由于协议栏中协议太多,我们可以对协议进行筛选,首先,点击Show All/None命令,隐藏全部协议,完成结果如下图所示:
然后,我们再点击Edit Filters命令,选择需要显示的协议“HTTP”,“TCP”,完成结果如下图所示:
四.分析TCP连接的建立(三次握手)
TCP连接的建立过程被形象地称为“三次握手”,因为通信双方在建立连接时需要发送三个报文
三次握手机制通过请求,确认,再确认三个报文确保TCP连接成功建立
1.第一次握手
A向B发送SYN=1的请求报文段,即“请求”报文,请求建立TCP连接,报文段的序号seq=x,第一次握手请求发送后A的状态为SYN-SENT,B在接收到请求后状态由LISTEN变为SYN-RCVD按照TCP的规定,这个请求报文段不能携带任何实际的数据,但是必须消耗掉一个序号。
客户端发出SYN请求报文,请求建立TCP连接,状态转变为SYN-SENT
报文序号SEQUENCE NUMB为0
确认序号ACK NUM为0
SYN同步标志置1
服务器收到TCP SYN报文,接受请求,状态由LISTEN转变为SYN-RECEIVED
报文序号SEQUENCE NUM为0
确认序号ACK NUM为0
SYN同步标志置1
2.第二次握手
B对于A的请求发送确认报文段,即“确认”报文,SYN=1,ACK=1(SYN表示B请求跟A建立连接,ACK表示对A的连接请求进行应答),报文段的序号seq=y,确认号ack=x+1,A接收到B的确认后,状态变为ESTABLISHED,B的状态依然为SYN-RCVD。
服务器回复了“确认”报文,状态仍然为SYN-RECEIVED
报文序号SEQUENCE NUM为0
确认序号ACK NUM为1
SYN同步标志置1
ACK同步标志置1
客户端收到服务器的确认,状态转变为ESTABLISHED
3.第三次握手
A对于B的确认报文段也发出确认报文,即“再确认”报文,ACK=1(表示对B的连接请求进行应答),确认号为B的序号y加1即ack=y+1,自身序号为seq=x+1(因为第一个请求建立连接报文已经消耗掉一个序号)。B接收到A的确认后,A和B的状态都将变为ESTABLISHED。
客户端回复了“确认”报文,状态仍然为ESTABLISHED
由于客户端的连接建立请求报文已消耗掉一个序号因此
报文序号SEQUENCE NUM为1
确认序号ACK NUM为1
ACK同步标志置1
服务器接收到客户端的确认后,状态也转变为ESTABLISHED
A和B的状态都将变为ESTABLISHED,此后双方就可以开始进行数据传输了。
接收方在接收到发送方发送的seq后,应答一个ack,ack的值等于seq+1,表示已要发送方开始发送seq+1位置的数据。
五.分析TCP连接的释放(四次挥手)
1.第一次挥手
A收到应用层的通知,向B发送FIN=1,ACK=1的连接释放报文段,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,A的状态转换为FIN-WAIT-1按照TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
客户端发送FIN报文,请求释放,客户端的状态转换为FIN-WAIT-1
报文序号SEQUENCE NUM为103(即客户机之前已传送过的数据的最后一个字节的序号加1)
确认序号ACK NUM为472
终止控制位FIN置1
ACK控制位置1
2.第二次挥手
B收到A的连接释放请求并向A发出确认报文,ACK=1,ack=u+1,B的确认报文序列号seq=v,B的状态转换为CLOSE-WAIT。
⇒ B通知高层的应用进程,A向B的方向就释放了,这时候处于半关闭状态,即A已经没有数据要发送了,但是B若发送数据,A依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
服务器收到客户端的连接释放请求,服务器的状态转换为CLOSE-WAIT
报文序号SEQUENCE NUM为472
确认序号ACK NUM为103
终止控制位FIN置1
ACK控制位置1
服务器回复确认报文
报文序号SEQUENCE NUM为472
确认序号ACK NUM为104
终止控制位FIN置1
ACK控制位置1
3.第三次挥手
B将最后的数据发送完毕后,就向A发送FIN=1的连接释放报文段,FIN=1,ACK=1,ack=u+1,由于在半关闭状态,B很可能又发送了一些数据,假定此时的序列号为seq=w(不一定为v),此时,B的状态转换为LAST-ACK,等待A的确认。
服务器向客户端发送FIN报文,服务器的状态转换为LAST-ACK
报文序号SEQUENCE NUM为472
确认序号ACK NUM为104
终止控制位FIN置1
ACK控制位置1
4.第四次挥手
A收到了B的释放连接请求并向B发送了ACK=1的确认报文,seq=u+1,ack=w+1,B的状态转变为TIME-WAIT 。此时TCP连接还没有释放,必须经过2MSL(最长报文段寿命)的时间后,才进入CLOSED状态。
⇒ B收到了A的确认报文,B向A的方向就释放了。
客户端收到服务器的请求报文,客户端状态转换为CLOSED
报文序号SEQUENCE NUM为472
确认序号ACK NUM为104
终止控制位FIN置1
ACK控制位置1
客户端回应ACK报文
报文序号SEQUENCE NUM为104
确认序号ACK NUM为472
ACK控制位置1
服务器收到ACK报文,服务器状态转换为CLOSED
报文序号SEQUENCE NUM为104
确认序号ACK NUM为472
ACK控制位置1