TCP 三次握手

TCP

        TCP是传输控制协议(Transmission Control Protocol),它是常用的面向连接的协议,通常和IP一起使用。


TCP中常见的头部标志

  1. URG: 表明应该检查报头中的紧急指针部分 
  2. ACK:  表明应该检查报头中的确认序列号部分
  3. FSH:  表示接收者应该尽快将数据向下层传递
  4. RST:  指明应该重置连接
  5. SYN:  初始化一个连接
  6. NE:    显式拥塞通知(ECN)隐蔽性保护
  7. CWR: 拥塞窗口减少标志表示数据包的ECE标志已被设置,而且拥塞控制已应答
  8. ECE:   如果SYN标志设为1,这个标志表示TCP通信的一方支持ECN。如果SYN设置为0,则表示收到的IP报头中的拥塞通知被设置
  9. FIN:   指明发送者(可以是连接的另一方)已经将数据发送完毕

TCP 连接

        TCP是全双工(full-duplex)的协议。建立一个TCP连接的过程称为三次握手(three-way handshake)。

        由于是面向连接的协议,在建立TCP连接时,会发生一个特定的过程。在该过程中,存在许多TCP连接的状态。要发起通信的一方(客户端)会在发送的TCP报文中设置SYN标志,初始化序列号(Initial Sequence Number,ISN)以及它要通信的另一方的端口号,通常连接的另一方是服务器。该报文通常被称为SYN数据包或者SYN报文段,此时该TCP连接处于SYN_SENT状态。

        此连接的服务器一端会发送一个同时设置了SYN和ACK标志位的TCP报文段作为回应。此外,服务器还会将确认序列号设置为客户端所发送的序列号加一。该报文通常被称为SYN+ACK数据包,此时该TCP连接处于SYN_RCVD状态。

        接下来,客户端会响应SYN-ACK数据报,发送一个设置了ACK标志的响应报文,并且发送的确认序列号为SYN-ACK序列号加一的报文段。至此,三次握手已经结束,该链接已经建立,进入ESTABLISHED状态。

        与初始化连接的协议(这里的协议指建立连接的过程)相对应,还有一个终止连接的过程。用于终止TCP连接的过程与建立连接的散步相对,共有四个步骤。多出的一个步骤来自于TCO连接的全双工特性,因此任何一边都有可能在任何时候发送数据。

        通过发送设置了FIN标志的TCP报文段,TCP连接的某一方可以关闭该方向上的连接。连接的任何一方都可以发送FIN标志,以表明它已经将数据发送完毕。而连接的另一方则可以继续发送数据。然而,实际上,当FIN被接收时,连接的终止过程将开始,下面,我将想要终止连接的一方设置为客户端。

        终止过程从客户端发用FIN标志的报文开始,此时服务端的状态为CLOSE_WAIT,而客户端的状态为FIN_WAIT_1。在服务器接收到FIN后,服务端将向客户端回复ACK包,同时序列号加一。此时,客户端进入FIN_WAIT_2阶段。服务端同时向它的高层协议指出连接已终止。接下来,服务端关闭连接,这会导致一个设置了FIN标志位的报文被发送到客户端,而服务端进入LAST_ACK状态,而客户端进入TIME_WAIT状态。最后,客户端发送报文段以确认此FIN标志(发送ACK报文段为服务端,序列号加一),然后连接便进入了CLOSED状态。

        TCP连接序列中有一个可选择部分是最大报文段长度(Maximum  Segment  Size,MSS)。MSS是通信的双方各自所能接收的最大的数据块大小。由于MSS是连接的双方所能接受的最大大小,通常发送比MSS小一些的数据块更合适。一般而言,我们应该考虑使用一个大一些的MSS,然后牢记应避免分片,分片会在IP层进行,分片会增加系统开销。


为什么建立连接不是两次或者四次握手?
    如果两次握手,即客户端发送SYN请求连接信号,服务器接收信号后发送SYN+ACK应答信号,客户端与服务端建立连接。如果遇到客户端的请求信号发生延迟现象,或者已经失效的连接请求突然又发送收到了客户端,产生错误。
    如果四次握手,即三次握手之后,服务端再次给客户端发送ACK信号,则服务端资源会被浪费。所以三次握手是能够建立安全连接的最少次数。

    

TCP终止连接时是四次握手:

第一次握手:客户端已经发送完数据,并且知道服务端已经接收完数据,想要终止连接,给服务端发送FIN终止信号。
第二次握手:服务端接收到终止信号后,会发送一个ACK确认收到的应答信号,但是由于服务端的数据还在发送中,所以无法在接收到终止连接请求时立即终止连接。
第三次握手:服务端等到数据发送完毕后,会发送FIN终止连接信号给客户端。
第四次握手:客户端接收到FIN信号后,知道服务端数据发送完毕,发送ACK确认收到信号。客户端等待2MSL后,如果没有收到服务端传来的任何消息,就表明服务端已经收到确认消息,客户端关闭连接,服务端也关闭连接。

客户端为什么要等待2MSL?

       在客户端第四次握手时发送ACK后,信号有可能丢失,如果服务端没有收到ACK,将会不断的发送FIN信号。所以客户端并不能在发送了ACK信号后就立即关闭,它必须确认服务端收到了ACK信号。客户端在发送ACK信号后进入到TIME_WAIT状态,且会设置一个计时器,等待2MSL的时间段。如果在该时间内再次收到FIN,则客户端会重发ACK信号并再次等待2SML时间。如果等待期间一直没有收到FIN,则可以推断服务端已经成功接收ACK信号,结束连接。MSL(Maximum Segment Lifetime)是一个信号在网络中最大的存活时间。2MSL是一个信号发送和回复所需的最大时间。





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值