TCP与UDP的区别,以及TCP和HTTP的区别(超详细)

总结
TCP是面向连接的,UDP是无连接的
TCP是可靠的,UDP是不可靠的
TCP是面向字节流的,UDP是面向数据报文的
TCP只支持点对点通信,UDP支持一对一,一对多,多对多
TCP报文首部20个字节,UDP首部8个字节
TCP有拥塞控制机制,UDP没有
TCP协议下双方发送接受缓冲区都有,UDP并无实际意义上的发送缓冲区,但是存在接受缓冲区
TCP是面向连接的,UDP是无连接的
在TCP协议进行网络通信时,需要先建立连接,也就是说需要先将客户端与服务器的连接连好,然后在进行数据交互。

服务器的listen()函数和accept() 函数确保了连接的建立


因为使用TCP协议时,Linux内核协议栈为TCP连接创建了两个队列

1. 半连接队列:用来保存处于SYN_SENT 和 SYN_RECV状态的请求
2. 全连接队列:accept队列,用来保存正在数据交互(established状态)的客户端连接

全连接队列长度 == 套接字函数listen()的第二个参数+1

TCP是可靠的,UDP是不可靠的


TCP使用以下方式保证自身发送接受数据可靠

1.数据包校验(16为数据校验和)防止发送过来的数据是错误数据
2.确认序列号,对失序报文进行重排
3.丢弃重复数据包,防止数据冗余重复
4.确认应答机制,接收方接受数据之后会发送一个确认
5.超时重传机制,发送方发出数据后会启动一个定时器,超过该定时器时间依旧未收到对方确认,便会重新发送该数据
6.流量控制(16位窗口大小)确保接收方收到的数据在自身缓冲区中不会溢出
7.拥塞控制,保证数据在网络中传播的可靠性,降低丢包的概率,提高TCP的可靠性

UDP没有上述TCP机制
并且如果校验和出错,则UDP会将该报文丢弃

TCP面向字节流,UDP面向数据报
面向字节流是以字节为单位发送数据,并且一个数据包可以以字节大小来拆分成多个数据包,以方便发送。
TCP可以先将数据存放在发送缓冲区中,可以等待数据到一定大小发送,也可以直接发送,没有固定大小可言。
UDP需要每次发送都需要发送固定长度的数据包,如果长度过长需要应用层协议主动将其裁剪到适合长度。

TCP只支持点对点通信,UDP支持一对一,一对多,多对多
TCP需要双方建立连接,所以需要点对点通信。
UDP则无需这么复杂。

TCP有拥塞控制机制,UDP没有
TCP的拥塞控制可是保证了TCP协议在网络中传输的可靠性,降低重传和丢包的概率。UDP不存在。

TCP协议下双方发送接受缓冲区都有,UDP并无实际意义上的发送缓冲区,但是存在接受缓冲区
两者都是全双工,但是UDP需要将自身发送数据先转给Linux内核,然后再由内核发送出去。TCP则是运用自身的滑动窗口来发送数据,并且保证了数据的可靠性。

什么时候选TCP or UDP
对某些实时性要求比较高的情况,选择UDP,比如游戏,媒体通信,实时视频流(直播),即使出现传输错误也可以容忍;其它大部分情况下,HTTP都是用TCP,因为要求传输的内容可靠,不出现丢失。

另外,UDP是面向报文的传输方式是应用层交给UDP多长的报文,UDP发送多长的报文,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。

应用程序和 TCP 的交互是一次一个数据块(大小不等),但 TCP 把应用程序看成是一连串的无结构的字节流。TCP有一个缓冲,当应该程序传送的数据块太长,TCP就可以把它划分短一些再传送。

1 物理层 -> 2 数据链路层 -> 3 网络层(ip)-> 4 传输层(tcp或者udp) -> 5 会话层 --> 6 表示层 --> 7 应用层(http)

TCP(三次握手,四次挥手)

第一次握手

客户端向服务端发送连接请求报文段。该报文段中包含自身的数据通讯初始序号。请求发送后,客户端便进入 SYN-SENT 状态。

第二次握手

服务端收到连接请求报文段后,如果同意连接,则会发送一个应答,该应答中也会包含自身的数据通讯初始序号,发送完成后便进入 SYN-RECEIVED 状态。

