这里不过多阐述计算机网络的体系结构,本文主要是想阐述三次握手和可靠连接之间的联系。TCP协议全称传输控制协议(Transmission Cotrol Protocol)。
1、TCP协议运行在哪一层
TCP运行在运输层。
2、TCP协议的可靠是什么意思
步入主题,很多同学的回答是TCP三次握手确保了可靠连接,这样说非常不严谨,这个可靠并不是说因为三次握手所以建立起的这个连接是可靠的,三次握手只是建立连接的一个方式,可靠的意思是说TCP协议中的各种机制使得其建立连接后的信道是可靠的,更严谨的说,是能确保这个信道数据的传输是可靠的。
2.1、其中的面向连接是什么意思
意思是说TCP传输数据需要先建立连接,数据传输完毕要释放连接,就像通信双方中间建立了一条无形的物理连接一样(逻辑信道)。
那通信双方是谁呢,在计算机中,叫套接字(socket)(对应的,Linux有Socket Statistics,简称ss命令可以查看本机网络连接),写法是IP地址:端口号,相当于两个端点之间建立了一条连接,如192.168.1.1:8000---192.168.1.2:8000(所以一个端点可能有不同的几条连接)。
2.2、可靠的保证
前面提到,TCP的可靠是由其中各种机制保证的。那不妨想下,两个人通信可能会出现什么问题?例如在课堂上,A写了张纸条丢给B,那B可能收到了纸条,B也可能没有,B收到了纸条又可能存在什么问题?B收到了,但A不知道B收到了(假设A无法看见B是否捡起了纸条),B收到了但是A给定纸条上的信息有错误...,等等一系列情况,TCP的各种机制就是确保这些情况不会影响数据传输的(所以可以想一下,TCP相比UDP是比较耗时复杂的,因为它为了确保可靠传输多做了很多工作)。
本篇文章主要为了说明可靠传输并不仅仅是三次握手实现的,因此只简单例举几种情况和几种相应的机制。例1,怎么确认B收没收到?所以TCP协议中会有停止等待机制,即每发送一个分组,等待对方的确认再继续发送。例2,等多久?B没收到怎么办?所以TCP协议有个超时重传机制,即每次发送完分组,会开始计时,规定时间内没收到确认会重发。
上述只是简单的介绍两个确保可靠传输的机制,从上述例子中,可以再想一下,怎么知道这个分组发过了?分组是否要编号?多长时间重发?检查到分组数据有错误怎么办?数据传输效率怎么样?这就是可以继续深入的问题了。
3、可以说TCP的三次握手就能确保信道可靠的吗
是不能的,有一个经典的问题,即蓝军通信问题。蓝军1和蓝军2需要协同作战对抗白军,现在蓝军1需要把命令传给蓝军2,假设蓝军1将作战信息发送给蓝军2,此时蓝军2收到信息并回复“蓝军2已收到”,但蓝军2并不知道蓝军1是否收到“蓝军2已收到”信息,假设蓝军1收到“蓝军2已收到”,那蓝军1,2有百分百把握执行作战信息吗,其实是没有的,需要蓝军1再发一次“蓝军1对信息-蓝军2已收到,已收到”给蓝军2。
不难发现,双发永远无法确保自己发的最后一条信息是否被对方接收,这里的关键是知道最后一条信息是否被对方收到,三次握手也同理,那三次握手解决了这个问题吗,其实是没有的,下面是三次握手图解(摘自《计算机网络第七版》)。
图示中SYN(同步)和ACK(确认)均是TCP报文段中的首部字段,简单来说步骤是服务器等待连接,客户端随机选择序号是x的分组(数据会被拆成一个个分组,并且编好序号)传给服务器,服务收到后把ack置为x+1,并且发送自己的序号是y的数据,客户端收到后ack=x+1后,知道x收到了,接着把x+1的发送给服务器,由此交换三次报文就算建立连接了,所以三次握手并没有解决最后一条信息问题,只是说确认双方存在建立了条连接罢了。换句话说,这里并不关注最后一条信息,只保证接收到当前数据并且发送下条数据。
总结,下面就回到开头那句‘更严谨的说,是能确保这个信道数据的传输是可靠的’了,TCP各种机制是确保了数据(每一个分组)被正确接收,就像即使是一条保护的很好的物理线路,也不能保证这条线路永远不会损坏,但是协议得知道数据有没有传过去,是不是传对了等等。
PS:有基本的概念后,再去学习运输层,就会明白很多了,例如为了解决前面那些问题的超时重传,选择确认等机制等的具体实现。