TCP/IP为什么要进行三次握手?

news/2024/7/5 20:46:44

    定义

三次握手(three times handshake;three-way handshake)所谓的“三次握手”即对每次发送的数据量是怎样跟踪进行协商使数据段的发送和接收同步,根据所接收到的数据量而确定的数据确认数及数据发送、接收完毕后何时撤消联系,并建立虚连接。为了提供可靠的传送,TCP在发送新的数据之前,以特定的顺序将数据包的序号,并需要这些包传送给目标机之后的确认消息。TCP总是用来发送大批量的数据。当应用程序在收到数据后要做出确认时也要用到TCP。

第一次
      第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
     第二次
     第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
    第三次
    第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

我们可以用一个“黄河长江的故事来描述这个过程”。

第一次握手:黄河发起呼叫,长江收到了。这时长江可以确认的是,黄河的发信机和自己的收信机是好的,否则的话他收不到黄河的呼叫;黄河能确认什么呢?他什么也不能确认,有可能自己的电台除了指示灯是好的,其它都是坏的,他在对着一台铁疙瘩发功。

第二次握手:长江回应,黄河收到了。这时黄河可以确认的是,自己和长江的收发信机都是好的,否则的话他收不到长江的回应信号。这时黄河可以说正事了吗?还不能,虽然长江发出了回应,但他并不能确认自己的发信机和黄河的收信机都是好的。

第三次握手:黄河对长江的回应进行回应。这时黄河很清楚,双方收发信机都是好的,自己的这次回应长江肯定能收到,这个回应的目的只是消除长江对黄河的收信机和长江自己的发信机的担心。然后,黄河不必等长江的再次回应就可以说正事了。


目的

消除旧有连接请求的SYN消息对新连接的干扰,同步连接双方的序列号和确认号并交换TCP 窗口大小信息。

为什么要三次握手

既然总结了TCP的三次握手,那为什么非要三次呢?怎么觉得两次就可以完成了。那TCP为什么非要进行三次连接呢?在谢希仁的《计算机网络》中是这样说的:
为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
在书中同时举了一个例子,如下:
“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”
这就很明白了,防止了服务器端的一直等待而浪费资源。

这样按照书本的说法可能很费解,我们换一种说法。
设想:如果只有两次握手,那么第二次握手后服务器只向客户端发送ACK包,此时客户端与服务器端建立连接。在这种握手规则下: 
        假设:如果发送网络阻塞,由于TCP/IP协议定时重传机制,B向A发送了两次SYN请求,分别是x1和x2,且因为阻塞原因,导致x1连接请求和x2连接请求的TCP窗口大小和数据报文长度不一致,如果最终x1达到A,x2丢失,此时A同B建立了x1的连接,这个时候,因为AB已经连接,B无法知道是请求x1还是请求x2同B连接,如果B默认是最近的请求x2同A建立了连接,此时B开始向A发送数据,数据报文长度为x2定义的长度,窗口大小为x2定义的大小,而A建立的连接是x1,其数据包长度大小为x1,TCP窗口大小为x1定义,这就会导致A处理数据时出错。
        很显然,如果A接收到B的请求后,A向B发送SYN请求y3(y3的窗口大小和数据报长度等信息为x1所定义),确认了连接建立的窗口大小和数据报长度为x1所定义,A再次确认回答建立x1连接,然后开始相互传送数据,那么就不会导致数据处理出错了。

time_wait是做什么的

假设客户端发送的最后一个ACK丢失了,服务器会重发它发送的最后一个FIN,所以客户端必须维持一个状态信息,以便能够重发ACK;如果不维持这种状态,客户端在接收到FIN后将会响应一个RST,服务器端接收到RST后会认为这是一个错误。如果TCP协议能够正常完成必要的操作而终止双方的数据流传输,就必须完全正确的传输四次握手的四个节,不能有任何的丢失。这就是为什么socket在关闭后,仍然处于 TIME_WAIT状态,因为他要等待以便重发ACK。





http://www.niftyadmin.cn/n/3657226.html

相关文章

[概念] 争议解决程序 (dispute resolution procedures)

PMBOK (2004 3rd 英) P292关于合同变更控制系统中提到了争议解决程序,但是没有详细展开。http://www.venables.co.uk/adr.htm 给出了一些概念和解释:Alternative Dispute Resolution (ADR) was introduced in the 1980s for the resolution of commercia…

记一次网易2018实习生笔试-大数据岗位

记一次网易2018实习生笔试-大数据岗位 网易2018实习生招聘笔试题-大数据开发实习生-云音乐 凭借印象和草稿,记录下一些题目。 共有20道选择题,3道编程题,2道简答题。 选择题 HDFS Block的概念。TCP/UDP。DNS、Telnet、SMTP、POP等与TCP、…

Java NIO(一)入门篇

概念 java.nio(java new IO),是jdk1.4 里提供的新api ,为所有的原始类型提供缓存支持。Sun 官方标榜的特性如下: 为所有的原始类型提供(Buffer)缓存支持。字符集编码解码解决方案。 Channel :一个新的原始I…

[概念] 敏感性分析(Sensitivity Analysis) 和龙卷风图(tornado diagram)

PMBOK(2004 3rd 英) P257关于风险定量分析模型技术中有一种技术叫敏感性分析(Sensitivity Analysis), 用于比较各种风险在其他风险处于基准水平的情况下对项目整体产生的影响大小,从而来找出影响最大的风险。龙卷风图(tornado diagram)是一种常用的技术,…

[概念] 风险识别工具 - 影响图(Influence Diagram)

PMBOK(2004 3rd 英) P248关于风险识别的图形技术中提到了因果图(Cause-and-Effect diagram),流程图(flow chart)和影响图(Influence diagram),其中前两个图由于也是质量管理的工具,在相关章节中有详细介绍和图例,但是影响图尽在此处出现&…

Control Account (控制账户)

Control Account 在项目的进度管理中首次被提到(PMBOK 2004 3rd Edition P129),第一次看到这两个英文单词很是奇怪为什么一个WBS的分解层次会用到Account这个单词?一定是有原因的。在随后的项目费用管理中给出了答案(PMBOK 2004 3rd P158),Co…

蚁群算法浅谈

本文参考:http://www.cnblogs.com/biaoyu/archive/2012/09/26/2704456.html http://blog.163.com/ykn_2010/blog/static/1420333362012111411258466/ 简介 蚁群算法(ant colony optimization, ACO),又称蚂蚁算法,是一种用…

基于nb-iot和arduino的气象站(一)

基于nb-iot和arduino的气象站(一)温湿度和紫外线传感器 上一篇已经介绍了项目的大概情况。 这一篇先讲温湿度传感器和紫外线传感器的使用。 一、温湿度传感器 我使用的温度传感器为DHT21。 DHT21数字温湿度传感器是一款含有已校准数字信号输出的温湿…