传输层的作用是分段及封装应用层送来的数据,提供端到端的传输服务,在发送主机与接收主机之间构建逻辑通信。传输层包括两个协议 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 协议把若干字节构成一个分组,我们可以把这样的分组称为报文段(Segment),这种报文段并不一定都一样长,可以几个字节,也可以是几千个字节。
缓存:数据流向的每一个方向上都有两种缓存,发送缓存和接收缓存。
字节号:应用层向传输层发送的是一个个字节,在传输层会对这些字节进行编号,对字节的编号被称为字节号。字节号的范围为 0~$$(2^{32}-1)$$,它不是从 0 开始进行编号的,而是随机从某个编号开始顺序往下进行编号。
序号:传输层向网络层发送的是一个个报文段,一个或者多个字节组合起来形成报文段,给报文段的编号就叫做序号。每个报文段的序号就是这个报文段中第一个字节数据的字节号。
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 协议的责任是创建进程到进程间的通信(由端口号完成),以及有限的差错控制,出现差错悄悄丢弃报文分组。
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 服务。