文章目录
目录
前言
一、文件传输协议
这张图展示了 FTP(文件传输协议)通信过程中各层协议的交互逻辑,涉及应用层、传输层、网络层和数据链路层,以下是详细通信逻辑和过程:
应用层
- FTP 客户发起请求:FTP 客户有文件传输需求,依据 FTP 协议向 FTP 服务器发送请求,比如请求下载或上传文件。此时,FTP 客户生成 FTP 协议数据单元(PDU),包含具体的操作指令(如读取文件列表、下载文件等)。
传输层
- TCP 封装:FTP 客户的请求数据到达传输层后,TCP 协议对其进行封装。TCP 为 FTP 提供可靠的传输服务,会给数据添加 TCP 首部,其中包含源端口号、目的端口号、序号、确认号等信息,用于建立连接、确保数据按序到达和流量控制等。封装后的 TCP 数据段会传递给网络层。
网络层
- IP 寻址与封装:网络层的 IP 协议接收 TCP 数据段后,添加 IP 首部,形成 IP 数据报。IP 首部包含源 IP 地址(srcip)和目的 IP 地址(dstip),这些地址用于在不同网络间进行路由寻址。
- 路由器转发:IP 数据报被发送到路由器。路由器查看目的 IP 地址,依据路由表决定转发路径。在这个过程中,路由器工作在 IP 层,它屏蔽了底层网络(如以太网和令牌环网)的差异,实现不同网络间的互联。
数据链路层
- 以太网环境:在以太网一侧,IP 数据报到达以太网驱动程序后,以太网协议会给其添加以太网首部,包含源 MAC 地址(mac C ,假设为客户端 MAC 地址)和目的 MAC 地址(mac R ,假设为路由器 MAC 地址),形成以太网帧,然后在以太网中传输。
- 令牌环网环境:若数据要传输到令牌环网,在路由器处,数据会从以太网协议转换为令牌环协议。令牌环驱动程序会添加令牌环首部,包含相应的源和目的 MAC 地址等信息,封装成令牌环帧在令牌环网中传输。
数据接收与解封装
- 服务器端数据链路层:在 FTP 服务器端,数据链路层先接收以太网帧或令牌环帧,去除相应的数据链路层首部,将数据交给网络层。
- 服务器端网络层:网络层去除 IP 首部,将数据交给传输层。
- 服务器端传输层:传输层去除 TCP 首部,将原始的 FTP 请求数据交给应用层的 FTP 服务器。FTP 服务器处理请求,然后按照上述相反的过程,将响应数据依次经过各层协议的封装,再传输回 FTP 客户,完成整个通信过程。
这是一张网络通信基本脉络示意图,展示了网络通信中数据在不同层次的传输过程,以及主机、网卡等设备在其中的作用。以下是详细介绍:
主机与网卡
图中有两台主机(标注为 A 和 B),每台主机都具备上述四层网络结构。主机通过网卡(网络接口卡)与网络连接,网卡是主机与网络进行数据交互的硬件设备,在数据链路层工作,负责将主机的数据转换为适合网络传输的格式,并进行数据的发送和接收。
数据传输过程示意
图中通过线条连接各层和网卡,示意了数据在网络通信中的传输过程:
- 发送端:数据从主机 A 的应用层产生,依次经过传输层、网络层、数据链路层的封装处理,最后通过网卡发送到网络中。
- 传输途中:数据在网络中传输,可能会经过多个中间设备(图中未详细展示,但一般包括路由器等),这些设备在网络层对数据进行转发等处理。
- 接收端:数据到达主机 B 的网卡后,再依次经过数据链路层、网络层、传输层的解封装处理,最终传递到应用层,被用户接收和使用。
整体来看,这张图以简洁的方式展示了网络通信的基本架构和数据传输流程,有助于理解网络中各层次和设备的协同工作机制。
二、IP和MAC地址
IP(Internet Protocol)地址和 MAC(Media Access Control)地址是计算机网络中用于标识设备的两种重要地址,它们在定义、位置、分配方式、作用等方面存在诸多区别,以下是具体介绍:
定义与性质
- IP 地址:是一种逻辑地址,用于在网络层标识设备在网络中的位置,基于 TCP/IP 协议族,主要用于在不同网络之间进行数据路由和通信。它类似于现实生活中的街道地址,用于在互联网这个庞大的 "数字城市" 中定位和区分不同的设备,使数据能够准确地从源设备传输到目标设备。
- MAC 地址:是一种物理地址,也称为硬件地址,它是固化在网络设备(如网卡)中的唯一标识符,用于在数据链路层标识设备。可以将其类比为设备的 "身份证号码",具有全球唯一性,无论设备连接到哪个网络,其 MAC 地址通常是不变的。
地址格式
- IP 地址:目前常用的 IP 地址有 IPv4 和 IPv6 两种版本。IPv4 地址是由 32 位二进制数组成,通常以点分十进制的形式表示,如 192.168.1.1。IPv6 地址则是 128 位二进制数,采用冒号十六进制表示法,例如 2001:0db8:85a3:0000:0000:8a2e:0370:7334。
- MAC 地址:MAC 地址通常由 6 个字节(48 位)的十六进制数表示,如 00-16-3e-00-01-02。前 3 个字节代表厂商代码,后 3 个字节是设备的序列号,这种结构确保了全球范围内 MAC 地址的唯一性。
分配方式
- IP 地址:IP 地址可以分为静态 IP 地址和动态 IP 地址。静态 IP 地址是由网络管理员手动配置给设备的,通常用于需要固定 IP 的服务器等设备;动态 IP 地址则是通过动态主机配置协议(DHCP)由服务器自动分配给设备的,一般家庭用户和移动设备多使用动态 IP 地址,这样可以更有效地利用有限的 IP 地址资源。
- MAC 地址:MAC 地址一般是在设备生产过程中由厂商固化在网卡等网络设备中的,具有唯一性和不可更改性。不过,在某些特殊情况下,用户也可以通过软件工具对 MAC 地址进行修改,这被称为 MAC 地址克隆或 MAC 地址欺骗。
作用范围
- IP 地址:主要用于广域网(WAN)和互联网环境,用于在不同网段、不同地区甚至全球范围内实现设备之间的通信和数据传输。它能够跨越多个网络节点和路由器,根据网络拓扑结构和路由协议,将数据准确地从源设备发送到目标设备所在的网络。
- MAC 地址:主要作用于局域网(LAN)环境,在同一网段内的设备之间进行通信时,用于标识源设备和目标设备。当数据链路层需要将数据帧从一个设备发送到另一个设备时,它会根据目标设备的 MAC 地址进行数据帧的封装和传输,确保数据在本地网络中准确传输。
可见性与可获取性
-
IP 地址:在网络通信中,IP 地址是较为容易被获取和查看的。例如,通过网络命令(如 ping、traceroute 等)或者在网络配置信息中,都可以很方便地获取到设备的 IP 地址。而且,在互联网应用中,服务器通常可以获取到客户端设备的 IP 地址,用于记录访问信息、进行流量控制等。
-
MAC 地址:相对来说,MAC 地址的获取没有 IP 地址那么直接。在局域网中,可以通过一些网络管理工具或者特定的命令(如在 Windows 系统中使用 arp -a 命令)来查看本地网络中设备的 MAC 地址。但在跨网络的情况下,由于 MAC 地址主要在数据链路层起作用,通常不会像 IP 地址那样在网络传输过程中被广泛暴露和获取。
-
假设你在家中使用手机连接无线路由器上网,想要访问百度网站。
生活例子
-
把整个互联网想象成一个巨大的城市,每一个网络设备就像这个城市中的一栋房子或一个单位。
-
IP 地址:相当于城市中的街道地址和门牌号,用于在整个城市范围内定位和区分不同的房子或单位。比如,你在网上购买了一件商品,商家的服务器要把商品信息和订单数据发送给你家附近的快递站点,这个过程中就需要用到你的 IP 地址来确定大致的位置范围。数据在互联网的 "街道" 上传输,经过多个路由器 "交通指挥员" 的指引,根据 IP 地址找到你所在的网络区域,就像快递员根据街道地址找到你所在的小区。
-
MAC 地址:类似于房子或单位内的具体房间号,用于在一个特定的区域或网络内部精确地找到目标设备。当快递员到达你所在的小区后,需要根据具体的房间号把快递送到你家。在网络中也是如此,当数据到达你家所在的局域网(比如家庭网络或公司网络)后,就需要通过 MAC 地址来找到具体的设备,比如你的手机、电脑等。路由器就像小区的物业管理员,它会根据 MAC 地址将数据准确地发送到对应的设备上。
-
三、端口号和PID
端口号(Port Number)和 PID(Process ID,进程标识符)是计算机领域中两个不同但又相关的概念,以下从定义、用途、特点等方面阐述它们的区别和联系:
定义
- 端口号:是传输层协议(如 TCP 和 UDP)的一个概念,用于标识同一台主机上的不同应用程序或服务。它是一个 16 位的无符号整数,取值范围是 0 - 65535 ,可看作是应用程序或服务在网络通信中的 "门牌号"。
- PID:是操作系统为正在运行的进程分配的唯一标识符。在操作系统中,每一个正在运行的程序实例都对应一个进程,系统通过 PID 来识别、管理和控制这些进程,就像每个人有独一无二的身份证号一样。
用途
- 端口号:在网络通信里,当一台主机向另一台主机发送数据时,不仅要知道目标主机的 IP 地址,还得明确数据要交给目标主机上的哪个应用程序。端口号就是用于在接收方主机上区分不同应用程序或服务的。比如,HTTP 服务默认使用 80 端口,当我们在浏览器中访问网页时,浏览器发送的请求就会发往服务器的 80 端口,让服务器知道是 HTTP 请求。
- PID:主要用于操作系统内部的进程管理。操作系统依靠 PID 来执行诸如进程调度、资源分配(如 CPU 时间、内存等)、进程间通信、结束进程等操作。比如,当我们在任务管理器中想要结束某个程序进程时,系统就是根据 PID 来定位并终止对应的进程。
特点
- 端口号:一些端口号被标准化,作为特定服务的默认端口,这就是众所周知的 "知名端口"(0 - 1023),比如 21 端口用于 FTP 服务、22 端口用于 SSH 服务等;1024 - 49151 是注册端口,分配给用户进程或应用程序;49152 - 65535 是动态 / 私有端口,一般由操作系统在需要时随机分配给应用程序。
- PID:在进程的生命周期内是唯一的,但进程结束后,其 PID 可能会被操作系统回收并重新分配给新的进程。而且不同的操作系统对 PID 的取值范围和管理方式可能有所不同。
联系
在网络编程和多进程应用中,端口号和 PID 存在一定关联。当一个应用程序开启一个网络服务并绑定到某个端口号时,操作系统会为这个运行的应用程序进程分配一个 PID。通过 PID 可以找到对应的进程,进而对绑定特定端口号的服务进行管理。例如,当我们要停止一个占用特定端口的网络服务时,可以先通过端口号找到对应的进程 PID,然后使用操作系统命令根据 PID 来终止该进程。
四、TCP和UDP协议
- 端口号:在网络通信里,当一台主机向另一台主机发送数据时,不仅要知道目标主机的 IP 地址,还得明确数据要交给目标主机上的哪个应用程序。端口号就是用于在接收方主机上区分不同应用程序或服务的。比如,HTTP 服务默认使用 80 端口,当我们在浏览器中访问网页时,浏览器发送的请求就会发往服务器的 80 端口,让服务器知道是 HTTP 请求。
- PID:主要用于操作系统内部的进程管理。操作系统依靠 PID 来执行诸如进程调度、资源分配(如 CPU 时间、内存等)、进程间通信、结束进程等操作。比如,当我们在任务管理器中想要结束某个程序进程时,系统就是根据 PID 来定位并终止对应的进程。
- 端口号:一些端口号被标准化,作为特定服务的默认端口,这就是众所周知的 "知名端口"(0 - 1023),比如 21 端口用于 FTP 服务、22 端口用于 SSH 服务等;1024 - 49151 是注册端口,分配给用户进程或应用程序;49152 - 65535 是动态 / 私有端口,一般由操作系统在需要时随机分配给应用程序。
- PID:在进程的生命周期内是唯一的,但进程结束后,其 PID 可能会被操作系统回收并重新分配给新的进程。而且不同的操作系统对 PID 的取值范围和管理方式可能有所不同。
TCP(传输控制协议,Transmission Control Protocol )协议,以下介绍 TCP 协议和 UDP(用户数据报协议,User Datagram Protocol )协议:
连接特性
TCP 协议:是面向连接的协议。就像打电话,在数据传输前,发送方和接收方需要通过 "三次握手" 建立连接,确定双方准备好传输数据,传输结束后还需 "四次挥手" 断开连接。这种连接机制确保了数据传输的有序性和可靠性。
UDP 协议:是无连接的协议。类似于邮寄信件,发送方无需事先与接收方沟通确认,直接将数据报发送出去,不用建立和维护连接,所以传输速度相对较快。
数据可靠性
- TCP 协议:提供可靠的数据传输服务。它会对发送的数据进行编号和确认,接收方收到数据后会向发送方发送确认信息。如果发送方在规定时间内未收到确认,就会重发数据;同时,TCP 还具备流量控制和拥塞控制功能,能根据网络状况调整数据发送速率,避免网络拥塞,保证数据无差错、不丢失、不重复且按序到达。
- UDP 协议:不保证数据传输的可靠性。发送方将数据报发出后,不关心数据是否能正确、完整地到达接收方,也没有重传机制、流量控制和拥塞控制等,可能会出现数据丢失、重复或乱序的情况。
传输效率与应用场景
- TCP 协议:由于要建立连接、进行确认、重传等操作,会有一定的额外开销,传输效率相对较低。适用于对数据准确性要求极高的场景,比如文件传输(FTP)、网页浏览(HTTP)、电子邮件(SMTP、POP3 等),这些场景不允许数据出现错误。
- UDP 协议:没有连接建立和复杂控制机制,传输效率高、延迟低。常用于对实时性要求高、能容忍一定数据丢失的场景,例如视频直播、在线游戏、语音通话等,这些场景更注重数据的及时传输,少量数据丢失对整体体验影响较小。
数据格式
- TCP 协议:首部较长,通常为 20 字节(不包含选项字段),包含源端口号、目的端口号、序号、确认号、控制位等众多字段,用于实现连接管理、可靠性传输等功能。
- UDP 协议:首部简单,仅 8 字节,包含源端口号、目的端口号、长度、校验和,数据传输相对简单直接。
五、网络字节序
- TCP 协议:提供可靠的数据传输服务。它会对发送的数据进行编号和确认,接收方收到数据后会向发送方发送确认信息。如果发送方在规定时间内未收到确认,就会重发数据;同时,TCP 还具备流量控制和拥塞控制功能,能根据网络状况调整数据发送速率,避免网络拥塞,保证数据无差错、不丢失、不重复且按序到达。
- UDP 协议:不保证数据传输的可靠性。发送方将数据报发出后,不关心数据是否能正确、完整地到达接收方,也没有重传机制、流量控制和拥塞控制等,可能会出现数据丢失、重复或乱序的情况。
- TCP 协议:由于要建立连接、进行确认、重传等操作,会有一定的额外开销,传输效率相对较低。适用于对数据准确性要求极高的场景,比如文件传输(FTP)、网页浏览(HTTP)、电子邮件(SMTP、POP3 等),这些场景不允许数据出现错误。
- UDP 协议:没有连接建立和复杂控制机制,传输效率高、延迟低。常用于对实时性要求高、能容忍一定数据丢失的场景,例如视频直播、在线游戏、语音通话等,这些场景更注重数据的及时传输,少量数据丢失对整体体验影响较小。
- TCP 协议:首部较长,通常为 20 字节(不包含选项字段),包含源端口号、目的端口号、序号、确认号、控制位等众多字段,用于实现连接管理、可靠性传输等功能。
- UDP 协议:首部简单,仅 8 字节,包含源端口号、目的端口号、长度、校验和,数据传输相对简单直接。
- TCP 协议:由于要建立连接、进行确认、重传等操作,会有一定的额外开销,传输效率相对较低。适用于对数据准确性要求极高的场景,比如文件传输(FTP)、网页浏览(HTTP)、电子邮件(SMTP、POP3 等),这些场景不允许数据出现错误。
- UDP 协议:没有连接建立和复杂控制机制,传输效率高、延迟低。常用于对实时性要求高、能容忍一定数据丢失的场景,例如视频直播、在线游戏、语音通话等,这些场景更注重数据的及时传输,少量数据丢失对整体体验影响较小。
- TCP 协议:首部较长,通常为 20 字节(不包含选项字段),包含源端口号、目的端口号、序号、确认号、控制位等众多字段,用于实现连接管理、可靠性传输等功能。
- UDP 协议:首部简单,仅 8 字节,包含源端口号、目的端口号、长度、校验和,数据传输相对简单直接。
定义
网络字节序采用大端字节序(Big - Endian),即把数据的高位字节存放在低地址位,低位字节存放在高地址位。比如对于一个 16 位整数 0x1234,在网络字节序下,其在内存中的存储顺序是先存 0x12(高位字节),再存 0x34(低位字节) 。
与主机字节序对比
主机字节序指的是计算机内部存储数据的字节顺序,不同的计算机架构可能采用不同的主机字节序,主要有大端字节序和小端字节序(Little - Endian,低位字节存放在低地址位,高位字节存放在高地址位)。例如,x86 架构的计算机通常采用小端字节序。当在网络中进行数据传输时,由于不同主机的字节序可能不同,就需要统一的字节序标准,这便是网络字节序存在的意义。
作用
网络字节序的作用是确保不同主机之间在网络通信时数据能够被正确解析。发送方在发送数据前,需要将主机字节序的数据转换为网络字节序;接收方在收到数据后,要把网络字节序的数据转换为主机字节序,这样才能保证数据在不同主机间的准确传输和理解。例如,在 TCP/IP 协议栈中,所有在网络上传输的多字节数据(如 IP 地址、端口号等)都需要按照网络字节序进行组织和传输。
应用场景
在网络编程中,如使用 Socket 进行编程时,涉及到多字节数据的传输都要遵循网络字节序。比如在设置 Socket 地址结构中的端口号和 IP 地址等字段时,需要调用相应的函数(如 htons、htonl 等)将主机字节序转换为网络字节序(h 表示主机字节序,n 表示网络字节序,s 表示 short,l 表示 long );在接收数据时,也要使用 ntohs、ntohl 等函数将网络字节序转换为主机字节序。
六、socket编程接口
基本概念
Socket(套接字)可看作是网络通信的端点,就像电话系统中的电话接口,通过它不同的程序能在网络中发送和接收数据。它既可以用于同一台计算机上不同进程间的通信(如 UNIX 域套接字),也能用于不同计算机之间的网络通信(如基于 TCP/IP 协议的套接字) 。
常用函数
- socket():用于创建一个套接字描述符,确定套接字的类型(如流式套接字 SOCK_STREAM,基于 TCP 协议,提供可靠的面向连接的通信;数据报套接字 SOCK_DGRAM,基于 UDP 协议,提供无连接的通信 )、协议族(如 AF_INET 表示 IPv4 协议族)等。示例代码:
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
- ,若成功则返回一个非负整数的套接字描述符,失败返回 - 1。
- bind():将套接字与特定的地址和端口绑定。在服务器端,通常需要绑定一个众所周知的端口,以便客户端能够连接到它。对于 IPv4 地址,需要构建一个 struct sockaddr_in 结构体来指定地址和端口信息。示例代码:
cpp
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8888);
server_addr.sin_addr.s_addr = INADDR_ANY;
bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
- listen():仅用于服务器端,使套接字进入监听状态,准备接受客户端的连接请求。第二个参数指定了等待连接的最大队列长度。示例:
listen(sockfd, 5);
。- accept():服务器端使用该函数接受客户端的连接请求。当有客户端连接时,它会返回一个新的套接字描述符,用于与该客户端进行通信,而原来的套接字仍继续监听其他连接请求。示例:
int client_sockfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_addr_len);
,- 其中 client_addr 用于存储客户端地址信息。
- connect():客户端使用此函数发起与服务器的连接。参数与 bind 类似,用于指定要连接的服务器地址和端口。示例:
connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
。- send()/recv():用于在已经建立连接的套接字上发送和接收数据。send 用于发送数据,recv 用于接收数据。示例:
send(sockfd, buffer, strlen(buffer), 0);
,recv(sockfd, buffer, sizeof(buffer), 0);
。- close():用于关闭套接字,释放相关资源。示例:
close(sockfd);
。
应用场景
- 客户端 - 服务器模型:是最常见的应用场景。服务器通过上述函数绑定端口并监听,等待客户端连接;客户端则使用 connect 连接到服务器,双方建立连接后,通过 send 和 recv 进行数据交互,如 Web 服务器与浏览器之间的通信、文件服务器与客户端的文件传输等。
- 分布式系统:在分布式系统中,不同节点之间通过 Socket 编程接口进行通信和数据交换,实现分布式计算、数据共享等功能。
- 实时通信:如在线游戏、视频会议等应用,通过 Socket 编程接口实现实时的数据传输,虽然可能会结合 UDP 协议以满足低延迟要求,但也会使用一些机制来提高数据可靠性。
总结
- 文件传输与网络架构:FTP 通信依应用层、传输层、网络层和数据链路层交互,经封装、转发、解封装完成。网络通信中主机靠网卡经各层实现数据传输,各层与设备协同保障通信。
- 网络标识:IP 地址是网络层逻辑地址,分 IPv4 和 IPv6,有静态与动态分配方式,用于广域网通信;MAC 地址是数据链路层物理地址,固化于设备,全球唯一,用于局域网通信。
- 进程与服务标识:端口号是传输层概念,标识主机应用程序或服务,有知名、注册、动态端口之分;PID 是操作系统为进程分配的唯一标识符,用于进程管理,二者在网络编程中有联系。
- 传输协议:TCP 面向连接,可靠,有额外开销,适用于对准确性要求高场景;UDP 无连接,不可靠,效率高、延迟低,适用于实时性要求高场景。
- 字节序:网络字节序采用大端字节序,与主机字节序可能不同,在网络通信中用于保障数据解析准确,网络编程需按其组织和转换多字节数据。
- socket 编程:Socket 是网络通信端点,其编程接口有创建、绑定、监听、连接、收发、关闭等函数,广泛应用于客户端 - 服务器模型、分布式系统和实时通信等场景。
