TCP三次握手为什么是三次,四次挥手为什么是四次

这节课学习结束后,老师要求我们理解并解释TCP的三次握手和四次挥手。下面是我的理解。

先解释什么是TCP:

TCP是指传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP 提供面向有连接的通信传输,面向有连接是指在传送数据之前必须先建立连接,数据传送完成后要释放连接。

无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握手进行初始化的。同时由于TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议,TCP是全双工模式,所以需要四次挥手关闭连接。

TCP三次挥手建立连接

三次握手,是指建立一个 TCP 连接时,需要客户端和服务器总共发送3个报文。

三次握手的目的是连接服务器指定端口,建立 TCP 连接,并同步连接双方的序列号和确认号,交换 TCP 窗口大小信息。在 socket 编程中,客户端执行 connect() 时。将触发三次握手。

顺序就是:

1.客户端向服务器端请求建立连接----------2.服务器端针对客户端的SYN的确认应答并请求建立连接

------------3.客户端再针对服务器端的SYN的确认应答

示意图

第一次握手
客户端将TCP报文标志位SYN置为1,随机产生一个序号值seq=J,保存在TCP首部的序列号(Sequence Number)字段里,指明客户端打算连接的服务器的端口,并将该数据包发送给服务器端,发送完毕后,客户端进入SYN_SENT状态,等待服务器端确认。

第二次握手:
服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将TCP报文标志位SYN和ACK都置为1,ack=J+1,随机产生一个序号值seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。

第三次握手:
客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务器端,服务器端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。

注意:

小写的ack代表的是头部的确认号Acknowledge number, 缩写ack,是对上一个包的序号进行确认的号,ack=seq+1。

大写的ACK,则是我们上面说的TCP首部的标志位,用于标志的TCP包是否对上一个包进行了确认操作,如果确认了,则把ACK标志位设置成1。

为什么需要三次握手?

就比如客户端发出的第一个连接请求报文段没有丢失,只是因为网络等问题在某一个网络节点长时间滞留,延误了服务器接收到的时间。服务器接收到这个已经失效的报文段后,误以为是客户端重新发送的新连接请求,就会向客户端发送确认报文段,同意建立连接。

假设不采用“三次握手”,那么只要服务器发出确认,新的连接就建立了。由于现在客户端并没有发出建立连接的请求,因此不会理睬服务器的确认,也不会向服务器发送数据。但服务器却以为新的运输连接已经建立,并一直等待客户端发来数据。这样,服务器的很多资源就白白浪费掉了。

所以,采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,客户端不会向服务器的确认发出确认。服务器由于收不到确认,就知道客户端并没有要求建立连接。

TCP四次挥手关闭连接:

四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。由于TCP连接是全双工的,因此,每个方向都必须要单独进行关闭,是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。

具体步骤:(挥手请求可以是客户端,也可以是服务器端发起的,我们假设是客户端发起)

1.客户端先向服务器端发送“请求断开连接”------2.服务器端针对客户端的“请求断开连接”做出确认应答--------3.服务器端再向客户端发送“请求断开连接”--------4.客户端针对服务器端的“请求断开连接”做出确认应答

示意图:

为什么连接的时候是三次握手,关闭的时候却是四次握手?

建立连接时因为当服务器端收到客户端的连接请求报文后,可以直接发确认应答报文。所以建立连接只需要三次握手。

由于TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议,TCP是全双工模式。这就意味着,关闭连接时,当客户端发出FIN报文段时,只是表示客户端告诉服务器端数据已经发送完毕了。当服务器端收到FIN报文并返回ACK报文段,表示它已经知道客户端端没有数据发送了,但是服务器端还是可以发送数据到客户端端的,所以服务器端很可能并不会立即关闭SOCKET,直到服务器端把数据也发送完毕。当服务器端也发送了FIN报文段时,这个时候就表示服务器端也没有数据要发送了,就会告诉客户端,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。

就比如两个人打电话,连接时的三次挥手好比相互问候。

甲:“喂?(二声)”

乙:“喂(四声)你好吗?”

甲:“我很好”;

四次挥手就好比甲巴拉巴拉说了半天,说完了,说:”我没什么可说的了,你还有要说的没,没有就挂了?”这就表示甲想询问是否结束做出请求的意思。

但乙如果还有话说,乙就先巴拉巴拉说完,然后表示说:”嗯,我也说完了,那就挂了?“对甲的话表示确认并做出结束请求的意思。

之后甲在对乙的请求表示确认并结束通话。

这是我对TCP三次握手、四次挥手过程及原理的理解,如有不对还请指出

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值