zoukankan      html  css  js  c++  java
  • TCP协议和UDP协议

    传输层的作用是分段封装应用层送来的数据,提供端到端的传输服务,在发送主机与接收主机之间构建逻辑通信。传输层包括两个协议 TCP 协议UDP 协议

    传输层协议

    分段、封装、端到端

    分段的主要目的就是提高传输效率。应用层到传输层的数据是一个个字节,每一个字节都会有一个编号,这个标号就叫做字节号。如果传输层接收到一个个字节,然后再一个个传输到网络层,这样的效率没有将多个字节组合起来效率高。这里可以想象我们在运西瓜,一个个送西瓜没有把西瓜装成一车运送的效率高。所以传输层会将字节组成和报文段,报文段也有编号,在这里这些编号叫做序号

    封装即表示加上相应的头部信息,将数据封装起来。

    传输层协议

    如上图所示,我们在应用层有两个应用进程 AP1 和 AP2。假设它们是 Telnet 和 Http 服务,那么它们的端口就是 23 端口和 80 端口。与之对应的 AP3 和 AP4 同样也使用 23 端口和 80 端口。

    此时,传输层就会通过端口建立端到端的连接,使对应的应用程序进行通信。这里需要注意的是,此处的端到端连接,并不是指在传输层直接建立链路,而是指传输层通过端口建立了逻辑上的连接。

    总结:由应用程序产生应用进程,应用进程产生进程端口号,由端口号提供相关的服务。

    两台主机进程间通信条件

    • 本地主机(IP地址定义)
    • 本地进程(端口定义)
    • 远程主机(IP地址定义)
    • 远程进程(端口定义)

    端口范围

    • 熟知端口(著名端口):0-1023,由ICANN指派和控制
    • 注册端口:1024-49151,IANA不指派也不控制,但须注册
    • 动态端口(短暂端口):49152-65535,IANA不指派也不控制,无须注册

    传输层的分用和复用

    传输层的分用和复用

    传输层协议和网络层协议的主要区别

    运输层协议和网络层协议的主要区别

    两台主机之间要进行通信,在应用层的应用程序会启动应用进程,应用进程会开放相应的端口。两台主机通过因特网进行互联,其中网络层 IP 协议的作用是提高主机之间的逻辑通信,而传输层的 TCP 协议和 UDP 协议则提供进程之间的逻辑通信

    TCP 协议

    传输控制协议 TCP 简介:

    • 面向连接的、可靠的、基于字节流的传输层通信协议
    • 将应用层的数据流分割成报文段并发送给目标节点的 TCP 层
    • 数据包都有序号,对方收到则发送 ACK 确认,未收到则重传
    • 使用校验和来检验数据在传输过程中是否有误

    核心问题

    • TCP 包头很复杂,但是主要关注五个问题,顺序问题,丢包问题,连接维护,流量控制,拥塞控制;
    • 连接的建立是经过三次握手,断开的时候四次挥手,一定要掌握的我画的那个状态图。

    TCP 协议基本概念

    套接字

    套接字地址

    • TCP 使用“连接”(而不仅仅是“端口”)作为最基本的抽象,同时将 TCP 连接的端点称为插口(socket),或套接字、套接口。
    • 插口和端口、IP 地址的关系是:ip地址+端口=套接字

    TCP段

    在传出层向网络层发送数据时要以分组为单位,而不是以字节流来发送的。TCP 协议把若干字节构成一个分组,我们可以把这样的分组称为报文段(Segment),这种报文段并不一定都一样长,可以几个字节,也可以是几千个字节。

    • 缓存:数据流向的每一个方向上都有两种缓存,发送缓存和接收缓存。

    • 字节号:应用层向传输层发送的是一个个字节,在传输层会对这些字节进行编号,对字节的编号被称为字节号。字节号的范围为 0~$$(2^{32}-1)$$,它不是从 0 开始进行编号的,而是随机从某个编号开始顺序往下进行编号。

    • 序号:传输层向网络层发送的是一个个报文段,一个或者多个字节组合起来形成报文段,给报文段的编号就叫做序号。每个报文段的序号就是这个报文段中第一个字节数据的字节号。

    TCP 协议报文段格式详解

    TCP协议报文段

    • 源端口和目的端口字段——各占 2 字节。端口是传输层与应用层的服务接口。传输层的复用和分用功能都要通过端口才能实现。
    • 序号字段——占 4 字节。TCP 连接中传送的数据流中的每一个字节都编上一个序 号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。
    • 确认号字段——占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。
    • 首部长度——占 4 bit,它指出 TCP 首部共有多少个 4 字节,首部长度可以在 20~60 字节之间 。因此,这个字段值可以在5(5X4=20)至15(15X5=60)之间。
    • 保留字段——占 6 bit,保留为今后使用,但目前应置为 0。
    • 紧急比特 URG —— 当 URG=1 时,表明紧急指针字段有效。它告诉系统此报 文段中有紧急数据,应尽快传送(相当于高优先级的数据)。
    • 确认比特 ACK —— 只有当ACK=1 时确认号字段才有效。当 ACK=0时,确认号无效。
    • 推送比特 PSH —— 接收 TCP 收到 PSH=1 的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满了后再向上交付。
    • 复位比特 RST —— 当 RST=1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
    • 同步比特 SYN —— 同步比特 SYN=1,就表示这是一个连接请求或连接接受报文。
    • 终止比特 FIN —— 用来释放一个连接。当FIN=1 时,表明此报文段的发 送端的数据已发送完毕,并要求释放运输连接。
    • 窗口字段 —— 占 2 字节。窗口字段用来控制对方发送的数据量,单位为字节。TCP 连接的一端根据设置的缓存空间大小确定自己的接收窗口大小,然后通知对方以确定对方的发送窗口的上限。
    • 检验和 —— 占 2 字节。检验和字段检验的范围包括首部和数据这两部分。在计 算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。
    • 紧急指针字段 —— 占 16 bit。紧急指针指出在本报文段中的紧急数据的最后一个 字节的序号。
    • 选项字段 —— 长度可变 。 TCP 只规定了一种选项 , 即 最大报文段长度 MSS (Maximum Segment Size)。MSS 告诉对方 TCP:“我的缓存所能接收的报文段 的数据字段的最大长度是 MSS 个字节。”
    • 填充字段 —— 这是为了使整个首部长度是 4 字节的整数倍

    三次握手

    三次握手

    • 第一次握手:客户端发起一个连接请求,传输 SYN 表示希望建立连接,传输随机产生报文段序号的SEQ=x
    • 第二次握手:服务器端收到客户端发起的连接请求,传输 SYN+ACK 表示确认连接,并且传输服务器端的报文段 SEQ=y,同时用 ACK=x+1表明希望客户端下一次传过来的报文序号为 x+1。

    • 第三次握手:客户端收到服务器端的确认请求,根据服务器端的要求传输 SEQ=x+1 的报文,并且发送 ACK=y+1 确认服务器端的确认请求。

    第一次握手:SYN, SEQ=x

    第二次握手:SYN+ACK,SEQ=y,ACK=x+1

    第三次握手:ACK,SEQ=x+1,ACK=y+1

    三次握手建立连接的要点就是,我们通过 TCP 报文段中的 SYN 和 ACK 标志位来确认连接。同时需要注意报文的顺序问题,SEQ 在最开始是随机产生的,但是在建立连接的过程中要按照次序发送。

    四次挥手

    四次挥手

    • 第一次挥手:A 的 TCP 报文中 FIN=1,表示我这里的工作完成了,要和你断开连接。同时,带着自己的报文序号 SEQ=x
    • 第二次挥手:B 收到 A 的断开连接的请求,用 ACK=x+1表示我知道你要断开了,带上自己的报文 SEQ=y。此时连接处于半断开状态,也就是说 A 和 B 单方面表示要断开了,但是 B 这边可能还有一些事情要处理,没有正式通知 A 它这边已经准备好断开了。
    • 第三次挥手:这是时候 B 的事情处理完了,它告诉 A 我这边一切 ok 了,我也准备断开了。所以 B 和 A 断开连接的请求一样,发送 FIN=1 同时发送 SEQ 和 ACK
    • 第四次挥手:此时按说 A 收到 B 也说可以断开,彻底断开就完了。但是事情还没有结束。因为 A 如果不告诉 B 我已经收到你的断开请求,B 无法确认 A 是不是知道可以彻底断开了,B 就会一直发送请求,知道 A 进行回复。所以 A 要发送确认 B 断开请求的请求,即 ACK=y+1,SEQ=x+1

    这次挥手结束我们会发现 A 处于 TIME_WAIT 状态,这是什么原因呢?其实也很简单,A 发送确认请求之后无法确认这个请求会到达 B,所以就多等 2MSL 的时间,这段时间如果收到 B 的 FIN 请求,则还有机会再进行确认。如果 A 直接进行 CLOSED 状态,很有可能 B 收不到这个确认请求。

    UDP 协议

    UDP 是无连接、不可靠的协议。UDP 协议的责任是创建进程到进程间的通信(由端口号完成),以及有限的差错控制,出现差错悄悄丢弃报文分组。

    UDP

    TCP 协议与 UDP 协议的对比

    TCP UDP
    TCP 提供可靠交付。通过 TCP 连接传输的数据,无差错、不丢失、不重复、并且按序到达。 UDP 继承了 IP 包的特性,不保证不丢失,不保证按顺序到达。
    TCP 是面向字节流的。发送的时候发的是一个流,没头没尾。 UDP 继承了 IP 的特性,基于数据报的,一个一个地发,一个一个地收。
    TCP 是可以有拥塞控制的。它意识到包丢弃了或者网络的环境不好了,就会根据情况调整自己的行为,看看是不是发快了,要不要发慢点。 UDP 就不会,应用让我发,我就发,管它洪水滔天
    TCP 其实是一个有状态服务,是有脑子的,里面精确地记着发送了没有,接收到没有,发送到哪个了,应该接收哪个了,错一点儿都不行。 UDP 则是无状态服务。** 通俗地说是没脑子的,天真无邪的,发出去就发出去了。

    TCP 协议和 UDP 协议都是传输层的通信协议。

    • 协议特点:TCP 协议是面向连接的、可靠的、基于字节流的的传输层通信协议。UDP 是无连接、不可靠、基于数据报文段的通信协议;
    • 应用场景:TCP 相对于 UDP 来说首部开销更大,传输速率较慢,但是可靠性更高。所以,TCP 协议适用于对通信数据可靠性要求高的场景,比如说文件传输、邮件传输等;UDP 协议适合通信速度高的场景,比如说域名转换、视频直播等。

    TCP 和 UDP 分别对应的常见应用层协议

    TCP 对应的应用层协议

    • FTP:定义了文件传输协议,使用 21 端口。常说某某计算机开了 FTP 服务便是启动了文件传输服务。下载文件,上传主页,都要用到 FTP 服务。
    • Telnet:它是一种用于远程登陆的端口,用户可以以自己的身份远程连接到计算机上,通过这种端口可以提供一种基于 DOS 模式下的通信服务。如以前的 BBS 是-纯字符界面的,支持 BBS 的服务器将 23 端口打开,对外提供服务。
    • SMTP:定义了简单邮件传送协议,现在很多邮件服务器都用的是这个协议,用于发送邮件。如常见的免费邮件服务中用的就是这个邮件服务端口,所以在电子邮件设置-中常看到有这么 SMTP 端口设置这个栏,服务器开放的是 25 号端口。
    • POP3:它是和 SMTP 对应,POP3 用于接收邮件。通常情况下,POP3 协议所用的是 110 端口。也是说,只要你有相应的使用 POP3 协议的程序(例如 Fo-xmail 或 Outlook),就可以不以 Web 方式登陆进邮箱界面,直接用邮件程序就可以收到邮件(如是163 邮箱就没有必要先进入网易网站,再进入自己的邮-箱来收信)。
    • HTTP:从 Web 服务器传输超文本到本地浏览器的传送协议。

    UDP 对应的应用层协议

    • DNS:用于域名解析服务,将域名地址转换为 IP 地址。DNS 用的是 53 号端口。
    • SNMP:简单网络管理协议,使用 161 号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。
    • TFTP(Trival File Transfer Protocal):简单文件传输协议,该协议在熟知端口 69 上使用 UDP 服务。
  • 相关阅读:
    ZOJ 3713 In 7-bit (题意不好理解,十进制、二进制、十六进制的转换问题)
    C++ cout 如何保留小数输出
    ZOJ 3705 Applications 模拟
    Google Code Jam Round 1A 2015 Problem B. Haircut 二分
    --算法分析与设计--课程作业--【顺序统计】--【采用链表法散列表】--【开放地址法(双重散列)】
    C++获取当前时间和计算程序运行时间的方法
    【STL__set_的应用】
    ZOJ 3601 Unrequited Love 【STL__pair_的应用】
    Linux概念
    fragment创建
  • 原文地址:https://www.cnblogs.com/shuiyj/p/13185178.html
Copyright © 2011-2022 走看看