协议处理程序初始化失败_TCP协议三次握手四次挥手是什么?看完这篇你就知道了!...

f5f21e837a8ba5034de8722eb6281bf1.png
简介:TCP协议是用来规范传输规则的,对应着的是传输层。通常TCP协议会和IP协议放在一起说,不过他们是两个不同的协议,起到的作用也不一样。IP只负责找到地址,具体传输的工作交给TCP来完成,好比是快递送货一样,货单上填写地址的规则以及怎么根据填写的内容找到客户,这就是IP协议的作用,而快递员送货上门前需要先打电话确认,然后在送货给客户,最后客户签收时需要签字就相当于TCP协议了。

1. 两个序号和三个标志位

TCP在传输之前会进行三次沟通,俗称“三次握手”,传输完数据断开的时候要进行四次沟通,也就是经常谈到的“四次挥手”,要理解这个过程首先需要理解TCP中的两个序号和三个标志位的含义:

  • seq: sequence number 的缩写,标识所传数据的序号。TCP传输时每一个字节都有一个序号,发送数据时会将数据的第一个序号发送给对方,接收方会按序号检查是否接受完整,如果没有接受完成就需要重新传送,这样就可以保证数据的完整性。
  • ack: acknoledgement number 的缩写,表示确认号。接收端用它来给发送端反馈已经成功接收到的数据信息的,它的值为希望接受的下一个数据包起始序号,也意味着ack值所代表的的序号前面数据已经成功接收到了。
  • ACK: 确认位,只有ACK=1 的时候ack才起作用。正常通信的时候,ACK值为1,第一次发起请求时,因为没有需要确认接收的数据,所以ACK=0。
  • SYN: 同步位,用于在建立连接时同步序号。刚开始建立连接时并没有历史接收的数据,所以ack也就没办法设置,这时按照正常的机制就没有办法运行了,SYN的作用就是来解决这个问题的,当接收端收到SYN=1 的报文时就会直接将ack设置为接收到的seq+1的值,需要注意的是这里的值并不是校验后设置的,而是直接根据SYN的值设置的,这样正常的机制就可以运行了,所以SYN叫同步位。这里需要留意的是,SYN会在前两次握手时都为1,这是因为通信的双发的ack都需要设置一个初始值。
  • FIN: 终止位,用来在数据传输完毕后释放连接。

2. TCP传输过程图

35c9c6b29e713670042560e65004cb3d.png

图中上部位三次握手,下部位四次挥手,这里的四次挥手中画的是客户端提出的终止谅解,在直接场景中,也有可能是服务端提出终止连接,他们的处理过程都是一样的。TCP的传输是双全工模式,也就是说传输的双方都是对等的,可以同时传输数据,所以无论连接还是关闭都需要对双方同时进行。三次握手中前两次都可以保证服务端可以正确接收并返回请求,后两次可以保证客户端可以正确接收并返回请求,并且在三次握手的过程中还是用SYN标志初始化双方的ack值。四次挥手就是双方分别发送FIN标志来关闭连接并让对方确认。

3. TCP传输协议的弊端

三次握手和四次挥手保证了连接的可靠性,但是凡事有利必有弊,就好比很多治病的药一样,多多少少都会有些副作用。

TCP模式的缺点是,首先是在传输效率上会比较低,另外三次握手的过程中客户端需要发送两次数据才可以建立连接,这种特性可能被一些别有用心的人利用,比如,发出第一次握手并接收到第二次握手后就不回应第三次握手了,这是服务端以为是第二次握手的数据没有传输到客户端,然后重新发送第二次握手,默认情况下会发送五次,如果五次后还没有收到第三次握手则会丢掉请求,如果是个别这种请求也无妨,但是就怕次数多,当有大量这种请求的时候,服务端就会浪费大量的资源以至于可能导致无法处理正常的请求,这就是DDOS攻击中的SYN Flood攻击,对于这种攻击的一种应对方法是设置第二次请求的重发次数(tcp_synack_retries),不过重发的次数太小也可能导致正常的请求中因为网络抖动没有收到第二次握手而连接失败的情况,具体设置为多少合适,还是需要根据实际的情况来决定的。

4. 传输层其他的协议

用于传输层的协议除了TCP还有UDP,他们的区别主要是TCP是有连接的,UDP是没有连接的,也就是说TCP协议是在沟通好后才会传数据,而UDP协议是拿到地址后直接就传了,这样产生的结果就是TCP协议传输的数据可靠,而UDP传输的速度更快。TCP就像我们日常打电话,需要先拨通对方号码才能通信,而UDP就像是使用对讲机,拿起来就可以直接讲话。通常视屏传输、语音传输等对完成性要求不高而对传输速度要求高并且数据量大的通信使用UDP比较多,而邮件、网页等一般使用TCP协议。

HTTP协议的低层传输默认使用的是可靠的TCP协议,不过它对互联网的告诉发展带来了很大的制约,Google制定了一套基于UDP的QUIC (Quick UDP Internet Connection) 协议,这种基于TCP和UDP之间,不过现在还没有广泛使用。

TCP/IP协议只是一套规则,并不能具体工作,就像程序中的接口一样,而Socket是TCP/IP协议中的一个具体的实现,后续的文章会介绍Java中Socket的具体用法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值