(图解HTTP上描述的知识)
1.4.2 确保可靠性的TCP协议
按层次分,TCP位于传输层,提供可靠的字节流服务。
所谓的字节流服务(Byte Stream Service)是指,为了方便传输,将大块数据分割成以报文段(segment)为单位的数据包进行管理。而可靠的传输服务是指,能够把数据准确可靠地传给对方。一言以蔽之,TCP协议为了更容易传送大数据才把数据分割,而且TCP协议能够确认数据最终是否送达到对方。
确保数据能到达目标
为了准确无误地将数据送达目标处,TCP协议采用了三次握手策略。用TCP协议数据包送出去后,TCP不会对传送后的情况置之不理,它一定会向对方确认是否成功送达。握手过程中使用了TCP的标志(flag)——SYN(synchronized)和ACK(acknowledgement)。
发送端首先发送一个带SYN标志的数据包给对方。接收端收到后,回传一个带有SYN/ACK标志的数据包以示传达确认信息。最后,发送端再回传一个带ACK标志的数据包,代表“握手”结束。
若在握手过程中某个阶段莫名中断,TCP协议会再次以相同的顺序发送相同的数据包。
除了上述三次握手,TCP协议还有其他各种手段来保证通信的可靠性。
(HTTP权威指南)
4.2.3 TCP连接的握手时延
建立一条新的TCP连接时,甚至是在发送任意数据之前,TCP软件之间会交换一系列的IP分组,对连接的有关参数进行沟通。如果连接只用来传送少量数据,这些交换过程就会严重降低HTTP的性能。
TCP连接握手需要经过几下几个步骤。
(1)请求新的TCP连接时,客户端要向服务器发送一个小的TCP分组(通常是40~60个字节)。这个分组中设置了一个特殊的SYN标记,说明这是一个连接请求。
(2)如果服务器接受了连接,就会对一些连接参数进行计算,并向客户端回送一个TCP分组,这个分组中的SYN和ACK标记都被置位,说明连接请求已被接受。
(3)最后,客户端向服务器回送一条确认信息,通知它连接已成功建立。现代的TCP栈都允许客户端在这个确认分组中发送数据。
HTTP程序员永远不会看到这些分组——这些分组都由TCP/IP软件管理,对其是不可见的。HTTP程序员看到的只是创建TCP连接时存在的时延。
通常HTTP事务都不会交换太多数据,此时,SYN/SYN+ACK握手会产生一个可测量的时延。TCP连接的ACK分组通常都足够大,可以承载整个HTTP请求报文,而且很多HTTP服务器响应报文都可以放入一个IP分组中去(比如,响应是包含了装饰性图片的小型HTML文件,或者是对浏览器高速缓存请求产生的304 Not Modified)。
最后的结果是,小的HTTP事务可能会在TCP建立上花费50%,或更多的时间。后者的小节会讨论HTTP是如何通过重用现存连接,来减小这种TCP建立时延所造成的影响的。
(腾讯)TCP三次握手,为什么是3次,不是2次,也不是4次?
答:这和计算机通信的安全和效率有关系。肯定是握手次数越多,连接成功的概率越大,比方说2次握手成功概率为80%,三次握手成功概率99%,四次握手成功概率99.%,随着握手次数的增多,造成的连接延迟会越来越大,效率会越来越低。综合考虑,握手三次时,既能保证连接的安全性,又能保证效率,是当前通信环境下的最优选择。所以TCP是三次握手。注意:不管握手多少次,都不能百分之百保证连接成功。TCP三次握手,如果中间任何一个环节出现问题,都要重新进行连接,直到连接成功为止。