zoukankan      html  css  js  c++  java
  • tcp和udp

    tcp的优点:

      可靠,提体现在tcp在传递数据之前会有三次握手来建立连接,而且在传输数据时,有确认,窗口,重传,拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源,采用四次挥手断开连接。

    tcp的缺点:

      慢,效率低,占用系统资源高,易被攻击tcp在传递数据之前,要先建立连接,这会消耗时间。

    UDP的优点

      快,比tcp稍安全udp没有tcp的握手,确认,窗口,重传,拥塞控制等机制,udp是一种无状态的传输协议,所以他在传递数据时非常快。

    UDP的缺点:

      不可靠,不稳定,在数据传递时吐过网络质量不好,就会很容易丢包。

    tcp的三次握手和四次挥手

      tcp的三次握手:

      第一次 客户端发送syn=1,seq=x;服务端响应 syn=1,ACK=1,ack=x+1,seq=y, 然后客户端响应 ACK=1,seq=x+1,ack=y+1;

      第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

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

      第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
      为什么是三次握手

          第一次:Client什么都不能确认 Server确认了对方发送正常

          第二次:Client 确认自己 发送/接收 正常 ,对方 发送/接收正常;server确认自己接收正常,对方发送正常

          第三次: client 确认自己 发送/接收 正常 ,对方 发送/接收正常;server确认自己 发送/接收 正常 ,对方 发送/接收正常

      tcp四次挥手:

        客户端发送fin=1,seq=u,服务端 发送ACK=1,seq=v,ack=u+1; 服务端 发送 fin=1,ACK=1,seq=w,ack=u+1; 客户端 发送ACK=1,seq=u+1,ack=w+1;

      为什么服务端是连着两次断开连接?

        因为在第一次的时候,服务端表示自己接收到了断开连接的请求,但是由于数据还没有发送完或者其他什么,不能断开连接,第二次的时候是数据发送完毕,可以断开连接

      

    为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

      答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

    为什么不能用两次握手进行连接?

      答:3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。

           现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

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

        TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,

      若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

  • 相关阅读:
    某个牛人做WINDOWS系统文件详解
    常用ASP脚本程序集锦
    LINUX基础:文件安全与权限
    proftpd+mysql+quota
    apache2.0.49tomcat5.0.19jk2建立virtualHost
    URL Redirection(转) Anny
    顶级域名后缀列表(转) Anny
    \u4E00\u9FA5意义 Anny
    How to POST Form Data Using Ruby(转) Anny
    How to get rid of 'Enter password to unlock your login keyring' in Ubuntu(转) Anny
  • 原文地址:https://www.cnblogs.com/xp0813/p/11347977.html
Copyright © 2011-2022 走看看