前言
TCP协议(Transmission Control Protocol)是计算机网络中最常用的传输层协议之一,负责提供可靠、面向连接的数据传输服务。它存在的目的就是为了让传输更可靠,也更稳定,但同样也会对端口与端口之间的传输速率造成影响。它一般采用两种方式来使传输更加可靠。一种是面向连接,而另一种则是可靠传输。
面向连接
在面向连接当中协议为了进行可靠的最开始的连接的过程我们一般称之为“三次握手”,而最后结束传输的过程一般称之为“四次挥手”或“四次断开”。“三次握手”的实质就是在传输数据前先进行三次”握手“来确认是否可以执行发送或接受再或者如何接收数据等。
那么可以二次握手建立连接吗?很显然是不行的,就用以下的图来举例。
如图就展示了两种关于两次握手就建立连接所产生的失败场景。
第一种场景是因为超时定时器到时后任然没有接收到服务端发送的回应,随后又发出一个建立连接的请求,但是随后就又收到了第一次请求所收到到的连接建立回应,通讯结束。但通信结束后,服务端又收到了之前客户端重复发出的建立请求,那但服务端这时就没有了“握手”对象了,服务器会维持一个半连接的状态,同时还会占用服务器资源。
第二种场景则是在第一次发送建立连接的请求,在超时定时器到时后任没收到服务端的确认信息随后又重发了一条建立请求的连接,但在重发之后就收到了第一次发送请求的回复,之后发出数据,但超时定时器到时后又没收到回应,又重发了一段数据过去,之后又收到了第一次请求的回应,之后通讯关闭。但在通讯关闭后服务器收到了第一次重发的建立请求连接,之后又收到了重发的数据,但此时服务器接收到的数据已经是“老”数据了,也就是服务器把旧数据到新数据来收的问题。所有两次握手是不行的。
当然上述问题皆可同三次握手来避免掉。
首先我们要明白什么是连接,这里的连接就是两个应用进程建立的TCP的连接,其本质就是双方知道要和对方通信,还会因此建立缓冲区(也可以理解为准备好通讯所需要的资源),并且双方也要知道对方的初始序号,而且还要分别确认。也就是客户端要改告诉服务器自己的初始序号,服务端也要对其进行确认同时告诉服务端自己的初始序号给客户端,客户端也要发出ack来确认服务端发出的,也就是说至少要经过三次握手。如图所示:
第一次握手服务端向客户端发送自己的序列号x,服务端收到好对其进行回应,同时发出自己序列号y,客户端收到之后也会对其进行回应,随后连接建立。从图中也可以看出,服务端将接收客服端发出的x+1及之后的,而客户端将接收服务端y+1及之后的。
第三次握手通常会与第一次传递数据一起发送。
那么三次握手是如何解决两次握手所产生的情况呢?
首先是第一种,由于是三次握手才能建立连接。而服务器在收到之后收到客户端重发的建立连接请求后,服务端依然会对客户端进行回应,但客户端此时并没有建立连接请求,会拒绝的与客户端建立联系,因此在三次握手建立连接当中是不可能出现虚假连接或半连接的情况。同样,在第二种情况当中,由于不存在半连接或虚假连接,当服务端收到之前重复发送的数据包之后会因为没有建立连接或者接收到的数据包序号不在接收范围之类的,服务端直接丢弃掉。
由此可见,三次连接可以避免两次连接所产生的问题,如避免维持虚假连接、把旧数据当新数据接收。
同样的,既然有连接那么也就有释放。TCP连接的释放可以分成两部分,一部分是客服端方面,客服端发出拆除请求,随后服务端向客户端发送一条应答数据,之后客户端停止发送。服务端方面,服务端在没收到客服端发送过来的数据后会向客户端发送一条拆除请求,随后客户端对其应答,之后服务端也停止发送,至此整个连接关闭。
拓展:
可靠传输方面,一般有四个可靠机制。确认、排序、流控、重传。
确认:发送端发送数据,服务端成功接收到后会发回一个确认的ack给发送端,来确认数据包是否正常接收。
排序:对每个数据包进行编号以保证接收端接收到的数据包始终能按照发送端发出的数据顺序一致,能有效防止乱序现象。
流控(流动窗口机制):不停的寻找最大带宽,简单来讲就是让你的电脑始终能享受到最大带宽。
重传:重传机制一般在两种情况下执行。其一就是当在“确认”过程中发现了数据包丢失时会对丢失的那部分数据包进行重传,这个过程直至所有的数据包被接收端接收。其二就是当发送端发送数据包给服务端但服务端完全没响应时,服务的会进行重传,但经过一定的次数服务端任然没有任何相应则断开连接,随后重新进行“三次握手”来进行连接。
(图片来源于网络,如有侵权请告知删除)
标签:握手,TCP,发送,四次,图文,数据包,连接,服务端,客户端 From: https://blog.csdn.net/college_dog/article/details/140219104