【重难点】【计算机网络 02】TCP 和 UDP 的区别、TCP 的三次握手和四次挥手、HTTP 和 HTTPS、HTTP 各版本之间的区别、HTTP 如何实现长连接

【重难点】【计算机网络 02】TCP 和 UDP 的区别、TCP 的三次握手和四次挥手、HTTP 和 HTTPS、HTTP 各版本之间的区别、HTTP 如何实现长连接

一、TCP 和 UDP

1.简介

TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Datagram Protocol,用户数据报协议)都运行在传输层。TCP 提供可靠的通信传输,而 UDP 则常被用于将广播和细节控制都交给应用的通信传输

TCP 是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP 层是位于 IP 层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是 IP 层不提供这样的流机制,而是提供不可靠的包交换。应用层像 TCP 层发送用于网间传输的、用 8 位字节表示的数据流,然后 TCP 把数据流分割成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元的限制)。之后 TCP 把结果包传给 IP 层,由它来透过网络将包传送给接收端实体的 TCP 层。TCP 为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认信息(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设已丢失并进行重传。TCP 用一个校验和函数来检验数据是否有错误,在发送和接收时都要计算校验和

UDP 是一个简单的面向数据报的通信协议,UDP 为网络层以上和应用层以下提供了一个简单的接口。UDP 只提供数据的不可靠传递,它一旦把应用程序发给网络层的数据发送出去,就不保留数据备份(所以 UDP 有时候也被认为是不可靠的数据报协议)。UDP 在 IP 数据报的头部仅仅加入了复用和数据校验字段。UDP 适用于不需要或在程序中执行错误检查和纠正的应用,它避免了协议栈中此类处理的开销。对时间有较高要求的应用程序通常使用 UDP,因为丢弃数据包比等待或重传导致延迟更可取

2.对应的常见应用层协议

使用 TCP 协议的常见协议:

  1. HTTP:这是用的最多的协议,上网浏览网页时,就得在提供网页资源的计算机上打开 80 号端口,以提供服务
  2. FTP:定义了文件传输协议,使用 21 端口。常说某某计算机开了 FTP 服务就是启动了文件传输服务。下载或上传文件,都需要用到 FTP 服务
  3. Talent:它是一种用于远程登陆的端口,用户可以以自己的身份远程连接到计算机上,通过这种端口可以提供一种基于 DOS 模式下的通信服务。比如以前的 BBS 是纯字符界面的,支持 BBS 的服务器将 23 端口打开,对外提供服务
  4. SMTP:定义了简单邮件传送协议,现在很多邮件服务器都用的是这个协议,用于发送邮件。如常见的免费邮件服务中用的就是这个邮件服务端口,所以在电子邮件设置中常看到有 SMTP 端口设置这一栏,服务器开放的是 25 号端口
  5. POP3:它是和 SMTP 对应的,POP3 用于接收邮件。通常情况下,POP3 协议所用的是 110 端口。也就是说,只要你有相应的使用 POP3 协议的程序,就可以不以 Web 方式登录进邮箱界面,直接用邮件程序就可以收到邮件

使用 UDP 协议的常见协议:

  1. DNS:用于域名解析服务,将域名地址转换为 IP 地址,DNS 用的是 53 号端口
  2. SNMP:简单网络管理协议,使用 161 号端口,用来管理网络设备。由于网络设备很多,无连接的服务就体现出其优势
  3. TFTP:Trival File Transfer Protocol,简单文件传输协议,该协议使用 69 号端口

3.对比

UDP 不提供复杂的控制机制,利用 IP 提供面向无连接的通信服务。并且它是将应用程序发来的数据在收到的那一刻,立刻按照原样发送到网络上的一种机制。即使是出现网络拥堵的情况下,UDP 也无法进行流量控制等避免网络拥塞的行为。此外,传输途中如果出现了丢包,UDP 也不负责重发。甚至当出现包的到达顺序混乱时也没有纠正功能。如果需要控制这些细节,那么就需要交由应用程序处理。也就是说,UDP 将部分控制转移到应用程序去处理,自己却只提供作为传输层协议的最基本功能

TCP 充分实现了数据传输时的各种控制功能,可以进行丢包的重发控制,还可以对次序混乱的分包进行顺序控制。而这些在 UDP 中都没有。此外,TCP 作为一种面向有连接的协议,只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费

TCP 的可靠性

  1. TCP 建立连接基于三次握手,断开连接基于四次挥手,确保连接和断开的可靠性
  2. TCP 的可靠性还体现在有状态,TCP 会记录哪些数据发送了,哪些数据被接收了,哪些没有被接收,并且保证数据包按序到达,保证数据传输不出差错
  3. TCP 的可靠性还体现在可控制,TCP 有数据包校验、ACK 应答、超时重传(发送方)、失序数据重传(接收方)、丢弃重复数据、流量控制(滑动窗口)和拥塞控制等机制

如何对 TCP 和 UDP 加以区分使用

TCP 用于在传输层有必要实现可靠性传输的情况,由于它时面向连接,并具备顺序控制、重发控制等机制的,所以它可以为应用提供可靠传输。另一方面,UDP 主要用于那些对高速传输和实时性有较高要求的通信或广播通信。举一个 IP 电话的例子,如果使用 TCP,数据在传输途中如果丢失会被重发,但是这样无法流畅地传输通话人的声音,会导致无法进行正常交流。而采用 UDP,它不会进行重发处理,从而也就不会有声音大幅度延迟到达的问题。即使有部分数据丢失,也只是影响一小部分的通话。此外,在多播与广播通信中也是用 UDP 而不是 TCP

总结

  1. TCP 面向连接,传输数据之前需要建立连接;UDP 是无连接的,即发送数据之前不需要建立连接
  2. TCP 提供可靠传输,保证数据不丢包、不重复且按序到达;UDP 只尽量交付,不保证可靠
  3. TCP 面向字节流,TCP 把数据看成一连串无结构的字节流;UDP 是面向报文的
  4. TCP 提供了拥塞控制;UDP 不提供,因此网络出现拥塞不会使源主机的发送速率降低,对实时应用很有用,如 IP 电话和视频会议
  5. TCP 只支持点到点通信;UDP 支持一对一、一对多、多对多的交互通信
  6. TCP 首部开销大,要 20 字节;UDP 首部开销小,只要 8 字节
  7. TCP 的逻辑通信信道是全双工的可靠信道;UDP 则是不可靠信道

二、TCP 的三次握手和四次挥手(第三次握手时 ACK 丢失怎么办)

1.三次握手

三次握手的目的就是同步连接双方的序列号和确认号,并交换 TCP 窗口大小信息

在这里插入图片描述

  1. 客户端发送 SYN(Synchronize Sequence Numbers,同步序列号)(SYN = 1,seq = x),发送完毕后,客户端进入 SYN_SEND 状态
  2. 服务端响应 SYN + ACK(Acknowlege,确认)(ACK = 1,seq = y,ACKnum = x + 1),发送完毕后,服务端进入 SYN_RCV 状态
  3. 客户端发送 ACK(ACK = 1,ACKnum = y + 1),发送完毕后,客户端进入 ESTABLISHED 状态,当服务端接收到这个包时,也进入 ESTABLISHED

2.四次挥手

在这里插入图片描述

  1. 客户端发送 FIN(FIN = 1,seq = u),发送完毕后,客户端进入 FIN_WAIT_1 状态
  2. 服务端响应 FIN + ACK(ACK = 1,ack = u + 1,seq = v),发送完毕后,服务器端进入 CLOSE_WAIT 状态,客户端接收到这个确认包之后,进入 FIN_WAIT_2 状态
  3. 服务端发送 FIN(FIN = 1,ACK = 1,seq = w,ack = u + 1),发送完毕后,服务端进入 LAST_ACK 状态,等待来自客户端的最后一个 ACK
  4. 客户端响应 ACK(ACK = 1,seq = w,ack = w + 1),客户端接收到来自服务端的关闭请求,发送一个确认包,并进入 TIME_WAIT 状态。服务端接收到这个确认包之后,关闭连接,进入 CLOSED 状态。客户端在等待了某段固定时间(一般是两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务端的 ACK,认为服务端已经正常关闭连接,于是自己也关闭连接,进入 CLOSED 状态

3.为什么握手一定得三次

为什么不能是两次?

一对男女互相确认关系时,男孩子先说我爱你,女孩子也说我也爱你。但是如果男孩子不说知道了,女孩子就无法百分百确定男孩子收到了自己的想法,那么这段关系也是无法确定的

为什么不能是四次?

因为三次就可以确定连接可靠,第四次就会多余

4.为什么挥手一定得四次

一对情侣打电话聊天,通话差不多要结束时。女孩子说,“我没啥要说的了”。男孩子回答,“我知道了”。但是男孩子可能还有要说的话,女孩子不能直接挂断,直接挂断就无法听到男孩子后面的话了。男孩子把剩下的话说完之后,对女孩子说,“我说完了”。女孩子回答,“我知道了”。这样,才能可靠地结束这次通话。

5.第四次挥手为什么客户端要等待 2MSL

第一,为了保证客户端发送的最后一个 ACK 报文段能够到达服务端。这个 ACK 报文段有可能丢失,因而使处在 LAST_ACK 状态的服务端收不到。服务端没收到就会超时重传第三次挥手的 FIN + ACK 报文段,这样客户端就能在 2MSL 时间内收到这个重传的 FIN + ACK 报文段。接着客户端重传一次 ACK 报文段,重新启动 2MSL 计时器

第二,防止已失效的连接请求报文段出现在本连接中。客户端在发送完最后一个 ACK 报文段后,经过 2MSL 的时间,才可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样就可以使下一个连接中不会出现这种旧的连接请求报文段

三、HTTP 和 HTTPS

1.HTTP

超文本传输协议(HyperText Transfer Protocol)是一种用于分布式、协作式和超媒体信息系统的应用层协议。设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法。通过 HTTP 或者 HTTPS 协议请求的资源由统一资源标识符(Uniform Resource Identifiers,URI)来标识

HTTP 是一个客户端和服务端之间请求和应答的标准,通常使用 TCP 协议。通过使用网页浏览器、网络爬虫或者其它的工具,客户端发起一个 HTTP 请求到服务器上指定端口(默认端口为 80).我们称这个客户端为用户代理程序(user agent)。应答的服务器上存储着一些资源,比如 HTML 文件和图像。我们称这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个 “中间层”,比如代理服务器、网关或者隧道(tunnel)

尽管 TCP/IP 协议是互联网上最流行的应用,但是在 HTTP 协议中并没有规定它必须使用它。事实上 HTTP 可以在任何互联网协议或其它网络上实现。HTTP 假定其下层协议提供可靠的传输。因此,任何能够提供这种保证的协议都可以被其使用

通常,由 HTTP 客户端发起一个请求,创建一个到服务器指定端口(默认是 80 端口)的TCP 连接。HTTP 服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如 “HTTP/1.1 200 OK”,以及返回的内容,如请求的文件、错误消息或者是其它消息

HTTP 是基于客户/服务器模式,且面向连接的。典型的 HTTP 事务处理有如下的过程:

  1. 客户与服务器建立连接
  2. 客户向服务器提出请求
  3. 服务器接受请求,并根据请求返回相应的文件作为应答
  4. 客户与服务器关闭连接

客户与服务器之间的 HTTP 连接是一种一次性连接,它限制每次连接只处理一个请求,当服务器返回本次请求的应答后便立即关闭连接,下次请求再重新建立连接。这种一次性连接主要考虑到万维网服务器面向的是 Internet 中成千上万个用户,且只能提供有限个连接,故服务器不会让一个连接处于等待状态,及时地释放连接可以大大提高服务器的执行效率

HTTP 是一种无状态协议,即服务器不保留与客户交易时的任何状态。这就大大减轻了服务器记忆负担,从而保持较快的响应速度。HTTP 是一种面向对象的协议。允许传送任意类型的数据对象。它通过数据类型和长度来标识所传送的数据内容和大小,并允许对数据进行压缩传送。当用户在一个 HTML 文档中定义了一个超文本链后,浏览器将通过 TCP/IP 协议与指定的服务器建立连接

HTTP 支持持久连接,在 HTTP/0.9 和 HTTP/1.0 中,连接在单个请求/响应对之后关闭。在 HTTP/1.1 中,引入了保持活动机制,其中连接可以重用于多个请求。这样的持久性连接可以明显减少请求延迟,因为在发送第一个请求之后,客户端不需要重新三次握手。另一个积极的副作用是,通常,由于 TCP 的缓慢启动机制,连接随着时间的推移而变得更快

2.HTTPS

超文本传输安全协议(HyperText Transfer Protocol Secure)是一种通过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的是提供对网站服务器的身份认证,保护交换资料的隐私与完整性。这个协议由网景公司(Newscape)在 1994 年首次提出,随后扩展到互联网上

传输层安全性协议(Transport Layer Security)及其前身安全套接层(Secure Sockets Layer)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。
SSL 包含记录层(Record Layer)和传输层,记录层协议确定传输层数据的封装格式。传输层安全协议使用 X.509 认证,之后利用非对称加密演算来对通信方做身份认证,之后交换对称密钥作为会谈密钥(Session Key)。这个会谈密钥是用来将通信双方交换的资料做加密,保证两个应用间通信的保密性和可靠性,使客户与服务器应用之间的通信不被攻击者窃听

HTTPS 的主要作用是在不安全的网络上创建一个安全信道,并可在使用适当的加密包和服务器证书可被验证且可被信任时,对窃听和中间人攻击提供合理的防护

HTTPS 的信任基于预先安装在操作系统中的证书颁发机构(CA)。因此,与一个网站之间的 HTTPS 连线仅在这些情况下被信任:

  • 浏览器正确地实现了 HTTPS 且操作系统中安装了正确且受信任的证书颁发机构
  • 证书颁发机构仅信任合法的网站
  • 被访问的网站提供了一个有效的证书,也就是说它是一个由操作系统信任的证书颁发机构签发的(大部分浏览器会对无效的证书发出警告)
  • 该证书正确地验证了被访问的网站
  • 此协议的加密层(SSL/TLS)能够有效地提供认证和高强度的加密

3.HTTP 和 HTTPS 的对比

HTTP 原理

  • 客户端的浏览器首先要通过网络与服务器建立连接,该链接是通过 TCP 来完成的,一般 TCP 连接的端口号是 80.建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符、协议版本号,后边是 MIME 信息,包括请求修饰符、客户机信息和许可内容
  • 服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是 MIME 信息,包括服务器信息、实体信息和可能的内容

HTTPS 原理

  • 客户端发起 HTTP 请求,在浏览器地址栏输入一个 HTTPS 网址,然后连接到服务端的 443 端口。在此过程中,客户端会发送一个密文族给服务端,密文族是浏览器所支持的加密算法的清单
  • 服务端发送证书,这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构、过期时间等等
  • 客户端解析证书,这部分工作是由客户端的 SSL/TLS 来完成的,首先会验证公钥是否有效,如颁发机构、过期时间等等。证书中会包含数字签名,该数字签名是加密过的,是用颁发机构的私钥对本证书的公钥、名称及其他信息做 hash 散列加密而生成的。客户端浏览器会首先找到该证书的根证书颁发机构,如果有,则用该根证书的公钥解密服务器下发的证书,如果不能正常解密,证明该证书是伪造的,则就会提示发现异常。如果发现异常则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随机值,然后用证书对该随机值进行加密
  • 客户端发送加密信息,这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,然后客户端和服务端的通信就可以通过这个随机值来进行加密和解密了
  • 服务端解密信息,服务端用私钥解密后,得到了客户端传过来的随机值,至此一个非对称加密的过程结束,SSL/TLS 利用非对称加密实现了身份认证和密钥协商。然后把内容通过该值进行对称加密
  • 服务端传输加密后的信息,这部分是服务端用随机值加密后的信息,可以在客户端被还原
  • 客户端解密信息,客户端用之前生成的随机值解密服务端传送过来的信息,于是获取了解密后的内容,至此一个对称加密的过程结束,看到对称加密是用于对服务器待传送给客户端的数据进行加密用的。整个过程即使第三方监听了数据,也束手无策

HTTP 和 HTTPS 的区别

它们之间的区别可以从安全性、数据是否加密、默认端口等这几个方面去分析

HTTPHTTPS
安全性不安全安全
默认端口80443
资源消耗较少较多
是否需要证书
报文是否加密

数字证书和数字签名

数字证书是指在互联网通信中标志通信各方身份信息的一个数字认证,人们可以在网上用它来识别对方的身份。它的出现,是为了避免身份被篡改冒充

数字证书的构成:

公钥和个人的信息,经过 Hash 摘要算法加密,形成消息摘要。将消息摘要拿到拥有公信力的认证中心(CA),用他它的私钥对消息摘要加密,形成数字签名

公钥、个人信息和数字签名共同构成数字证书

四、HTTP 各版本之间的区别

0.9

这是 HTTP 最早最大规模使用的版本,现在已过时。在这个版本中只有 GET 一种请求方法,在 HTTP 通讯也没有指定版本号,也不支持请求头信息。该版本不支持 POST 等方法,因此客户端向服务器传递信息的能力非常有限

1.0

默认使用短连接,每次请求都需要建立一个 TCP 连接,可以设置 Connection:keep-alive 这个字段,强制开启长连接。这个版本支持 GET、POST、HEAD 三种请求方法

1.1

是当前正在使用的版本。该版本默认采用持久连接,并能很好地配合代理服务器工作。还支持以管道方式同时发送多个请求,以便降低线路负载,提高传输速度。这个版本新增了 OPTIONS、PUT、DELETE、TRACE、CONNECT 五种请求方法

2.0

这个版本是 2015 年 5 月发布的版本。通过支持请求与相应的多路重用来减少延迟,通过压缩 HTTP 头字段将协议开销降到最低,同时增加了对请求优先级和服务端推送的支持

HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮

五、HTTP 如何实现长连接

HTTP 分为长连接和短连接,本质上说的是 TCP 的长短连接。TCP 连接是一个双向的通道,它是可以保持一段时间不关闭的,因此 TCP 连接才具有真正的长连接和短连接这一说法

TCP 长连接可以复用一个 TCP 连接,来发起多次的 HTTP 请求,这样就可以减少资源消耗。比如一次请求 HTML,如果是短连接的话,可能还需要请求后续的 JS/CSS

通过在头部(请求和响应头)设置 Connection:keep-alive

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

313YPHU3

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值