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

    TCP协议

    数据从客户端-->服务端的协议

    三次握手

    TCP三次握手和四次挥手-三次握手.gif

    比如要去服务端下载视频,客户端和服务端之间就必须得连接,也就是三次握手

    在连接之前客户端和服务端都是处于关闭状态的。

    三次握手的过程(A:客户端,B:服务端)

    1. A会向B发起一个连接请求报文(SYN),不携带数据(我要和你连接)
    2. B收到连接请求报文后,如同意建立连接,则向A发送确认报文。(好的,你确定要连接吗)
    3. A收到B的确认后,再向B给出确认报文(是的,我确定要连接)

    连接成功

    o_o_120-TCP三次握手和四次挥手-三次握手静态.jpg

    常见问题

    • 为什么A最后还要发送一次确认呢,可以两次握手吗?

    答:主要是为了防止已失效的连接请求报文段突然又传送到了B,因为产生失误

    如A发出连接请求,但因连接请求报文丢失而未收到确认,于是A再重传一次连接请求(就像你又点了一次鼠标)。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接。那么A总共发出了两个连接请求报文段,其中第一个丢失,第二个到达了B,但是第一个丢失的报文段只是在某些网络结点长时间滞留了,延误到连接释放以后的某个时间才打到B,此时B就会误以为A又发出了一次新的连接请求,于是就向A发出确认报文段,同意建立连接。由于不采用三次握手,只要B发出确认,就建立新的连接了,此时A不理睬B的确认且不发送数据,而B又一直等待A发送数据,浪费资源。

    • Server端容易遭受SYN攻击?

    答:服务器端的资源分配是在二次握手时分配的,而客户端的资源是在完成三次握手时分配的,所以服务端容易收到SYN洪泛攻击。

    SYN攻击就是Client在短时间内伪造大量不存在的ip地址,并向Server不断的发送SYN包,Server则回复确认包,并等待Client确定,但由于源地址并不存在,因此Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满了而被丢弃,从而引起网络拥塞甚至系统瘫痪。

    防范措施:降低主机的等待时间使主机尽快的释放半连接的占用,短时间受到某ip的重复SYN则丢弃后续请求。(所以不要卡了就一直点点点)

    四次挥手

    o_o_120-TCP三次握手和四次挥手-四次挥手.gif

    比如你不想看视频了,那就要断开和服务端的连接,也就是四次挥手

    四次挥手的过程(A:客户端,B:服务端)

    1. A向B发送断开连接请求报文(FIN),并停止传输数据(A告诉B我没有数据要发了)
    2. B接到请求后,不返回FIN报文(也就是不断开),而是返回一个ACK报头。(B告诉A你的请求我收到了,但是我还没有准备好,还有数据在传输,请你继续等我的消息)
    3. B将剩余数据传输完毕之后,把FIN+ACK报头的请求发给A。(B告诉A我所有数据都发完了,可以断开了)
    4. A接到请求后就知道可以关闭连接了,但是他还是不相信网络,怕B不知道要关闭,所以发送了ACK且进入一个TIME_WAIT状态,如果B没有没有收到ACK就会重新发送一个ACK,B收到ACK后就断开了连接,而A在2MSL后依然没有收到回复,就知道B已经关闭了,那A也就关闭了。(A告诉B我知道了,断开吧)

     断开TCP连接

    o_o_120-TCP三次握手和四次挥手-四次挥手静态.png

    常见问题

    • 为什么连接的时候是三次握手,而断开却要四次挥手?

    答:因为在连接时Server端收到Client的SYN连接请求报文后,可以直接回复SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,因为Server端收到FIN断开请求报文时,因为可能还需要传输数据,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到Server端所有的报文都发送完了,才会把FIN报文发送过去,故而需要四次挥手。

    • 为什么Client端需要在TIME-WAIT状态等待2MSL的时间?

    答:

    1.Client端发出的ACK报文段有可能丢失,使用B无法收到已发送的断开确认,B发现超时后重新发送FIN+ACK,而A能够在2MSL时间内收到这个重传的报文,接着A也重新传一次,并且重新启动2MSL计时器,最后保证A和B都能进入关闭状态。如果A不等待2MSL的时间,而是发送完ACK报文段后立即释放连接,那么丢失后就无法收到B重传的FIN+ACK报文段,所以也不会再发送一次确认报文段,则B无法正常进入到关闭状态。

    2.A在发送完最后一个ACK报文段后,再经过2MSL,就可以使得本次连接的时间内所产生的所有报文段都从网络中消失,使得下一个新的连接中不会出现这种旧的连接请求报文。

    • 如果已经建立了连接,但是客户端突然出现故障怎么办?

    答: TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

    补充

    1.TCP

    传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议
    
    TCP之所以可靠,是因为在传输数据前需要三次握手确认建立链接
    
    三次握手的过程实际上实在确认我发的你能收到,你发的我也能收到,从而保证数据传输的的可靠性,
    
    链接是一个虚拟的概念,不实际存在,只要三次握手成功即表示连接建立成功!
    
    问题是三次握手时的确能保障数据传输是可靠的,那么握手后的数据传输要如何保证传输成功呢?
    
    **TCP协议要求在发送数据后,必须接收到对方的回复信息才能确认数据成功发送,如果一段时内没有收到回复信息,会自动重新发送,如果重试的次数过多则表示链接可能已经中断!**
    
    • 其优点很明显:能够保证数据传输是完整的

    • 缺点:由于每次都需要传输确认信息,导致传输效率降低

    • 场景:多用于必须保证数据完整性的场景,例如文本信息,支付信息等!

    2.UDP

    用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据报的方法。
    
    不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包
    
    • 优点:由于不需要传输确认信息,所以传输效率高于TCP协议

    • 缺点:传输数据可能不完整

    • 场景:视频聊天,语音聊天等,不要求数据完整性,但是对传输速度要求较高

  • 相关阅读:
    java 编码问题
    关于时间
    页面
    关于微信
    01-jQuery的介绍
    15-BOM
    14-定时器
    13-JS中的面向对象
    12-关于DOM操作的相关案例
    购物车练习
  • 原文地址:https://www.cnblogs.com/lucky75/p/11093660.html
Copyright © 2011-2022 走看看