⭐小白苦学IT的博客主页
⭐初学者必看:Linux操作系统入门
⭐代码仓库:Linux代码仓库
❤关注我一起讨论和学习Linux系统
本节重点
认识IP地址, 端口号, 网络字节序等网络编程中的基本概念;
1.前言
网络编程,作为现代信息社会中的一项核心技术,不仅支撑着互联网应用的蓬勃发展,更深刻地影响着我们的日常生活与工作方式。在探索网络编程的奥秘时,我们会发现一些基础而重要的概念,如IP地址、端口号和网络字节序,它们如同构建网络世界的基石,支撑起整个网络通信的大厦。
IP地址,作为网络世界中每个设备的唯一标识,为信息的准确传递提供了基础。端口号,则进一步细化了通信的目标,确保数据能够到达正确的应用程序。而网络字节序,则是网络通信中数据格式化的关键,它确保了不同系统间能够正确地解析和传递数据。
在这篇博客中,我们将深入解析这些网络编程中的核心概念,探讨它们的原理、作用以及在实际应用中的重要意义。通过理解这些基础概念,我们不仅能够更好地掌握网络编程的技术,更能为构建高效、稳定的网络系统提供坚实的理论支撑。
2.理解源IP地址和目的IP地址
在IP数据包头部中, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址.
源IP地址,顾名思义,就是数据包的起始地址,它告诉网络中的路由器这个数据包是从哪个设备发出的。这就像唐僧系统取经的故事中,唐僧和他的徒弟们从大唐(源地址)出发去西天取经。在这个比喻中,大唐就可以看作是源IP地址,代表了旅程的起点。
目的IP地址则是数据包的目标地址,它告诉网络中的路由器这个数据包应该送到哪个设备。在唐僧西天取经故事中,西天(灵山)就是他们的目的地,代表了他们想要达到的目标。因此,灵山在这个比喻中就对应着目的IP地址。
在网络通信中,路由器就像故事中的指路者,它们根据数据包中的源IP地址和目的IP地址,决定数据包应该经过哪条路径,最终到达正确的目的地。就像唐僧他们一路上需要经过多个国家和城市,最终才能到达西天一样,数据包在网络中也需要经过多个路由器和交换机,才能从源IP地址到达目的IP地址。
思考: 我们光有IP地址就可以完成通信了嘛? 想象一下发qq消息的例子, 有了IP地址能够把消息发送到对方的机器上,但是还需要有一个其他的标识来区分出, 这个数据要给哪个程序进行解析.
3.认识端口号
端口号(port)是传输层协议的内容.
- 端口号是一个2字节16位的整数;
- 端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理;
- IP地址 + 端口号能够标识网络上的某一台主机的某一个进程;
- 一个端口号只能被一个进程占用.
用一个故事理解端口号:
想象一下,10086是中国移动的客服电话,它就像一个网络中的服务端口,等待着客户的来电。这个电话号码(10086)就类似于一个端口号,它在中国移动的网络服务中起到了标识和定位的作用。
在中国移动的网络中,可能有许多不同的服务,比如话费查询、套餐变更、故障报修等。这些服务都需要一个特定的“通道”或“接口”来接收和处理来自客户的请求。端口号就像是这样的一个“通道”或“接口”,它确保客户的请求能够准确地被发送到相应的服务部门。
当客户拨打10086时,电话网络会根据这个电话号码(端口号)将客户的请求路由到中国移动的客服中心。在客服中心,可能有多个接线员(或者说,多个处理请求的线程或进程)负责处理不同的服务请求。但是,由于客户的电话是通过10086这个端口号接入的,客服中心就能够知道这个请求是来自于拨打10086的客户,从而将其分配到相应的服务部门进行处理。
同样的,如果中国移动还提供了其他的客服电话,比如10085用于推销新业务,10088用于VIP客户服务等,那么这些电话号码就对应着不同的端口号。每个端口号都负责接收和处理特定类型的请求,确保了服务的准确性和高效性。
理解 "端口号" 和 "进程ID"
我们之前在学习系统编程的时候, 学习了 pid 表示唯一一个进程; 此处我们的端口号也是唯一表示一个进程. 那么这两者之间是怎样的关系?
在系统编程和网络编程中,PID(进程标识符)和端口号都扮演着标识特定实体的角色,但它们标识的对象和用途有所不同。
PID是操作系统用来唯一标识每个正在运行的进程的数字。操作系统会为每个新启动的进程分配一个唯一的PID,用于内部管理和控制,如启动、停止、暂停、恢复和终止进程等操作。PID保证了在操作系统层面,每个进程都可以被准确地识别和操作。
端口号则主要用于网络通信,用于标识运行在同一台计算机上的不同应用程序或服务。每个网络服务或应用程序都可以绑定到一个或多个特定的端口号上,这样网络数据包就能够根据目标端口号被正确地路由到对应的应用程序。端口号确保了在网络层面,数据能够准确地传输到目标应用程序。
简而言之,PID是操作系统内部用来唯一标识和管理进程的,而端口号则是在网络通信中用来标识和区分不同应用程序或服务的。一个进程可以有一个或多个与之关联的端口号(如果该进程涉及网络通信),但PID和端口号并不是一一对应的关系。一个进程可以有PID但没有绑定任何端口(如果它不涉及网络通信),而一个端口号则可以对应多个进程(例如,多个进程可以监听同一个端口,但通常这需要特殊的配置和处理)。
因此,PID和端口号虽然都是用来唯一标识某种实体,但它们标识的对象和使用的上下文是不同的。PID是操作系统层面的进程标识,而端口号是网络通信层面的应用程序或服务标识。
理解源端口号和目的端口号
传输层协议(TCP和UDP)的数据段中有两个端口号, 分别叫做源端口号和目的端口号. 就是在描述 "数据是谁发的, 要发给谁";
想象一下,送快递就像网络中的数据传输,而源端口号和目的端口号就像是快递单上的发货地址和收货地址。
首先,我们来看源端口号。假设你是一家网店,当你需要给顾客发货时,你会将商品打包好,并填写快递单。在这个快递单上,发货地址就是你的店铺地址,对应到网络通信中,这个发货地址就相当于是源端口号。源端口号标识了数据是从哪个应用程序或服务发出的,它告诉网络:“这些数据是从我这里发出去的,请把它们送到正确的目的地。”
接下来,我们看目的端口号。在快递的例子中,你填写快递单时还需要写上顾客的收货地址。这个收货地址就是快递的目的地,对应到网络通信中,就是目的端口号。目的端口号标识了数据应该被发送到哪个应用程序或服务,它告诉网络:“这些数据是送给那个特定的接收者的,请确保它们能够准确地送达。”
在送快递的过程中,快递公司会根据快递单上的发货地址和收货地址来安排快递的路线和投递。同样地,在网络通信中,路由器和交换机等网络设备会根据数据包中的源端口号和目的端口号来确定数据的传输路径,确保数据能够准确地从发送方到达接收方。
总结来说,源端口号就像快递单上的发货地址,标识了数据的发送源;而目的端口号就像收货地址,标识了数据的接收目标。通过这两个端口号,网络通信能够像送快递一样,将数据准确地发送到目标应用程序或服务。
4.认识TCP协议
此处我们先对TCP(Transmission Control Protocol 传输控制协议)有一个直观的认识;
- 传输层协议
- 有连接
- 可靠传输
- 面向字节流
TCP协议(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。它的主要作用是在网络应用中建立可靠的数据传输通道,确保数据按照发送的顺序到达接收端,并进行流量控制以防止发送速度过快导致接收端无法处理。
TCP协议之所以被广泛使用,主要是因为其能保证数据的可靠传输。在传输数据时,TCP协议会对数据进行分片、编号、校验等处理,同时还会进行数据的确认和重传等操作,确保数据的完整性和顺序性。此外,TCP协议还能通过窗口机制控制发送端的发送速度,实现流量控制,防止网络拥塞。
理解TCP协议,首先要了解其工作原理。TCP协议的工作过程主要包括建立连接、数据传输和可靠传输三个步骤。在建立连接时,通信双方会进行三次握手,确认连接的建立。然后,在数据传输阶段,发送方会将数据划分成小块(称为报文段),并添加头部和校验等信息,通过TCP协议发送给接收方。接收方收到报文段后,会进行校验并重新组装成完整的数据流。最后,TCP协议通过各种机制保证数据的可靠传输,如使用序列号对报文段进行标记,确保接收方按正确顺序重组数据;在发现报文段丢失或未收到确认时,会重新发送报文段。
TCP协议的应用场景非常广泛,包括Web浏览、电子邮件、文件传输、远程登录以及即时通讯等。在这些应用中,TCP协议都发挥着确保数据可靠传输的重要作用。
总的来说,TCP协议是一种高效且可靠的传输层协议,它通过一系列复杂的机制保证了数据的完整性、顺序性和流量控制,为各种网络应用提供了稳定的数据传输服务。
后面我们再详细讨论TCP的一些细节问题.
5.认识UDP协议
UDP(User Datagram Protocol)协议是一种无连接的传输层协议,它基于IP协议,为应用程序提供了一种简单的、不可靠的数据传输方式。UDP协议的主要特点如下:
- 无连接性:UDP在发送数据之前不需要建立连接,发送方可以直接将数据报发送给接收方,无需进行握手和协商,从而减少了开销和发送数据之前的时延。
- 不可靠性:UDP不保证数据包的可靠性、顺序性和完整性。它采用尽力交付的方式,即发送方只负责尽力将数据传输给接收方,而不保证接收方是否正确接收。这种特性使得UDP在传输过程中的开销较小,传输更加高效。
- 面向报文:UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界,并在添加首部后直接向下交付IP层。
- 无拥塞控制:UDP没有拥塞控制机制,网络出现的拥塞不会使源主机的发送速率降低。这对于某些实时应用(如在线游戏、实时音视频传输等)非常重要,因为它们需要高传输效率,尽管可能会牺牲一些数据的可靠性。
- 支持多种交互通信:UDP支持一对一、一对多、多对一和多对多的交互通信模式。
- 首部开销小:UDP的首部只有8个字节,比TCP的20个字节的首部要短,进一步降低了传输开销。
基于以上特点,UDP协议在多个领域有广泛的应用,包括但不限于实时流媒体传输(如在线游戏、视频会议和直播等)、DNS域名解析查询、SNMP网络设备管理和监控等。在这些应用中,UDP协议能够高效地处理大量的小数据包,满足实时性和高效率的要求。
此处我们也是对UDP(User Datagram Protocol 用户数据报协议)有一个直观的认识; 后面再详细讨论.
6.网络字节序
我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之分. 那么如何定义网络数据流的地址呢?
- 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出;
- 接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存;
- 因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址.
- TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节.
- 不管这台主机是大端机还是小端机, 都会按照这个TCP/IP规定的网络字节序来发送/接收数据;
- 如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送即可;
为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。
- 这些函数名很好记,h表示host,n表示network,l表示32位长整数,s表示16位短整数。
- 例如htonl表示将32位的长整数从主机字节序转换为网络字节序,例如将IP地址转换后准备发送。
- 如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回 ;
- 如果主机是大端字节序,这些 函数不做转换,将参数原封不动地返回。
网络字节序是什么?
网络字节序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,这样可以确保数据在不同主机之间传输时能够被正确解释。这种格式采用的是big-endian(大端)排序方式,也就是高位在前,低位在后。
为什么要有网络字节序?
至于网络字节序的由来,我们可以从一个有趣的故事说起。这个词“endian”其实出自于《格列佛游记》。书中描述的小人国的内战竟然源于一个看似微不足道的问题:吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开。这个问题竟然导致了六次叛乱,其中一个皇帝因此丧命,另一个则丢掉了王位。虽然这只是一个虚构的故事,但它生动地展示了“顺序”的重要性。
在计算机网络中,这种“顺序”问题同样存在。由于不同的主处理器和操作系统对大于一个字节的变量在内存中的存放顺序可能会有所不同,这就产生了字节序的问题。而为了保证数据的正确传输和解释,网络字节序作为一种统一的规定就显得尤为重要。它确保了在不同的主机和系统之间,数据的传输和解析都能够准确无误。
所以,网络字节序的存在,就像是计算机网络世界中的一个“和平条约”,它使得不同主机和系统能够和谐共处,共同维护着网络数据的正确性和完整性。
7.总结
IP地址是互联网协议地址,用于在网络中唯一标识不同的主机或设备。它是网络通信的基础,使得数据能够准确地发送到目标设备。IP地址分为IPv4和IPv6两个版本,分别具有不同的位数和表示方式。IPv4地址是一个4字节、32位的整数,通常用点分十进制的方式表示;而IPv6地址则是一个16字节、128位的整数,提供了更大的地址空间。
其次,端口号用于在一台主机上唯一标识一个网络通信进程。虽然IP地址可以指定网络传输的目标设备,但同一台设备上可能运行着多个应用程序,因此需要端口号来区分不同的通信进程。端口号是一个2字节、16位的整数,其范围通常为1到65535。通过指定源端口和目的端口,可以确保数据被正确地发送到目标主机上的对应进程。
最后,网络字节序是TCP/IP协议中规定的一种数据表示格式,用于确保数据在不同主机之间传输时能够被正确解释。由于不同的主机可能有不同的字节序(大端或小端),因此需要将数据转换为统一的网络字节序(大端序)进行传输。这样,接收方在收到数据后,可以按照相同的格式进行解析,从而避免数据解析错误。
综上所述,IP地址、端口号和网络字节序是网络编程中的基本概念,它们共同构成了网络通信的基础。IP地址负责标识网络中的设备,端口号用于区分同一设备上的不同通信进程,而网络字节序则确保了数据的正确传输和解析。