zoukankan      html  css  js  c++  java
  • TCP三次握手和四次挥手

    TCP的三次握手(建立连接)和四次挥手(关闭连接)

    • 什么是窗口?

      • 当建立连接后,两端都会创建一个缓冲区来存储接收的数据,并将缓冲区的尺寸发送给另一端,其中包含了自己的缓冲区的剩余尺寸。窗口就是剩余缓冲区空间的数量。

    • tcp标志位

      • SYN(synchronous)建立连接

      • ACK(acknowledgement)确认

      • PSH(push)传送

      • FIN(finish)结束

      • RST(reset)重置

      • URG(urgent)紧急

      • Sequence number顺序号码

      • Ackonwledge number确认号码

    三次握手
    1. 客户端向服务端发送SYN(SYN = j),进入SYN_SEND状态,等待服务器确认

    2. 服务端收到SYN包,向客户端发送SYN+ACK包,(SYN=K,ACK=j+1),此时服务端进入SYN_RECV状态

    3. 客户端收到服务端的SYN+ACK包,向服务器发送ACK包,ACK = K+1,发送完毕后,客户端和服务端进入ESTSABLISHED状态,完成三次握手

    • SYN攻击:在三次握手的过程中,服务端发送ACK+SYN之后,等待客户端发送ACK的过程中称为半连接,处于Syn_RECV状态。如果此时攻击客户端在短时间内伪造大量不存在的IP地址,向服务端不断地发送SYN包,服务端回复确认包,并等待客户端的确认,由于源地址是不存在的,服务器需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN包被丢弃,目标系统运行缓慢,甚至引起网络读书、系统瘫痪。

    • 解决:主要方法有SynAttackProtect保护机制、SYN cookies技术、增加最大半连接和缩短超时时间等.

    四次挥手
    1. 发送方向接收方发送FIN包,其中包含seq=M

    2. 接收方收到后,返回一个ack = M+1,seq = v

    3. 接收方向发送方发送FIN包,其中包含seq=J,ack=M+1

    4. 发送方接收到后,返回一个ACK = J+1,seq = m+1

    • 关闭连接时,每个方向都要单独执行操作。当一方完成它的数据发送任务后就可以发送一个FIN来终止这个方向的连接;收到一个FIN只意味着这一方向没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

    为什么建立连接只需要三次,而关闭连接需要四次?
    • 因为建立连接过程中,当服务器收到SYN+ACK包后会将自己的SYN+ACK包一起发送给客户端

    • 而关闭连接过程中,当被动方收到FIN包后,并不一定被动方向主动方的数据已经发送完毕了,需要等到数据发送完后,再发送FIN给主动方

    为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?
    • 因为如果网络是不可靠的,不能保证最后发送的ACK会被接收到,所以对方可能会超时未收到ACK,然后重新发送FIN,此时等待状态就是用来重发可能丢失的ACK

    • 服务器不能在短时间内进行相同端口的连接。因此这2MSL也是服务器的平静时间。

    • 防止已失效的请求连接报文段出现在网络中,此2MSL的时间将所有请求清空。
    为什么不能用两次握手?
    • 如果是两次握手,首先客户端向服务端发动连接请求,服务端接收到之后向客户端发送确认应答。如果此时客户端并没有收到服务端的应答,而服务端默认客户端收到了,就会给客户端发送 数据分组,而客户端还在等待应答分组。服务端在发出的数据分组超时后,会重复发送,形成了死锁。

    三次握手建立连接时,发送方再次发送确认的必要性?
    • 如果有某一个请求连接因网络问题被滞后,直到新的连接建立完成后才发送到服务端,此时服务端会以为客户端发起了新的请求,于是会向客户端发送确认报文,此时如果没有客户端进行确认,新的连接就已经建立了,但是客户端不会从这个连接向服务端发送数据,而服务端一直在等待,资源就被浪费了。

    TCPUDP的区别?
    • TCP协议是有连接的,也就是说传输数据之前客户端和服务端必须通过三次握手建立连接,会话结束后也要关闭连接,而UDP是无连接的

    • TCP协议保证数据按序发送,按序到达,提供超时重传保证可靠性,而UDP不保证按序到达,甚至不保证到达,只是努力交付

    • TCP协议所需资源多,TCP首部需要20个字节,而UDP为8个

    • TCP有流量控制和拥塞控制,UDP没有,网络拥堵不会影响发送端的发送效率

    • TCP是一对一的连接,而UDP则可以支持一对一、多对多、一对多的通信

    • TCP面向的是字节流,UDP面向的是报文流

  • 相关阅读:
    Python下用Tkinter进行GUI编程
    6月3日——回首一个半月
    Consistent Hashing算法
    学生终究要面对社会
    MySQL的锁(1)
    Memcached笔记之分布式算法(idv2.com)
    4月21日总结
    2012.3.29小结
    C#调用c++创建的dll
    以post方式发送文档到端口
  • 原文地址:https://www.cnblogs.com/ashen1999/p/12669260.html
Copyright © 2011-2022 走看看