第三次握手

当客户端收到连接同意的应答后,还要向服务端发送一个确认报文。客户端发完这个报文段后便进入 ESTABLISHED 状态,服务端收到这个应答后也进入 ESTABLISHED 状态,此时连接建立成功。

第一次挥手

若客户端 A 认为数据发送完成,则它需要向服务端 B 发送连接释放请求。

第二次挥手

B 收到连接释放请求后,会告诉应用层要释放 TCP 链接。然后会发送 ACK 包,并进入 CLOSE_WAIT 状态,此时表明 A 到 B 的连接已经释放,不再接收 A 发的数据了。但是因为 TCP 连接是双向的,所以 B 仍旧可以发送数据给 A

第三次挥手

B 如果此时还有没发完的数据会继续发送,完毕后会向 A 发送连接释放请求,然后 B 便进入 LAST-ACK 状态。

PS:通过延迟确认的技术(通常有时间限制,否则对方会误认为需要重传),可以将第二次和第三次握手合并,延迟 ACK 包的发送。

第四次挥手

A 收到释放请求后,向 B 发送确认应答,此时 A 进入 TIME-WAIT 状态。该状态会持续 2MSL(最长报文段寿命,指报文段在网络中生存的时间,超时会被抛弃) 时间,若该时间段内没有 B 的重发请求的话,就进入 CLOSED 状态。当 B 收到确认应答后,也便进入 CLOSED 状态。

为什么需要四次握手,三次不行吗?

喂喂喂,我是A,你听的到吗?B:在在在,我能听到,我是B,你能听到我吗? A:(听到了,老子不想理你) B:喂喂喂?听不听到?我X,对面死了,我挂了。。

如果只有 2 次的话,B 并不清楚 A 是否收到他发过去的信息。

喂喂喂,我是A,我说完打算挂了。B:好的,那我不理你说啥了(确认A已经说完,第二次挥手),我还没说完,听我说完再挂。巴拉巴拉说完了,可以挂了(第三次挥手)。 A:听到了,老子不想理你(确认B说完但没回应,没有进行第四次挥手) B:喂喂喂?听不听到?我X,对面死了,我还说的对方听没听到,疑惑。。

如果只有 3次的话,B 并不清楚 A 是否知道B说完可以挂了。

HTTP

HTTP 是建立在 TCP 上的应用层协议,超文本传送协议。

HTTP 连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。

http1.0 :客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。

http1.1 :可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后就可以再发送一个新的请求

http2.0 :支持多路复用,一个 TCP 可同时传输多个 http 请求,头部数据还做了压缩

http3.0 :使用了 QUIC,开启多个 TCP 连接,在出现丢包的情况下,只有丢包的 TCP 等待重传,剩余的 TCP 连接还可以正常传输数据

HTTP特点
  • 无状态:协议对客户端没有状态存储,对事物处理没有“记忆”能力,比如访问一个网站需要反复进行登录操作。

  • 无连接:HTTP/1.1之前,由于无状态特点,每次请求需要通过TCP三次握手四次挥手,和服务器重新建立连接。比如某个客户机在短时间多次请求同一个资源,服务器并不能区别是否已经响应过用户的请求,所以每次需要重新响应请求,需要耗费不必要的时间和流量。

  • 基于请求和响应:基本的特性,由客户端发起请求,服务端响应。

  • 简单快速、灵活。

  • 通信使用明文、请求和响应不会对通信方进行确认、无法保护数据的完整性。

Method
  • GET 方法请求一个指定资源的表示形式. 使用GET的请求应该只被用于获取数据.

  • HEAD 方法请求一个与GET请求的响应相同的响应,只返回请求头,没有响应体,多数由 JavaScript 发起

  • POST 方法用于将实体提交到指定的资源,通常导致状态或服务器上的副作用的更改.

  • PUT 方法用请求有效载荷替换目标资源的所有当前表示。

  • DELETE 方法删除指定的资源。

  • CONNECT 方法建立一个到由目标资源标识的服务器的隧道,多用于 HTTPS 和 WebSocket 。

  • OPTIONS 方法,预检,用于描述目标资源的通信选项。通过该请求来知道服务端是否允许跨域请求。

  • TRACE 方法沿着到目标资源的路径执行一个消息环回测试,多数线上服务都不支持

  • PATCH 方法用于对资源应用部分修改。

