TCP的三次握手和四次挥手

TCP协议是一种面向连接的高可靠性协议,建立连接的时候会有三次握手、断开连接的时候需要四次挥手。

UDP协议是一种无连接协议,不管接收方是否收到数据,只管数据发送就行,典型就是实时战斗的游戏,绝大部分的这类型的游戏都是用的UDP协议,因为如果使用TCP协议,当网络不好很多发送失败的数据然后会重发,这样的话就会造成游戏的高延迟。而使用UDP协议只管发送不管是否发送成功,如果网络不好发送失败也不会重发(这就是游戏丢帧的原因),但是一般玩游戏肯定网络是很快的基本上绝大部分都能发送成功,也不会影响游戏的体验性

TCP协议很可靠,而性能不高;UDP协议不可靠,而性能很高
鱼和熊掌不可兼得,这个很类似于大数据中很经典的CAP理论。

其中TCP 为了很可靠在建立连接的时候会进行三次握手:
也有种说法是四次握手,因为第二次和第三次握手可以合并一起发送所以叫三次握手

如下图:

这里写图片描述

第一次握手:client客户端触发server服务端,会带一个syn标志位为1(表示请求建立连接),和一个seq为c。

第二次握手:server服务端响应client客户端,响应会带一个ack确认标志位,值为收到的seq的值加1,在这里就是c+1

第三次握手:server服务端也会触发client客户端,会带一个syn标志位为1(表示请求建立连接),和一个seq为s。

第四次握手:server服务端也会响应client客户端,响应会带一个ack确认标志位,值为收到的seq的值加1,在这里就是s+1。

这样就完成了TCP握手并连接,其实就是互相触发,因为在上面的第二次和第三次握手都是server服务端触发的,在这里就可以合并成一次请求,就变成三次握手了。

见下图:

这里写图片描述

server服务端就在确认的时候同时触发client客户端,那么四次握手就可以精简为三次握手了:

第一次握手:client客户端触发server服务端,会带一个syn标志位为1(表示请求建立连接),和一个seq为c。

第二次握手:server服务端响应client客户端,响应会带一个ack确认标志位,值为收到的seq的值加1,在这里就是c+1,并且同时会触发client客户端,还会带一个标志位syn为1,和一个seq为s

第三次握手:server服务端也会响应client客户端,响应会带一个ack确认标志位,值为收到的seq的值加1,在这里就是s+1

其中在握手成功传输数据的时候,TCP有一个确认窗口的概念,最小单位的确认窗口大小为1,如下图所示:

这里写图片描述

发送方只发送一条数据到接收方,接收方收到数据会返回给发送方一个ack表示收到了发下一条数据(这里的窗口大小就相当于是1),每条数据都这样确认实在是浪费性能,所以可以发送多条数据然后确认多条数据,这个思想和java IO中的buffer一样。

如下所示:

这里写图片描述

这里的就相当于窗口大小为3.

TCP的四次挥手:引用自百度百科对TCP四次挥手的解释

tcp四次挥手,由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。

(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。

(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A。

(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1

TCP采用四次挥手关闭连接如图所示为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。


杂谈:

TCP也有漏洞,以前经常听到什么DOS攻击(Denial of Service)也叫拒绝式服务攻击;或者DDOS攻击(Distributed Denial of Service)也叫分布式拒绝服务,就是利用TCP握手的特性导致的。

比如:A君恶意触发服务器端并且伪造自己的IP(无法连通的IP地址或者其他服务器的IP和端口),服务端收到后会返回ack以及触发客户端,但是发现连接不上该IP地址,从而导致服务端无法完成第三次握手,此时的TCP会话处于半开状态,如果A君发送了大量的这种触发或者ABCDE…N君都一起触发,那会造成服务器资源耗尽。

所以做好服务器安全这块还是很有必要的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值