TCP协议的三次握手
TCP/IP协议(Transmission Control Protocol/Internet Protocol)叫做传输控制/网际协议,又叫网络通讯协议,这个协议是Internet国际互联网络的基础。TCP/IP是网络中使用的基本的通信协议。虽然从名字上看TCP/IP包括两个协议,传输控制协议(TCP)和网际协议(IP),但TCP/IP实际上是一组协议,它包括上百个各种功能的协议,如:远程登录、文件传输和电子邮件等,而TCP协议和IP协议是保证数据完整传输的两个基本的重要协议。通常说TCP/IP是Internet协议族,而不单单是TCP和IP。TCP/IP协议使用范围极广,是目前异种网络通信使用的唯一协议体系,适用于连接多种机型,既可用于局域网,又可用于广域网,许多厂商的计算机操作系统和网络操作系统产品都采用或含有TCP/IP协议。TCP/IP协议已成为目前事实上的国际标准和工业标准。
TCP/IP是很多的不同的协议组成。 TCP用户数据报表协议,也称作TCP传输控制协议(Transport Control Protocol,可靠的主机到主机层协议),这里要先强调一下,传输控制协议是OSI网络的第四层的叫法,TCP传输控制协议是TCP/IP传输的6个基本协议的一种。两个TCP意思不相同)。TCP是一种可靠的面向连接的传送服务。它在传送数据时是分段进行的,主机交换数据必须建立一个会话。它用比特流通信,即数据被作为无结构的字节流。 通过每个TCP传输的字段指定顺序号,以获得可靠性。是在OSI参考模型中的第四层,TCP是使用IP的网间互联功能而提供可靠的数据传输,IP不停的把报文放到 网络上,而TCP是负责确信报文到达。在协同IP的操作中TCP负责:握手过程、报文管理、流量控制、错误检测和处理(控制),可以根据一定的编号顺序对非正常顺序的报文给予从新排列顺序。
在TCP会话初期,有所谓的“三握手”,即对每次发送的数据量是怎样跟踪进行协商使数据段的发送和接收同步,根据所接收到的数据量而确定的数据确认数及数据发送、接收完毕后何时撤消联系,并建立虚连接。为了提供可靠的传送,TCP在发送新的数据之前,以特定的顺序将数据包的序号,并需要这些包传送给目标机之后的确认消息。TCP总是用来发送大批量的数据。当应用程序在收到数据后要做出确认时也要用到TCP。由于TCP需要时刻跟踪,这需要额外开销,使得TCP的格式有些显得复杂。
TCP握手协议在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。完成三次握手,客户端与服务器开始传送数据,在上述过程中,还有一些重要的概念:未连接队列:在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于Syn_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。Backlog参数:表示未连接队列的最大容纳数目。
SYN-ACK :重传次数。 服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。
半连接存活时间:是指半连接队列的条目存活的最长时间,也即服务从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时我们也称半连接存活时间为Timeout时间、SYN_RECV存活时间。
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。如图1所示。第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据。
需要断开连接的时候,TCP也需要互相确认才可以断开连接,采用四次挥手断开一个连接,如图2所示。在第一次交互中,首先发送一个FIN=1的请求,要求断开,目标主机在得到请求后发送ACK=1进行确认;在确认信息发出后,就发送了一个FIN=1的包,与源主机断开;随后源主机返回一条ACK=1的信息,这样一次完整的TCP会话就结束了。
总结:
传输层是整个协议层的核心,而TCP是面向连接的传输协议,用于在不可靠的因特网上提供可靠的,端到端的字节流通信的协议。所以说。TCP在传输层有着很重要的地位。
而我认为TCP传输过程中建立连接是最重要的,TCP与UDP的区别也体现在这里,TCP需要在数据传输前建立连接。一部分保障了数据传输的可靠性。
还记得两军问题中由于两军距离问题在同步作战的方案中,需要建立连接,达成协议,但是由于不能确定对方是否接收到消息就会在双发无休止的建立连接。而三次握手协议不仅保持着协议双方的可靠通信,也不会使得双方的无休止的建立通信这个弊端。而对每个报文都增加了一个定时器,设计一个最大延时,使得超时的数据认定为丢失,同时不会因为无休止的等待,而耽误其他工作。
注意:
1.ACK=1和ack=随机数 不一样。
2.第三次握手seq=x+1是一个顺序号码。
3.整个过程是一个请求-回应-再次确认
TCP是一个面向连接的协议,面向连接是指任何一方向对方发送数据前必须先建立通道,比如像打
电话一样:必须要等到对方的手机响铃,并且对方接听电话时,才能与对方通信。而UDP则不是面向连
接的协议,基于
UDP协议的通信双方不需要事先与对方协商建立连接,也不管对方的IP地址与端口号
是否存在,就发送数据,这个处理方式有点像手机发短信,不管对方手机是否欠费或关机,我们就只管发送信息。
第一次握手:客户端发送SYN包(序列号seq=100),等待服务器的确认。
第二次握手:服务器收到
SYN包之后,必须确认客户端,所以就要发送ACK包(ACK=101),同时,服务器必须还必须发送SYN包(序列号seq=300)等客户端的确认。
第三次握手:客户端接收到
SYN+ACK包之后,向服务器发送确认包(ACK=301),次包发送
完毕之后,两者就可以进行数据交换了。 简单的来说:
C(客户端) S(服务器) C:发送SYN给S
S:如果成功,返回给C(SYN+ACK) C:如果成功,返回给S(ACK)
还可用个形象的例子说下:TCP的三次握手过程可以看成是某男生追某女生的过程。第一次握手就好比
是:男生向女生告白,说我喜欢你,然后男生等待女生的回应,第二次握手就好比是:女生收到男生的告白,而且该女生也喜欢次男生,她就可以给男生回应,说:我也喜欢你。第三次握手:男生收到该女生的回应,大喜,又发送消息过去,那我们正式交往吧!
1. 客户端发送数据完毕之后,提出要断开连接
2. 服务器收到FIN包后,对其作出反应,发送ACK包,确认这一方向的连接将关闭, 3. 等服务器的应用程序做好关闭准备时,服务器反方向发送FIN包,请求关闭连接请求, 4. 客户机对服务器发送的请求进行确认,并发送ACK包
也可简单的概述:
C(客户端) S(服务器) C:发送FIN给S
S:如果成功,返回给C(ACK)
S:应用程序做好关闭程序准备,发送FIN给C C:如果成功,返回给S(ACK)
同样也可以用个形象的例子说明:这个过程相当于男女双方分手的过程:
1,女方向男方提出分手,等待男方的回应
2,男方听到这个消息后,就给女方回应说:好吧!分就分
3,过段时间,男方突然觉得很没面子,想:“我一个大老爷们,应该是我提出分手”,于是,男方跟女方说:我们分手吧!
4,这时,女方就直接骂了句“神经病”。