HTTP 与 TCP 区别

TCP 协议对应于传输层,而 HTTP 协议对应于应用层,从本质上来说,二者没有可比性:

  • HTTP 对应于应用层,TCP 协议对应于传输层

  • HTTP 协议是在 TCP 协议之上建立的,HTTP 在发起请求时通过 TCP 协议建立起连接服务器的通道,请求结束后,立即断开 TCP 连接

  • HTTP 是无状态的短连接,而 TCP 是有状态的长连接

  • TCP是传输层协议,定义的是数据传输和连接方式的规范,HTTP是应用层协议,定义的是传输数据的内容的规范

说明:从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。

WebSocket 同 HTTP 一样也是应用层的协议,但是它是一种双向通信协议,是建立在 TCP 之上的。

WebSocket和Http的关系和异同点

每个WebSocket连接都始于一个HTTP请求。 具体来说,WebSocket协议在第一次握手连接时,通过HTTP协议在传送WebSocket支持的版本号,协议的字版本号,原始地址,主机地址等等一些列字段给服务器端.

Upgrade首部,用来把当前的HTTP请求升级到WebSocket协议,这是HTTP协议本身的内容,是为了扩展支持其他的通讯协议。 如果服务器支持新的协议,则必须返回101.

一个WebSocket连接是在客户端与服务器之间HTTP协议的初始握手阶段将其升级到Web Socket协议来建立的,其底层仍是TCP/IP连接

相同点:
(1)都是建立在TCP之上,通过TCP协议来传输数据。
(2)都是可靠性传输协议。
(3)都是应用层协议。

不同点:
(1)WebSocket支持持久连接,HTTP不支持持久连接。

(2)WebSocket是双向通信协议,HTTP是单向协议,只能由客户端发起,做不到服务器主动向客户端推送信息。

WebSocket和Socket

Socket 其实并不是一个协议,而是为了方便使用 TCP 或 UDP 而抽象出来的一层,是位于应用层和传输控制层之间的一组接口。 Socket本身并不是一个协议,它工作在OSI模型会话层,是一个套接字,TCP/IP网络的API,是为了方便大家直接使用。

更底层协议而存在的一个抽象层。Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
而WebSocket则是一个典型的应用层协议。

WebSocket  HTTP和TCP/IP

 WebSocket和HTTP一样,都是建立在TCP之上,通过TCP来传输数据。

Socket和TCP/IP 

Socket是对TCP/IP协议的封装,像创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。

TCPUDP是两种常用的传输协议,它们有各自的优点和缺点。 TCP的优点包括: - 可靠性:TCP提供可靠的数据传输,通过使用确认、重传和流量控制等机制来确保数据的完整性和正确性。 - 有序性:TCP保证数据按照发送的顺序到达目的地,不会出现乱序的情况。 - 错误检测和纠正:TCP使用校验和和确认机制来检测和纠正传输过程中的错误。 - 适用于大量数据传输:TCP适用于需要传输大量数据的场景,如文件传输、页浏览等。 TCP的缺点包括: - 速度相对较慢:由于TCP提供可靠性和有序性的特性,它需要进行确认和重传等操作,导致传输速度相对较慢。 - 连接建立和断开的开销较大:TCP需要进行三次握手来建立连接,以及四次挥手来断开连接,这些过程会增加额外的开销。 UDP的优点包括: - 速度快:UDP不需要进行确认和重传等操作,因此传输速度相对较快。 - 无连接:UDP是一种无连接的协议,不需要建立和断开连接,适用于实时性要求较高的应用场景。 - 适用于少量数据传输:UDP适用于需要传输少量数据的场景,如音频、视频流等。 UDP的缺点包括: - 不可靠性:UDP不提供可靠性和有序性的保证,可能会出现丢包、乱序和重复等问题。 - 不适用于大量数据传输:由于UDP不提供流量控制和拥塞控制等机制,不适合传输大量数据。 总结起来,TCP适用于对可靠性和有序性要求较高的场景,而UDP适用于对实时性要求较高、少量数据传输的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值