理解TCP/IP协议的工作原理
多年来TCP/IP协议一直被公众称呼为“一个协议”,事实上它是一组协议的集合,IP工作在OSI七层模型的网络层,提供网络传输,但是并不提供其可靠性传输控制。而TCP工作在OSI七层模型的传输层,并提供其可靠性传输控制。那么首先需要说明的是:“什么是可靠性传输控制?”所谓可靠性传输控制是指面向连接的一种确认数据交付方式,具体的说,就是在数据正式传输之前,利用一种触发和认定的方式来保证发送方与接收方之间的可靠性,以防止数据在传输的过程中出现丢包及其他传输不可达的现象。这好比人类世界在交换价值产品之前,必须保证接收的人能真正地收到发出的产品,接收方在收到产品之后用一种回应的方式告知发送方,产品已经成功到达。
TCP协议的特点:由于提供了面向连接的可靠交付,所以TCP协议常用于可靠性较差的网络环境中,比如Internet。但是,正是由于TCP协议面向连接的可靠交付使其传输的速度较慢,至少比UDP协议更慢,这无疑证实了技术界的一个观念:“无所谓最好的传输协议,一切皆应需而动,任何技术都是一把“双刃剑”,如果需求是稳定,那么就必须牺牲速度,如果需求是速度,就必须牺牲可靠性!”
注意:上面描述了TCP协议的核心价值是确保传输的可靠性,并使用了人类世界在交换价值产品的一个实例来说明了如何完成可靠性交付。但是现在的问题在于在计算机网络技术领域里,两台通信设备或者计算机之间将采用一种什么样的方式来完成可靠性交付?
TCP协议的“三次握手”是学习的核心
TCP协议的“三次握手”是完成可靠性交付过程的核心,所以本小节将以描述TCP协议的网络世界中著名的“三次握手”为重点。
TCP协议是一个相互触发、相互确认的过程。客户机要触发服务器,服务器也要触发客户机。建立握手状态的标记syn=1表示开始触发,ack=1表示对触发的回应确认。并且在TCP建立可靠连接时只会使用这两个标记。正确的TCP握手过程如图4.44所示。
n客户机要触发服务器,向服务器发出syn=1的信号。
n服务器向客户机发送ack=1的确认信号。
n服务器再向客户机发送syn=1的触发信号,以达到相互触发的效果。
n客户机再回应服务器的触发信号ack=1。
上述为TCP握手过程,但是过程却就是四次握手了,并非所谓的“TCP三次握手”。那么为什么会叫“TCP三次握手”呢?这是因为服务器与其将给客户机的ack=1确认信息和触发客户机的syn=1分成两次发送,倒不如将其两次合并成一个信号:syn=1,ack=1。其实syn=1是触发客户机的,而ack=1是响应客户机触发的消息。所以将四次握手变三次,这是“TCP三次握手”的得名,也是对TCP正确的理解,如图4.45所示。
关于TCP的滑动窗口与确认机制
在面向连接的数据传办输过程中,任何数据在传递的过程中都可能损坏、丢失、或者重传,在这种情况下如果没有一种保障机制,那么数据在传输的过程中可能导致协议出错。所以面向连接的协议提出了一种保障机制,让接收方在收到数据后进行确认,如下图4.46所示,发送方发送1,接收方接收1并反回发送确认ACK2,发送方收到接收的ACK2就发送2,这种方式叫做TCP使用期待确认方式,也就是确认号就是所期待发送的下一数据。当接收方收到接收2后发送确认ACK3,发送方收到ACK3后发送数据3。这个过程中TCP的窗口大小为1,也就是收送一个数据,确定一个数据,然后再发送一个数据,这种方式确保了数据的可靠性,但是丧失了效率,那么网络的吞吐量将变得很低,更好的办法是将TCP窗口的大小调高,比如将原有窗口1调整为3,如下图4.47所示,发送方一次发送三次1、2、3接收方接收1、2、3后返回确认ACK4,后继发送同理,通过调整TCP窗口后,网络的吞吐量与使用率明显提高。事实上这是TCP的一种流控机制,这一点应试人员要特别小心,后面会出现相应的试题分析。
当分段的数据到达目的地如何重组:
在OSI模型的传输层为了方便更好的传输数据,会对大型数据进行分段,将其分割更小的数据块,以便于传输。由于Internet传输系统的原因,比如:一个被分割的原始数据的分段,可能通过不同的路由路径到达目标的数据分段,可能存在着先后不同的到达顺序,或者是出现了损环或者重传,在这种情况下,目标主机怎样重新组合并还原这些分段,如何对这些分段进行确认将是一个问题。大型数据被分段后,传输层协议会为这些分段分别打上序列号,到达目标后可以根据这些序列号来还原数据,关于确认这些分段可靠性的方案是对这些数据分段采取期待确认,比如一个数据分段的序列号是100,那么目标将返回101的序列确认,至于到底是对每个数据分段进行确认还是一次性确认多个数据分段这和TCP的滑动窗口有关。
关于TCP协议的安全威胁
TCP三次握手的漏洞如图4.48所示。TCP在数据正式发送以前必须与对等端完成三次握手的状态,然后再进行真正的数据转发,那么在这个TCP三次握手的状态完成前,TCP将会处于半开会话状态。现在假想一种情况:202.202.1.100/24是一个发动恶意攻击的黑客,想要攻击202.202.1.254的Web服务器,于是利用一个假IP为192.168.1.100的地址作为源IP地址,不断地向202.202.1.254的服务器发送TCP连接请求。服务器收到了许多的TCP的源地址为192.168.1.100的syn=1的数据报文,肯定会对该TCP会话作ack=1的确认,并发出syn=1的触发192.168.1.100主机的二次会话,但是这个192.168.1.100地址根本就不存在,服务器将永远都等不到192.168.1.100给它的最后确认。这时的服务器上会存放许多半开的TCP会话,这将直接导致服务器的NIC、内存、CPU的占用率超载,这种攻击方式叫做基于TCP半开会话的洪水攻击,是属于denial of service(DOS)拒绝式服务攻击的一种。
演示:取证TCP/IP协议的三次握手过程
演示目标:在实时通信的环境下取证TCP协议的“三次握手”过程。
演示环境:如图4.49所示的演示环境。
4.49
演示背景:为了演示环境更真实,可将192.168.0.100这台计算机构建成一台Web服务器,然后192.168.0.101这台计算机去访问192.168.0.100所提供的Web服务,然后捕获并分析整个通信过程中的数据帧,重点观察TCP协议“三次握手”的取证的过程。
演示步骤:
第一步:为演示环境中的两台计算机配置IP地址,并测试连通性,如下图4.50所示为在192.168.0.101的客户机上对192.168.0.100的Ping检测。
第二步:配置192.168.0.100为Web服务器,建议这个过程由CCNA的教员完成。并在该服务器上启动Wireshark协议分析器软件,开启捕获功能,然后在192.168.0.101的客户机上打开IE,并在地址栏输入“http://192.168.0.100”去访问服务器。当完成访问后,可在Wireshark协议分析器看到如下图4.51所示的TCP三次握手的整体效果。
第三步:现在拆分TCP三次握手的三个数据帧,如图4.52所示为TCP协议的第一次握手;如图4.53所示为TCP协议第二次握手;如图4.54所示为TCP协议第三次握手。