首页 > 其他分享 >深度解析传输控制协议TCP和UDP

深度解析传输控制协议TCP和UDP

时间:2022-11-10 09:23:15浏览次数:46  
标签:UDP 传输控制协议 报文 TCP 服务器 连接 客户端

传输协议的引入:

如果两台计算机已经处于连接状态,那怎样让数据从一端传送到另外一端?(采用TCP和UDP协议)

 

一、TCP用户传输协议

  1. TCP协议是Transmission Control Protocol传输控制协议,TCP是一种面向连接的、可靠的、基于字节流的传输层(Transport layer)通信协议。当客户和服务器彼此传递数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据;    
  2. 当客户和服务器彼此交互数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据,TCP 协议使用超时重传、数据确认等方式来确保数据包被正确地发送至目的端,故而效率低,速度慢;相当于打电话,在手机上输入号码后,点击拨号键,接收到来电信息的人需要点击接听按键才可以正常进行通话;
  3. TCP可靠传输协议,不丢包,经常用来传输文件(回值内部处理),缺点是效率低,慢,而且占用资源

     

二、 UDP用户传输协议

  1. UDP(User Datagram Protocol)是一种无连接、不可靠、基于数据报的用户数据协议。
  2. UDP在传输数据报前不用在客户和服务器之间建立一个连接。它只是把数据报发送出去,但是并不能保证他们能到达目的,并且没有超时重发机制,故而传输速度很快;
  3. UDP不可靠传输协议,容易丢包。但是效率高,快,占用资源少。一般游戏中数据采用UDP传输数据,可以对数据进行快速处理,可能会出现偶尔丢包的现象,但不影响整体,主要是效率高,相当于快递;

三、 TCP与UDP的区别和联系

  1. 首先它们都是传输层的协议;
  2. TCP 协议可靠,UDP 协议不可靠。可靠即指数据由A发送到B,是否能确保数据真的有送达到B;TCP 协议使用超时重传、数据确认等方式来确保数据包被正确地发送至目的端。而 UDP 协议无法保证数据从发送端正确传送到目的端,如果数据在传输过程中丢失或者目的端通过数据检验发现数据错误,则UDP协议只是简单地通知应用程序发送失败。对于 TCP 协议拥有的超时重传、数据确认等需要应用程序自己来处理这些逻辑;
  3. TCP 是面向连接的,UDP 是无连接的。这也比较好理解,因为 TCP 连接需要经历"三次握手";
  4. TCP 服务是基于流的,而UDP是基于数据报的,基于流的数据没有边界(长度)限制,而基于数据报的服务,每个UDP数据报都有一个长度,接收端必须以该长度为最小单位将其所有内容一次性读出;

总之:TCP 协议为应用层提供可靠的、面向连接的、基于流的服务。而 UDP 协议则与 TCP 协议完全相反,它为应用层提供不可靠、无连接和基于数据报的服务;

四、TCP连接中的三次握手和四次挥手

上面讲了TCP是基于连接的,需要进行三次握手,我们先用一个通俗的例子来理解一下

三次握手 

A:约吗?

B:约,你约吗?

A:约。(成功建立连接)

四次挥手

A:我要走了。

B:嗯,知道了,等我再说两句。

B:说完了,你走吧。

A:走了。(成功断开连接)

 

第一次握手:建立连接时,客户端发送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连接成功)状态,完成三次握手。

 

四次挥手

第一次挥手:客户端准备断开连接 客户端向服务器发送的报文当中的FIN位被设置为1,表示请求与服务器断开连接。
第二次挥手:服务器收到FIN报文段 服务器收到客户端发来的断开连接请求后对其进行响应,返回确认应答包(ACK报文段)。
第三次挥手:服务器发送FIN报文段 请求关闭连接 服务器收到客户端断开连接的请求,且已经没有数据需要发送给客户端的时候,服务器就会向客户端发起断开连接请求。
第四次挥手:客户端向服务器发送ACK报文段 客户端收到服务器发来的断开连接请求后对其进行响应,对服务器发送ACK报文段,服务器收到后直接关闭,客户端再等待2MSL后关闭。

 

五、总结一下TCP连接常见问题

【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?

答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

 

【问题2】为什么不能用两次握手进行连接?

 

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

 

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

 

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

 

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

 

希望此篇文档对你的学习有所帮助

标签:UDP,传输控制协议,报文,TCP,服务器,连接,客户端
From: https://www.cnblogs.com/lidongm/p/16875950.html

相关文章

  • 用户态协议栈之tcpip设计
      实现一个协议栈,要拿到最原始的数据,最原始的数据,以太网的数据方法1:rawsocket,方法2:旁路,关掉之前的driver,建立一个driver:netmap,dpdk 方法3:hook......
  • Netty(一)深入理解网络通信和TCP/IP协议
    一、前言为什么要学Netty?实话说工作中真正用到netty开发的场景可能不算特别多,但是为啥要学这玩意呢?有一说一,变强的路上技能可以用不到,但是不能没有~Java生态圈......
  • TCP-Socket项目
    项目描述TCP协议,客户端和服务端,支持多机发送和接受文件和图片发送字符串信息,记录到文本编译工具,makefile,cmake,检查工具知识点抓包工具wireshark,分析数据包文件I......
  • 第13章 TCP/IP和网络编程
    TCP/IP协议TCP/IP协议TCP代表传输控制协议,IP代表互联网协议。目前有两个版本的IP,即IPv4和IPv6。IPv4使用32位地址(目前使用最多),IPv6使用128位地址。TCP/IP的组织结构氛围......
  • Linux高并发网络编程开发——epoll-udp
    在学习Linux高并发网络编程开发总结了笔记,并分享出来。10-Linux系统编程-第13天(epoll-udp)目录:一、学习目标二、复习1、通过gdb定位段错误的位置2、TCP状态转换复习三、epoll......
  • Linux高并发网络编程开发——tcp三次握手-并发
    在学习Linux高并发网络编程开发总结了笔记,并分享出来。10-Linux系统编程-第11天(tcp三次握手-并发)  一、学习目标1、熟练掌握三次握手建立连接过程2、熟练掌握四次挥手断开......
  • linux获取TCP连接数
    方法一:[admin@zabbix~]$ss-ant|awk'NR>1{a[$1]++}END{for(bina)printb,a[b]}'ESTAB535TIME-WAIT80LISTEN13方法二:[admin@zabbix~]$netstat-an......
  • 交叉编译脚本-tcpdump
    说明编译tcpdump的脚本。参考​​tcpdump的移植和使用方法​​编译脚本run_tcpdump.sh#!/bin/bashset-ePATH_INSTALL=/opt/tcpdumpif[-f"Makefile"];thenmakedis......
  • UdpClient.BeginReceive
    在用C#开发UDP数据的时候,UdpClient有一个方法是UdpClient.BeginReceive,用来从远程主机异步接收数据报。1UdpClientclient=objasUdpClient;2......
  • Tcp协议
    一.TCP/IP协议定义 TCP/IP(TransmissionControlProtocol/InternetProtocol)是传输控制协议和网络协议的简称,它定义了电子设备如何连入因特网,以及数据如何在它们之间传......