TCP协议 和 UDP协议 的区别 (三次握手/四次挥手)

发布时间 2023-12-14 12:30:16作者: 学Java的`Bei

TCP协议

  拓展:

    FTP:(File Transfer Protocol) 文件传输协议

    FIle 协议:访问本地文件

    Webscoket:网络通信协议;主动给客户端发送协议

    FTP:文件传输协议

   重点:

    面试重点:TCP、UDP协议区别
         UDP (User Datagram Protocol)是一种在计算机网络中广泛使用的传输层协议。一般用于游戏。

            特点:不可靠、无连接的数据服务。通俗讲:会主动给客户端发送协议。

         TCP协议:可靠性,有连接。应用于要求较高的应用场景,如网页浏览、文件传输、电子邮件等。

            提供了可靠的数据传输和流控制机制,能够确保数据的完整性和有序性。

            由于TCP协议在传输过程中引入了较多的控制信息,因此相比于UDP协议,TCP的传输速度较慢。

 UDP和TCP区别:

TCP提供面向连接的传输,通信前要建立连接(三次握手机制); UDP提供无连接的传输,通信前不需要建立连接;
TCP提供可靠的传输(有序,无差错,不丢失,不重复); UDP提供不可靠的传输;
TCP提供拥塞控制和流量控制机制; UDP不提供拥塞控制和流量机制;
TCP面向字节流的传输,因此能将信息分割成组,并在接收端将其重组; UDP是面向数据报的传输,没有分组开销;

 拥塞控制:对资源的需求超过可用的资源。若网络中的许多资源同时供应不足,网络的性能就会明显变坏,网络的吞吐量随负荷的增大而下降。
 解决拥塞控制:慢启动、拥塞控制、快速重传、快速恢复。

 流量控制:一般来说,就是希望数据传输的更快。但发送方的数据发送的很快,而接收端来不及接收,就会造成数据的丢失。
      流量控制就是让发送方的发送速率不要太快,让接收方来不及接受。

 


 

   TCP三次握手,四次挥手
    三次握手:

    

    TCP协议中,主动发起请求的一端称为『客户端』,被动连接的一端称为『服务端』。

    不管是客户端还是服务端,TCP连接建立完后都能发送和接收数据。

    刚开始的时候,服务器和客户端都为CLOSED状态。在通信开始前,双方都得创建各自的传输控制块(TCB)。

    服务器创建完TCB后进入LISTEN状态,此时准备接收客户端发来的连接请求。

     大白话情景演绎:我  VS  在看的你(帅哥/美女)

        我:在吗?下午去吃烧烤...

        你:好,有空!

        我:下午告诉通知地点...

        此时都约定好下午吃烧烤, 你 等待接收。

 

    第一次握手:

      客户端向服务端发送连接请求报文段。该报文段的头部中同步SYN=1,确认ACK=0,同时选择一个初始序号seq=x。请求发送后,客户端便进入SYN-SENT状态。

    •  SYN=1,ACK=0表示该报文段为连接请求报文

    •  x为本次TCP通信的字节流的初始序号

    •  TCP规定:SYN=1的报文段不能有数据部分,但要消耗掉一个序号

 

    第二次握手: 

      服务端收到连接请求报文段后,如果同意连接,会发送一个应答:SYN=1,ACK=1,seq=y,ack=x+1。发送完应答后服务端进入SYN-RCVD状态。

 

    •  SYN=1,ACK=1表示该报文段为连接同意的应答报文

    •  seq=y表示服务端作为发送者时,发送字节流中的第一个字节序号

    •  ack=x+1表示服务端希望客户端发送的下一个数据报初始序号是从x+1开始

 

 

    第三次握手:

      客户端收到服务端连接同意的应答后,会向服务端发送一个确认报文段;表示:服务端发来的连接同意应答已经成功收到。该报文段的头部为:ACK=1,seq=x+1,ack=y+1。

     客户端发完这个报文段后便进入ESTABLISHED状态,服务端收到这个应答后也进入ESTABLISHED状态,此时连接的建立完成!

    为什么不可以是两次或者四次呢?

       用我的大白话讲讲。当两次握手时,服务端不知道客户端要与建立连接,而客户端一直在等待,会造成资源空耗。

               若四次握手,三次握手通信正常,刚好建立连接,超过四次就会造成浪费。


  四次挥手:保证数据传输完毕。

      

 

    第一次挥手:

      客户端数据发送完成,向服务端发送连接释放请求。该请求只有报文头,头中携带的主要参数为:FIN=1,seq=u。此时,客户端将进入FIN-WAIT-1状态。

      TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。

 

    •  FIN=1表示该报文段是一个连接释放请求。

    •  seq=u,u-1是客户端向服务端发送的最后一个字节的序号。

 

 

 

    第二次挥手:

     服务器收到客户端连接释放报文,通知相应的高层应用进程,告诉它客户端向服务器这个方向的连接已经释放了。

     此时服务端进入了CLOSE-WAIT(关闭等待)状态,并向客户端发出连接释放的应答,其报文头包含:ACK=1,ack=u+1,并且带上自己的序列号seq=v。

     客户端收到该应答后,进入FIN-WAIT-2状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。

    •  ACK=1:除TCP连接请求报文段以外,TCP通信过程中所有数据报的ACK都为1,表示应答。

    •  seq=v,v是服务端释放应答报文段第一个字节序号。

    •  ack=u+1表示希望收到从第u+1个字节开始的报文段,并且已经成功接收了前u个字节。

 

    第三次挥手:

      服务端将最后的数据发送完毕后,就向客户端发送连接释放报文,其报文头包含:FIN=1,ack=u+1,由于在CLOS-WAIT状态,服务端很可能又发送了一些数据,假定此时的序列号为seq=w。

    此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。

 

    第四次挥手:

      客户端收到服务器的连接释放报文后,向服务端发出确认应答,报文头:ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。

     该状态会持续2MSL(最长报文段寿命)时间,这个期间TCP连接还未释放,若该时间段内没有服务端的重发请求的话,客户端就进入CLOSED状态,撤销TCB。服务端会比客户端结束的早。

     【注意】页面响应不能超过三秒且不可超过三次。

    大白话情景演绎:在看的 帅哥 VS 美女  此时,吃完烧烤在看电影....

      美女:分手吧!你太直男了...

      帅哥:分就分...

      此时,电影还未结束.../电影已结束...

      帅哥:看完电影再分吧!/再见!下一个会更好...

      美女:那就看完再分!/魂淡...

 

     等待2MLS:客户端发送ACK,用于判断服务器是否正常关闭。

            若在2MSL后,没有接到来自服务器的返回,则认为服务器正常关闭,客户端关闭;(2MSL的MSL有30秒,1分钟,2分钟)。