zoukankan      html  css  js  c++  java
  • TCP建立连接的三次握手和释放连接的四次挥手

    TCP建立连接时,为什么要进行三次握手?

    举个打电话的例子

      A : 你好我是A,你听得到我在说话吗

      B : 听到了,我是B,你听到我在说话吗

      A : 嗯,听到了

      建立连接,开始聊天!

    第一次握手  

        第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。

    第二次握手

        第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。

    第三次握手

        第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。

    完成三次握手,客户端与服务器开始传送数据。

    =========================================================================================================================

     第一次挥手

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

     第二次挥手

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

     第三次挥手

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

     第四次挥手

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

    =========================================================================================================================

    思考:那么为什么是4次挥手呢?

       为了确保数据能够完成传输。

          关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也

    即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

    可能有人会有疑问,tcp我握手的时候为何ACK(确认)和SYN(建立连接)是一起发送。挥手的时候为什么是分开的时候发送呢.

    因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到

    FIN报文时,很可能并不会立即关闭 SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能

    发送FIN报文,因此不能一起发送。故需要四步握手。

    思考:客户端突然挂掉了怎么办?

        正常连接时,客户端突然挂掉了,如果没有措施处理这种情况,那么就会出现客户端和服务器端出现长时期的空闲。解决办法是在服务器端设置保活计时器,每当服务器收到

    客户端的消息,就将计时器复位。超时时间通常设置为2小时。若服务器超过2小时没收到客户的信息,他就发送探测报文段。若发送了10个探测报文段,每一个相隔75秒,

    还没有响应就认为客户端出了故障,因而终止该连接。

    什么是SYN攻击?   

           SYN 攻击指的是,攻击客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送SYN包,服务器回复确认包,并等待客户的确认。由于源地址是不存在的,服务器

    需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,导致目标系统运行缓慢,严重者会引起网络堵塞甚至系统瘫痪。SYN 攻击是一

    种典型的 DoS攻击。

    如何检测 SYN 攻击?

          检测 SYN 攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击。在 Linux/Unix 上可以使用系统自带的

    netstats 命令来检测 SYN 攻击。

    如何防御 SYN 攻击?

          SYN攻击不能完全被阻止,除非将TCP协议重新设计。我们所做的是尽可能的减轻SYN攻击的危害,常见的防御 SYN 攻击的方法有如下几种:

          缩短超时(SYN Timeout)

          时间增加最大半连接数

          过滤网关防护SYN

          cookies技术

     

    TCP协议和UDP协议的区别是什么?

    ① TCP协议是有连接的,有连接的意思是开始传输实际数据之前TCP的客户端和服务器端必须通过三次握手建立连接,会话结束之后也要结束连接。而UDP是无连接的

    ② TCP协议保证数据按序发送,按序到达,提供超时重传来保证可靠性,但是UDP不保证按序到达,甚至不保证到达,只是努力交付,即便是按序发送的序列,也不保证按序送到。

    ③ TCP协议所需资源多,TCP首部需20个字节(不算可选项),UDP首部字段只需8个字节。

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

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

    ⑥ TCP面向的是字节流的服务,UDP面向的是报文的服务。

     

  • 相关阅读:
    人生无常 淡然处之
    对PHP开发的认知
    专家路线
    很少接触的文学
    懒加载
    Markdown入门 学习
    (转载)iOS开发历程书籍推荐
    ObjectiveC1基础代码——类和对象
    day11基础代码——函数指针
    day6
  • 原文地址:https://www.cnblogs.com/ada54410017/p/11166782.html
Copyright © 2011-2022 走看看