面试官:HTTP、TCP和UDP之间的区别,你真的清楚吗?

程序员的成长之路

共 6215字,需浏览 13分钟

 ·

2022-11-07 23:22

d7fd0e855c2a4f4a3c0493f896d2357c.webp程序员的成长之路互联网/程序员/技术/资料共享  关注


阅读本文大概需要 10 分钟。

来自: blog.csdn.net/qq_42410176/article/ details/117368245

在解释HTTP、TCP和UDP之前的区别之前,先为大家介绍一下三者的含义。TCP:传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 [1] 定义。TCP旨在适应支持多网络应用的分层协议层次结构。连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作。UDP:Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。RFC 768 [1] 描述了 UDP。Internet 的传输层有两个主要协议,互为补充。无连接的是 UDP,它除了给应用程序发送数据包功能并允许它们在所需的层次上架构自己的协议之外,几乎没有做什么特别的事情。面向连接的是 TCP,该协议几乎做了所有的事情。HTTPS:超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣,因为它使开发和部署非常地直截了当。看到这里如果你还不是很理解三者的意思,你可以简单的记住:TCP是一种传输可靠连接的协议;UDP是一种传输不可靠的连接;HTTP是基于TCP的一种超文本连接;下面我会详细的给大家介绍。

TCP连接

为了能实现计算机在因特网之间的数据传输,就需要使用TCP/IP的概念.TCP/IP不是一种协议,而是一个协议族的统称,其中包括IP协议、IMCP协议、TCP协议,以及我们常见的http、ftp协议等。计算机定义了协议,就像两个不同国籍的人之间约定使用国际通用语言交流一样,双方都能准确的理解对方所表达的意思。上面也介绍了TCP是一种可靠的数据传输连接,那么究竟可靠在哪里呢?首先我们看一下TCP与其他协议的网络结构图。e9b4e788254a10a0003248af83f090fa.webp
  • 应用层:应用程序间沟通层,如简单电子邮件传输(SMPT)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。

  • 传输层:在此层中,他提供了节点间的数据传输,应用程序之间的通信服务,主要功能是数据格式化、数据确认和丢失重传等。如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。

  • 互连网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。

  • 网络接口层(主机-网络层):接收IP数据报并进行传输,从网络上接收物理帧,抽取IP数据报转交给下一层,对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。

TCP三次握手

TCP在传输层中由一个确认和重传操作,可以保证我们传输文件的完成性。TCP传输文件在连接之前需要建立连接,这个连接就是三次握手,计算机通过三次握手建立一个持久性、稳定的连接。就像是两个人之间打电话,当电话打通时,两个人就建立起一条持久性的连接,别人是没办法去干扰通话的。10ff634c96d7744f8a38143d903077b0.webp第一次握手:客户主动(activate open)去connect服务器,并且发送SYN假设序列号为J,服务器是被动打开(passive open)。第二次握手:服务器在收到SYN后,它会发送一个SYN以及一个ACK(应答)给客户,ACK的序列号是J+1,表示是给SYN J的应答,新发送的SYN K 序列号是K。第三次握手:客户在收到新SYN K,ACK J+1,也回应了ACK K+1以表示收到了,然后两边就可以开始数据发送和接收了。看到上面的描述,如果你没有学过计算机网络是很难搞懂上面的专业术语的,下面我来详细的说明一下TCP报文结构。
TCP报文结构:
26a2fb1ead49a6595520fd43e88ca108.webp
TCP报文格式详解:
  • 端口号:用来标识同一台计算机的不同的应用进程。
  • 源端口:源端口和IP地址的作用是标识报文的返回地址。
  • 目的端口:端口指明接收方计算机上的应用程序接口。
  • 序号:是TCP可靠传输的关键部分。序号是本报文段发送的数据组的第一个字节的序号。在TCP传送的流中,每一个字节一个序号。如果一个报文段的序号为300,此报文段数据部分共有100字节,则下一个报文段的序号为400.所以序号确保看TCP传输的有序性。
  • 确认号:确认号,即ACK,指明洗一个期待都收到的字节序号,表明该序号之前的所有数据已经确认无误的收到。确认号只有当ACK标志为1时才有效。比如建立连接时,SNY报文的ACK标志位为0。
  • 数据偏移/首部长度:4bits。有序首部可能含有可选内容,因此TCP报头的长度是不确定的,报头不包含任何选字段则长度为20字节,4位首部长度字段所标识的最大值为1111,转化为10进制为15,15*32/8=60,所以报头最大长度为60字节。首部长度也叫数据偏移,是因为首部长度实际上指示了数据区在报文段中的起始偏移值。
  • 保留:为将来定义新的用途保留,现在一般置0.
  • 控制位:URG ACK PSH RST SYN FIN共6个,每一个标志位标识一个控制功能。
  • URG:紧急指针标志,为1时标识紧急指针有效,为0时则忽略紧急指针。
  • ACK:确认序号标志,为1时标识确认号有效,为0时表示报文中不含确认信息,忽略确认号字段。
  • PSH:push标志,为1表示是带有push标志的数据,指示接收放在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。
  • RST :重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。
  • SYN:同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1.
  • FIN:finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭奔放数据流。
  • 窗口:滑动窗口大小,用来告知发送端接收端的缓存大小,为此控制发送端发送数据的速率,从而达到流量控制。
  • 校验和:奇偶校验,此校验和是对整个的TCP报文段,包括TCP头部和TCP数据,以16位字段进行计算所得,由发送端计算和存储,并由接收段惊醒校验。
  • 紧急指针:只有当URG标志置1时谨记指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式时发送端像另一端发送紧急数据的一种方式。
  • 选项和填充:最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的0,以保证TCP头是32的整数倍。
  • 数据部分:TCP报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有TCP首部,如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。

