1. TCP/IP协议族
1.1 分层
TCP/IP 协议族分为四个层次,从下往上分别是:
- 链路层:也称为数据链路层或网络接口层,包括计算机的网络接口卡和操作系统的设备驱动程序,负责处理与电缆或其他传输媒介的物理接口细节;
- 网络层:也称为互联网层,处理分组在网络中的活动,网络层协议包含 IP 网际协议、ICMP 互联网控制报文协议、IGMP 互联网组管理协议;
- 传输层:为两台主机的应用程序提供端到端的通信,包含 TCP 传输控制协议、UDP 用户数据报协议;
- 应用层:负责处理特定的应用程序细节,包含 Telnet 远程登录、FTP 文件传输协议、SMTP 简单邮件传送协议、SNMP 简单网络管理协议;
我们以 FTP 协议通信为例,从上而下分为四个层次,下面的层次对于上面的层来说是透明的。链路层处理网络通信媒介的细节,IP 协议提供不可靠的服务以将分组从源节点发送到目的节点,TCP 协议采用超时重传、确认分组灯机制,在 IP 协议上提供了一个可靠的传输层,FTP 协议则用来实现某个应用程序。
1.2 封装
应用程序通过网络发送数据,数据被送入协议栈,在协议栈的每一层都要增加一些首部或尾部信息,而在接收方则会逐层去掉附加的信息,得到发送方所发送的数据。
TCP 传给 IP 的数据单元称为 TCP 报文段(TCP segment),IP 传给链路层的数据单元称为 IP 数据报(IP datagram),通过以太网传输的比特流称为帧(frame)。
1.3 IP地址
互联网上的每个接口都有一个唯一的 IP 地址,多借口主机具有多个 IP 地址,每个接口都对应一个 IP 地址。
IP 地址长 32 bit,分为五类地址,他们开头字节不同,网络号和主机号也有差别,因此表示的 IP 地址范围有区别:
- A类:0.0.0.0 到 127.255.255.255,用于单播;
- B类:128.0.0.0 到 191.255.255.255,用于单播;
- C类:192.0.0.0 到 223255.255.255,用于单播;
- D类:224.0.0.0 到 239.255.255.255,用于多播;
- E类:240.0.0.0 到 255.255.255.255,保留用于实验;
1.4 端口号
服务器通过知名端口号来识别,一个 IP 地址和一个端口号构成一个套接字(socket),一个 IP 地址通过不同的 端口号来区分不同的网络数据发送或接收的服务。
TCP/IP 实现提供的任何服务都是用 1 - 1023 之间的端口号,如 HTTP 服务端口号 80,SSH 服务端口号 22,FTP 服务端口号 21,Telnet 服务端口号 23。1024 - 49151 之间的端口号被其他服务使用,如 MySQL 服务端口号 3305,Redis 服务端口号 6379。49152 - 65535 被用作客户端临时端口。
2. 链路层
链路层负责处理与物理网络直接交互的细节,为 IP 模块发送和接收 IP 数据报,为 ARP 模块发送 ARP 请求和接收 ARP 应答,为 RARP 模块发送 RARP 请求和接收 RARP 应答。
链路层解决同一物理网络内的数据传输问题:
- 封装成帧:将网络层的数据报加上头部和尾部,封装为可以在物理介质上传输的帧;
- 物理寻址:使用 MAC 地址来唯一标识网络中的设备,通过 ARP 协议将 IP 地址解析为 MAC 地址,以便将数据帧发给下一跳设备;
- 差错控制:在帧的尾部添加校验码,接收方通过校验码判断出错帧后丢弃帧;
- 流量控制:协调发送方和接收方的速度,防止接收方处理速度慢而导致数据丢失;
差错检测和纠正
通信信道有可能发生传输错误,链路层对于传输错误有两种处理方式。
一种策略是使用纠错码(error-correcting code),通过添加冗余信息,从而在发生少量错误时能够推断出发送的数据,用于无线链路等相对不稳定的场景。常用纠错码有海明码、二进制卷积码、里德所罗门码、低密度奇偶校验码。
另一种策略是使用检错码(error-detecting code),通过添加冗余信息,能够在接收时推断出是否发生了错误,从而请求重传,用于光纤等错误率较低的场景。常用检错码有奇偶、校验和、循环冗余校验(CRC)。
3. 网络层
网络层关注的是如何将数据包从源一路送到接收方,沿途可能经过许多跳(hop)中间路由器。
网络层必须知道网络拓扑结构,从中选择出适当的路径,还必须仔细选择路由器,以避免某些路由器和通信线路负载过重,还需要处理源和接收方所处网络不通的问题。
3.1 IP协议
IP 协议(Internet Protocol)具有不可靠和无连接的特性。
不可靠(unreliable):不能保证 IP 数据报能成功到达目的地,仅提供传输服务,如果发生错误时,IP 会丢弃该数据报,然后发送 ICMP 消息给来源端。
无连接(connectionless):IP 不维护任何关于后续数据报的状态信息,每个数据报的处理是相互独立的,因此 IP 数据报的发送顺序和接收顺序可能不同。
首部
IP 数据报格式如下,首部至少占用 20 字节,包含多个部分信息。
版本目前为 4,因此也称为 IPv4,一个 IP 使用 32 bit 也就是 4 字节来表示。更新的 IPv6 的 IP 使用 128 bit 表示。
总长度指首部和数据部分的长度,单位为字节,该字段 16 字节,所以 IP 数据报最长可达 65535 字节。生存时间(TTL,time to live)设置数据报最多可以经过的路由器数,每经过一个路由器减 1,变成 0 后就会被丢弃,并发送 ICMP 报文通知源主机。
TCP/IP 首部所有二进制整数在网络传输使用网络字节序,也称为 big endian 字节序,如 32 bit 值先传 0 - 7 bit,再传 8 - 15 bit,再传 16 - 23 bit,再传 24 - 31 bit。以 little endian 存储的数据必须先将首部转为网络字节序后传输。
IP 数据报能够传输的最大数据报大小称为 MTU(Maximum Transmission Unit,最大传输单元)。
路由选择
如果源主机和目的主机直接相连或者在一个共享网络上,IP 数据报就直接送到目的主机上,否则,主机会把数据报发往一个默认路由器,由路由器来转发该数据报。
IP 层在内存中有一个路由表,当收到一份数据报并进行发送时,要对该表搜索一次。如果目的 IP 地址是本机地址之一或 IP 广播地址,则对该数据报进行处理,否则如果 IP 层被设置为路由器功能,则会对数据报进行转发,否则丢弃该数据报。
路由表的每一行都包含以下信息:
- 目的 IP 地址;
- 下一跳路由器的 IP 地址;
- 标志:目的 IP 地址是网络地址还是主机地址,下一站路由器是路由器还是相连的接口;
- 为数据报传输指定一个网络接口;
IP 路由选择是逐跳地(hop by hop)进行的,首先会搜索路由表,匹配到目的 IP 地址(网络号和主机号)匹配的表目,无则寻找目的网络号匹配的表目,无则寻找标为默认的表目,然后将报文发送到指定的下一站路由器。如果都找不到,则向应用程序返回主机不可达或网络不可达的错误。
为一个网络指定一个路由器,而不必为每个主机指定一个路由器,可以极大缩小路由表的规模。
子网掩码
IP 地址分为网络号、子网号、主机号三部分,一共 32 bit,子网掩码也有 32 bit,前缀的 1 留给网络号和子网号,后缀的 0 留给主机号。
例如,子网掩码 255.255.255.0 表示有 24 位网络号和子网号,有 8 位主机号,该子网中最多支持 256 个 IP 地址,而子网掩码 255.255.255.192 则表示主机号只有 6 位,该子网最多支持 64 个 IP 地址。
3.2 ARP地址解析协议
ARP 地址解析协议(Address Resolution Protocol)负责将 32 bit 的 IP 地址(逻辑地址)转换成 48 bit 的硬件地址(MAC 地址,物理地址)。
一台主机把以太网数据帧发送到局域网的另一台主机时,是根据 MAC 地址来确定目的接口的,而不是根据 IP 地址来确定。
ARP 为 IP 地址到对应的硬件地址之间提供动态映射,这个过程是自动完成的。一台主机的 ARP 层会发送一份 ARP 请求的以太网数据帧给以太网上的每个主机,这个过程称为广播,目的主机的 ARP 层收到广播报文后,会发送一个 ARP 应答,包含本机的 IP 地址及硬件地址,收到 ARP 应答后,就可以在主机之间发送 IP 数据报了。
每个主机上都有一个 ARP 告诉缓存,存放了最近 IP 地址到硬件地址之间的映射记录。
3.3 RARP逆地址解析协议
RARP 逆地址解析协议(Reverse Address Resolution Protocol)负责通过硬件地址(MAC 地址)查询对应的 IP 地址。
具有本地磁盘的系统在引导时,从磁盘的配置文件中读取到 IP 地址,而对于没有磁盘驱动器的系统,需要发送一个 RARP 请求,从局域网内的 RARP 服务器应答中获取其 IP 地址。
该协议较为古老,已经被 DHCP 动态主机配置协议所取代。
3.4 ICMP互联网控制报文协议
ICMP 互联网控制报文协议(Internet Control Message Protocol)用于在主机、路由器之间传递控制消息,如网络是否通、主机是否可达、路由是否可用等。
ICMP 封装在 IP 数据报中进行传输。
ping
ping 命令用于检查本地主机和目标主机之间网络连接是否通畅,通过向目标地址发送 ICMP 报文,等到返回应答报文来判断网络状态。
traceroute
traceroute 命令用于追踪数据报从本地主机到目标主机所经过的完整路径,向目标主机发送 ICMP 报文,通过逐步增加 IP 数据报的 TTL 值(生存周期),利用 ICMP 超时报文来探测路径的每一条路由器。
首先发送一份 TTL = 1 的 IP 数据报给目标主机,在第一个路由器会将 TTL 减一后丢弃数据报,并发回一份超时 ICMP 报文。然后发送 TTL = 2 的 IP 数据报,在第二个路由器丢弃数据报并发回超时 ICMP 报文。逐步增加 TTL 直至数据报到达目标主机。
通过发送 UDP 数据报给目标主机,并选择一个不可能的值(大于 30000)作为端口号,是目标主机不可能使用该端口,当数据报到达时,目的主机会产生一个“端口不可达”错误的 ICMP 报文,traceroute 命令通过区分接收到的 ICMP 报文是超时还是端口不可达,来判断是否已经到达目标主机。
3.5 RIP路由信息协议
RIP 路由信息协议(Routing Information Protocol)用于在中小型局域网中交换路由信息,相邻路由器之间进行通信以告知对方每个路由器当前所连接的网络。
路由器上有一个路由守护程序,运行路由信息协议,通过与相邻路由器进行通信,更新内核中的路由表。
RIP 报文包含在 UDP 数据报中。
3.6 IGMP互联网组管理协议
IGMP 互联网组管理协议(Internet Group Management Protocol)用于管理多播组成员。
IGMP 包括三种类型的报文:
- 成员报告:主机申请加入多播组,或响应路由器的查询;
- 成员查询:路由器定期询问所有还在监听的主机;
- 离开组:主机告知路由器离开组;
IGMP 报文通过 IP 数据报进行传输。
4. 传输层
传输层在网络层提供的服务之上,把数据传递服务从两台计算机之间扩展到了两台计算机的进程之间,并且提供一定程度独立于物理网络的可靠性。
网络层的代码主要运行在运营商的路由器上,而传输层的代码完全运行在用户的机器上。
4.1 UDP用户数据报协议
UDP 用户数据报协议(User Datagram Protocol)是一个简单的面向数据报的传输层协议,每个发送操作都产生一个 UDP 数据报,并组装成一份 IP 数据报。
UDP 具有几个特征:
-
无连接:发送数据钱不需要建立连接;
-
不可靠:不保证数据报一定能到达对方,也不保证顺序和提供重传机制;
-
面向报文:对应用层的报文不合并或拆分,直接加上 UDP 首部后交给网络层;
UDP 适用于实时性要求高的场景,如 DNS 查询、音视频通话、在线游戏,还是用于广播、多播场景。
首部
UDP 首部只有 8 字节。
IP 数据报会包住 UDP 数据报,IP 数据报头部包含源和目的 IP 地址,而 UDP 数据报则包含源和目的端口号。
IP 数据报最大长度是 65535 字节,在减去 20 字节的 IP 首部和 8 字节的 UDP 首部之后就是 UDP 数据报中用户数据的最长长度。
广播和多播
广播和多播仅应用于 UDP,将报文同时发往多个接收者。
将数据发往单个目标主机称为单播,发往所有其他主机是广播,而发给属于多播组的多个主机则属于多播。
受限的广播地址是 255.255.255.255,用于主机配置时 IP 数据报的目的地址。指向网络的广播地址主机号全为 1,如 A 类网络的广播地址为 netid.255.255.255,指向子网的广播地址主机号全为 1 且有特定子网号的地址,指向所有子网的广播地址子网号和主机号全为 1。
多播只使用 D 类地址,即开始为 1110,后续 28 位 为多播组号。能够接收发往一个特定多播组地址的主机集合称为主机组,一个主机组可跨越多个网络,成员可以随时加入或离开主机组。
4.2 TCP传输控制协议
TCP 传输控制协议(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的通信服务。
- 面向连接
- 两个使用 TCP 的应用在交换数据前必须先建立 TCP 连接;
- TCP 连接仅支持一对一通信,不支持广播和多播;
- 可靠性
- 应用数据被分割成最适合发送的数据块,传输信息单位称为报文或段(segment);
- TCP 收到数据后会发送一个确认;
- 发出一个段后 TCP 会启动定时器,如果不能及时收到目的端的确认,将会重发这个段;
- 保持首部和数据的检验和,丢弃检验和有差错的报文段;
- 对收到的数据进行排序,以正确的顺序交给应用层;
- 接收端将丢弃重复的数据;
- 提供流量控制,有固定大小的缓冲空间;
- 基于字节流
- 应用程序之间通过 TCP 连接交换 8 bit 构成的字节流;
- TCP 不对传输字节流的内容作任何解释,而是由应用层来解释的;
首部
TCP 的首部有 20 字节。
IP 数据报会包住 TCP 数据报,IP 数据报头部包含源和目的 IP 地址,而 TCP 数据报则包含源和目的端口号。一个 IP 地址和一个端口号称为一个 socket,源 socket 和目的 socket 唯一确定一个 TCP 连接。
首部中有六个标志位:
- URG:紧急指针;
- ACK:表示确认序号有效;
- PSH:接收方尽快将报文段交给应用层;
- RST:重建连接;
- SYN:建立连接,并同步序号;
- FIN:释放连接;
32 位序号(seq)用来标识 TCP 发送端向接收端发送的数据字节流,标识这个报文段中的第一个字节数据的计数序号,序号从 0 开始,到 2 ^ 32 - 1 后又从 0 开始。TCP 为应用层提供全双工服务,数据能在两个方向独立传输,因此连接的各端分别保持传输数据的序号。
新建一个连接时,SYN 标志为 1,序号字段包含这个主机选择的该连接的初始序号 ISN(Initial Sequence Number),发送的第一个字节的序号为 ISN + 1。每个 TCP 连接都有不同的 ISN,可以看作是一个每 4 ms 加 1 的计数器,防止在网络中被延迟的分组在之后被接收而造成的冲突。
ACK 标志为 1 时,确认序号(ack)有效,是上次已成功收到数据字节序号加 1,连接建立后 ACK 标志始终设置为 1。
TCP 报文段中的数据部分是可选的,因此在连接建立和终止时,报文段仅有首部而没有数据部分。
建立连接
建立一个 TCP 连接需要经过三次握手。
双方都需要获得对方的序号并发送确认,而被连接方发送确认和发送序号可以在一次报文段中一并发送。
- 客户端向服务端发送一个报文段,设置标志 SYN 表示希望创建连接,同时带上初始序号 ISN 填到序号 seq;
- 服务端发回带有初始序号的 SYN 报文段作为应答,将序号 seq 设置为己方的初始序号 ISN,同时将确认序号 ack 设置为第一个报文的 seq + 1,因为 SYN 也占用一个序号,然后设置标志 ACK;
- 客户端将序号 seq 设置为第一个报文段的 seq + 1,同时将确认序号 ack 设置为第二个报文的 seq + 1,然后设置标志 ACK;
当双方都在未建立连接时向对方发起建立连接,称为同时打开。此时双方都收到了对方的序号,然后发送一次 ACK,最终建立一个连接而不是两个,总共需要四个报文段。
终止连接
终止一个 TCP 连接需要经过四次挥手。
TCP 连接是全双工的,数据可以在两个方向上传递,因此每个方向必须单独关闭。当一方完成数据发送任务后,发送一个标志 FIN 来终止这个方向的连接,另一端收到后必须通知应用层,由应用层来触发关闭报文段的发送。先进行关闭的一方执行主动关闭,另一方则执行被动关闭。
- 客户端首先发送一个标志 FIN 的报文段关闭一方连接;
- 服务端发回一个标志 ACK,并将确认序号 ack 设置为第一个报文段的 seq + 1,因为 FIN 也占用一个序号;
- 服务端通知应用程序后,触发关闭,发送一个 标志 FIN 的报文段关闭这一方的连接;
- 客户端也发回一个标志 ACK,并将确认序号 ack 设置为第三个报文段的 seq + 1;
当双方都发起主动关闭,称为同时关闭。双方最后都进入了 TIME_WAIT 状态,总共需要四个报文段。
数据传输
MSS(Maximum Segment Size,最大报文段长度)是 TCP 报文段中数据部分的最大长度,它等于 MTU - IP 首部 20 字节 - TCP 首部 20 字节。在建立 TCP 连接时,双方会交换各自的 MSS 并取较小值作为本次通信的 MSS。
在一些场景传输的是整块的数据,而有些场景传输的是交互数据,会有频繁而数据量小的数据,这可能造成网络拥塞。Nagle 算法被用与解决这个问题,它要求一个 TCP 连接最多只有一个未被确认的未完成分组,该分组确认到达时不能发送其他分组,TCP 将会在等待确认时收集这些分组以一并发送。在一些延迟敏感的场景,可以使用 TCP_NODELAY 选项来关闭 Nagle 算法。
TCP 使用滑动窗口来控制数据发送,以实现流量控制和可靠传输。定义一个允许发送的数据队列上的滑动的窗口,窗口内的数据可以立即发送而无需等待确认,窗口外的数据需要等窗口滑动后发送。每当发送方收到一个 ACK,窗口就会向前滑动,允许发送新的数据。
超时重传
TCP 对于一个连接的往返时间(RTT)进行持续测量更新,新的值是前一个值和新的测量值的加权平均值,一般取前一个值的权重为 90%。
如果一个已经发送的报文段超过往返时间 RTT 后没有收到确认,则会重新传这个报文段。
拥塞控制
TCP 的拥塞控制称为 Tahoe,通过慢启动算法在早期快速提高传送速率,通过拥塞避免算法来动态调整阈值,以在后期平稳提高传送速率,同时能够感知网络拥塞和主动降低速率。通过在初期指数级增长和在网络拥塞时线性增长,保证了传输效率也能识别网络拥塞,在效率和稳定之间做了平衡。
慢启动算法通过一个拥塞窗口(cwnd,congestion window),来使发送方和另一端返回确认的速率相同。连接建立时拥塞窗口初始化为 1 个报文段,每收到一个 ACK 拥塞窗口就增加一个报文段,这将使窗口呈指数级增加。发送方取拥塞窗口和通知窗口的最小值作为发送上限,它们分别是发送方和接收方的流量控制。
拥塞避免算法则是防止拥塞窗口增长过快导致网络拥塞。首先会设置一个慢启动阈值 ssthresh,如 65535 字节。收到新的数据确认时,增加 cwnd,如果 cwnd 小于等于 ssthresh 则处于慢启动,cwnd 在每收到一个确认时加 1,呈指数级增长,否则处于拥塞避免,cwnd 在每收到一个确认时加 1/cwnd,呈线性增长。当发生超时或者重复确认时,将 cwnd 设置为 1 个报文段,重新开始慢启动,并且 sshthresh 会被被设置为之前窗口的一半。
状态变迁
TCP 有如下几种状态:
- CLOSED:没有活跃连接或挂起;
- LISTEN:服务器等待发送消息;
- SYN-RCVD:到达一个连接请求,等待 ACK;
- SYN-SENT:应用已经启动打开一个连接,等待 ACK;
- ESTABLISHED:连接已建立,正常数据传送状态;
- FIN-WAIT-1:应用没有数据要发送了,发起主动关闭等待 ACK;
- FIN-WAIT-2:另一端同意释放连接,等待另一端主动关闭;
- TIME-WAIT:主动关闭方等待所有数据包寿终正寝;
- CLOSING:两端同时主动关闭连接;
- CLOSE-WAIT:另一端已经发起关闭连接;
- LAST-ACK:被动关闭方等待所有数据包寿终正寝;
在 TCP 连接的建立、传送数据、终止中,发生的状态变迁如下:
MSL(Maximum Segment Lifetime,报文最大生存时间)是 TCP 定义的报文在网络的最大生存时间,现实中常用 30 秒、1 分钟、2 分钟。主动关闭方发回最后一个 ACK 后,处于 TIME_WAIT 状态,时间为 2MSL,在等待结束如果没有收到重复的 FIN,则视为连接关闭。等待期间,如果被动关闭一方没收到第四次报文段超时,则会重新发送 FIN 报文段,主动关闭方就可以重新发送一次报文,让被动关闭方可以收到确认后结束连接。另外 2MSL 也是为了让旧连接的数据报在网络中消逝,旧数据的序号不再属于新连接的序号窗口,相当于失效了,从而避免它们对新连接的干扰。
在高并发短连接的 TCP 服务器上,当服务器处理完请求后立刻主动关闭连接,此时会出现大量处于 TIME_WAIT 状态的连接,有可能会造成其他客户端无法建立连接,且连接建立和释放时间加上数据传输的时间远小于 TIME_WAIT 的等待时间。可以调整内核参数来允许新连接复用 TIME_WAIT 状态的连接和缩短等待时间,或者使用长连接来复用 TCP 连接,让客户端主动关闭连接,甚至使用连接池来处理数据传输。
5. 应用层
5.1 DNS域名系统
DNS 域名系统(Domain Name System)是一个应用于 TCP/IP 应用程序的分布式数据库,提供主机名字和 IP 地址之间的转换服务。
DNS 通常使用 UDP 端口 53 进行查询(速度快),使用 TCP 端口 53 进行区域传输(数据量大)。
DNS 服务器有这几个等级:
- 根域名服务器:全球共 13 组,存储顶级域地址,如 .com .net;
- 顶级域名服务器:管理特定顶级域下的二级域名;
- 权威域名服务器:存储具体域名的 IP 地址;
- 本地 DNS 服务器:通常由 ISP 提供,负责接收用户查询并缓存结果;
DNS 查询按照以下优先级查询对应的 IP:
- 浏览器查询本地缓存和 hosts 文件;
- 本地 DNS 服务器向根域名服务器发起请求;
- 根服务器返回顶级域(.com)地址,顶级域返回权威服务器地址;
- 权威服务器返回最终的 IP 地址;
应用程序需要访问一个域名时,首先调用解析器向 DNS 服务器发送请求,DNS 服务器查询名字后,返回包含该名字对应 IP 地址的响应报文,然后应用程序获取到 IP 地址,就可以通过 IP 地址发送数据包了。
5.2 HTTP超文本传输协议
HTTP 超文本传输协议(HyperText Transfer Protocol)应用于浏览器显示 Web 页面,是一个简单的基于文本的协议,客户端向服务器发送请求,服务器以页面内容作为响应。
HTTP 运行于 TCP 协议,使用端口 80,HTTPS 则使用端口 443。
每个页面被分配一个 URL(Uniform Resource Locator,统一资源定位符),以充当该页面在全球范围内的名字,URL 包含协议(scheme,方案)、DNS 名字、唯一指向特定页面的路径三部分,如 http://www.network.com/page/index.html。
当用户请求一个网络链接或点击一个网页链接,浏览器会执行一系列流程:
- 从 URL 解析出 DNS 名字;
- 请求 DNS 服务器查询 IP 地址;
- 与 IP 地址的 80 端口建立一个 TCP 连接;
- 发送 HTTP 报文请求路径指定的页面;
- 可能需要通过请求再获取页面关联的内嵌图片、视频、JS 脚本;
- 渲染和显示页面;
- 如果短期没有向同一个服务器发出其他请求,释放 TCP 连接;
5.3 SMTP简单邮件传输协议
SMTP 简单邮件传输协议(Simple Mail Transfer Protocol)用于将电子邮件从发送端移动到收件人。
IMAP 邮件访问协议(Internet Message Access Protocol)用于用户代理从服务器获取邮件,它是 POP3 邮局协议版本 3 的改进版本。
电子邮件系统包括两类子系统,分别是用户代理(user agent)和邮件传输代理,过程包括:
- 邮件提交:用户通过用户代理提交邮件到邮件服务器;
- 邮件传送:邮件服务器通过 SMTP 协议发送电子邮件到目标邮箱;
- 最后传递:IMAP 服务器监听 143 端口,用户代理运行 IMAP 客户端从服务器获取邮件;
5.4 Telnet远程登录协议
Telnet 远程登录协议(Telecommunication Network)是一种用于远程登录和管理网络设备的应用层协议,允许用户通过命令行在本地操作远程主机。
Telnet 基于 TCP 协议,默认端口 23。
Telnet 存在安全性缺陷,所有数据包括用户名和密码都在网络中明文传输,容易被窃听。现在 SSH 协议(Secure Shell)已成为标准替代方案,它能提供加密通道,防止数据泄露。
5.5 FTP文件传输协议
FTP 文件传输协议(File Transfer Protocol)是一种用于在网络上进行文件传输的应用层协议。
FTP 基于 TCP 协议,采用两个 TCP 连接来传输文件,控制连接用于传输命令和响应,使用 21 端口,数据连接用于传输文件内容,使用 20 端口。
FTP 使用明文传输,在需要安全传输的场景,通常使用 SFTP(SSH File Transfer Protocol)替代。