网络编程------IP地址,端口号,套接字,网络字节序

IP地址

        IP地址是IP协议中,用来标识网络中的唯一一台主机的地址。IP协议有两个版本IPv4,IPv6。在IPv4中,IP地址是一个4字节的32位的整数。在IPv6中,IP地址是一个16字节的128位的整数。

        我们通常所见到的IP地址如:192.168.3.195。是一用点分隔的字符串,每个数字用一个字节存储,范围是0~255,所以这种形式的IP地址也被称为“点分十进制”的字符串。

        两台主机通过网络来互相通信来发送数据时,就需要知道对方的IP地址,找到对方的主机,才能将数据发给它。所以在发送数据时,该数据包中还应包含两个IP地址,一个是目的IP,用于指明数据是发给谁的。一个是源IP,用于告诉对方该数据是哪台主机发送的,以便向其回发消息。

        当我们通过网络将数据发送给目的IP指定的主机时,目的主机要调用哪个进程对该数据进行处理,所以,此时还需要知道主机中处理数据的进程号。因此,需要引入端口号。

端口号

        端口号是传输层协议的内容。

        端口号是一个2字节16位的整数。用来标识一个主机中唯一的一个进程。当源主机通过网络将数据发送给目的主机后,调用该端口号指定的进程来对数据进行处理。

        一个端口号只能绑定一个进程。如果一个端口号绑定了多个进程,那多个进程都对同一数据进行处理,那要采取那个进程返回的结果呢。所以一个端口号只能绑定一个进程。

        一个进程可以绑定多个端口号。很多源主机可以通过不同的端口号来找到目的主机中的同一进程来处理不同的数据。

        IP地址+端口号就是用来标识网络中的某一台主机的某一个进程的。

        将IP地址+端口号称为套接字。

        注意:这里要区分进程的PID与端口号。进程的PID相当于一个人的身份证号,在任何地方都唯一标识某个人,而端口号相当于一个学号,它只在学校里来唯一标识一个学生。因此,PID无论在哪里都可以唯一标识一个进程,而端口号只在网络通信中来唯一标识一个进程。

网络字节序

        当我们将源主机中的数据发送给目的主机时,是如何发送的呢?

        根据冯诺依曼体系结构,我们知道源主机要通过内存将数据先发给源主机的外设(网卡),然后发送到网络中,目的主机将网络中的数据项接收到目的主机的网卡上,再传入到目的主机的内存中,然后通过CPU对数据进行处理。

        而数据在内存中的存储有大小端之分。如果在源主机的内存为小端,而目的主机以大端的形式来接受数据时,此时,就会导致数据错误。而不仅不同主机的大小端不同,在网络序列中也有大小端之分。这样一来,就更加混乱了。

        所以,TCP/IP协议规定,网络数据流均采用大端,即数据的高位存放在低地址处。

        如果源主机为小端则在发送数据时应先转为大端,如果是大端,则不用转化。然后将大端数据存放在发送缓冲区中,直接发送到网络中即可。

        当目的主机在接受消息时,先将网络中的大端数据存储到接受缓冲区中。如果目的主机是小端,则将大端数据转换为小端存储到内存中,如果目的主机是大端则不用转换直接存储到内存中。

        同时,规定:

发送主机将发送缓冲区的数据按低地址到高地址的顺序发出,即先将高位数据发送到网络中。

接收主机从网络中也是按低地址到高地址的顺序将数据接收到接受缓冲区中,即先接受网络中的高位数据。

因此,网络中的数据先从源主机收到的和先发送到目的主机的都是低地址高位的数据。

        关于网络字节序列与主机字节序列之间的大小端转换可以通过以下接口来实现:

#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);

        在上述的函数名中,h表示主机,n表示网络,l表示4字节32位的整数,s表示2字节16位的整数。如htol表示将主机的4字节序列转换为网络字节序列。

        为保证在大小端环境下都可以运行代码,所以在主机与网络之间传送数据时都应调用上述的接口来实现相应的转换。如果主机是大端则不用进行转换,如果是小端则先转换为大端。这样做,可以提高代码的可移植性。

        有关这些接口的使用,见

网络编程------UCP协议网络程序

网络编程------TCP协议网络程序





























猜你喜欢

转载自blog.csdn.net/sandmm112/article/details/80245032
今日推荐