TCP四次挥手

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。第一次挥手:客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送(报文段4)。第二次挥手:服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和 SYN一样,一个FIN将占用一个序号。第三次挥手:服务器B关闭与客户端A的连接,发送一个FIN给客户端A(报文段6)。第四次挥手:客户端A发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)TCP采用四次挥手关闭连接,为什么建立连接协议是三次握手,而关闭连接却是四次握手呢? 这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

UDP

UDP协议与TCP协议一样用于处理数据包,在OSI模型中,两者都位于传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但即使在今天UDP仍然不失为一项非常实用和可行的网络传输层协议。
UDP报文
7707df53b3546a0e9eb981176851e22f.webp
特点
UDP是一个无连接协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包而言UDP的额外开销很小。
TCP和UDP协议对比
UDP和TCP协议的主要区别是两者在如何实现信息的可靠传递方面不同。TCP协议中包含了专门的传递保证机制,当数据接收方收到发送方传来的信息时,会自动向发送方发出确认消息;发送方只有在接收到该确认消息之后才继续传送其它信息,否则将一直等待直到收到确认信息为止。与TCP不同,UDP协议并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据包的丢失,协议本身并不能做出任何检测或提示。因此,通常人们把UDP协议称为不可靠的传输协议。TCP 是面向连接的传输控制协议,而UDP 提供了无连接的数据报服务;TCP 具有高可靠性,确保传输数据的正确性,不出现丢失或乱序;UDP在传输数据前不建立连接,不对数据报进行检查与修改,无须等待对方的应答,所以会出现分组丢失、重复、乱序,应用程序需要负责传输可靠性方面的所有工作;UDP具有较好的实时性,工作效率较 TCP 协议高;UDP 段结构比 TCP 的段结构简单,因此网络开销也小。TCP协议可以保证接收端毫无差错地接收到发送端发出的字节流,为应用程序提供可靠的通信服务。对可靠性要求高的通信系统往往使用 TCP 传输数据

HTTP协议

HTTP是基于TCP完成的,HTTP是应用层协议,同其他应用层协议一样,是为了实现某一类具体应用的协议,并由某一运行在用户空间的应用程序来实现其功能。HTTP是一种协议规范,这种规范记录在文档上,为真正通过HTTP进行通信的HTTP的实现程序。现在我们所常见的超文本传输协议是HTTPS,HTTPS是HTTP的一种升级版,HTTPS 协议是由 HTTP 加上 TLS/SSL 协议构建的可进行加密传输、身份认证的网络协议,主要通过数字证书、加密算法、非对称密钥等技术完成互联网数据传输加密,实现互联网传输安全保护。
HTTP报文
611b3ed4220340416682c40460193856.webp
HTTP工作原理
HTTP是基于客户/服务器模式,且面向连接的。典型的HTTP事务处理有如下的过程:
  • 客户与服务器建立连接;
  • 客户向服务器提出请求;
  • 服务器接受请求,并根据请求返回相应的文件作为应答;
  • 客户与服务器关闭连接。
<END>

推荐阅读:

在大厂,论嫡系的重要性

性能爆表:SpringBoot利用ThreadPoolTaskExecutor批量插入百万级数据实测!

    
        互联网初中高级大厂面试题(9个G)
      
    

内容包含Java基础、JavaWeb、MySQL性能优化、JVM、锁、百万并发、消息队列、高性能缓存、反射、Spring全家桶原理、微服务、Zookeeper......等技术栈!

戳阅读原文领取!                                   朕已阅  a60e487b4a88274c3796204c0d757725.webp

浏览 47
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报