关于网络编程套接字的基础知识

为了方便后边更好地理解网络套接字编程,先介绍一些重要的概念。

IP地址

IP地址是在IP协议中用来标识网络中不同主机的地址。它有两个版本:IPv4 和 IPv6

IPv4:IP地址由4个字节(0~255)构成,共32位。

IPv6:IP地址由16个字节(0~255)构成,共128位。

接下来主要学习IP地址为IPv4,在机器内部存的是一个4个字节,16位的数据,对于我们来说,是不好记忆的。就想我们在寄一个人的电话号码的时候会把它分为类似于前三位,中间四位和后边四位这样的方式来记忆。同样的为了方便我们对IP地址的记忆,通常使用“点分十进制”的字符串来表示IP地址,例如192.168.3.128;用点来分割的每一个数字表示一个字节,数字的范围是0~255。这样相对来说就有好记很多。

源IP地址和目的IP地址和MAC地址。

我们可以将从一个主机向另一个主机发送一段数据的过程比作是在网上购物的过程,那么卖家给我们发货的地址就叫做源IP地址,而我们填的收获地址就叫做目的IP地址。当卖家发货之后,我们可以查看物流,经常会看到类似于这样的话,您的快递已经到达[广州分拨中心]下一站[西安分拨中心],这里的广州分拨中心和西安分拨中心就是MAC地址。通常,我们的快递都是几经周折才到我们手中的,中间的地址一直变,但是发货地址和收获地址是一直没有变化的,也就是说,在一次数据传输过程中,MAC地址是会变化的,但是源IP地址和目的IP地址是不会变的。

 

端口号

端口号是一个2字节(16位)的整数,用来标识一个进程。两个主机依靠网络进行通信,肯定是通过分属于两个主机的进程在进行通信,那么两个进程是怎么找到彼此的呢?先通过IP地址(IP地址就标识了一台主机)找到对方进程所属的那台主机。但是一台主机里边可能同时执行了对个进程,这个时候就需要依靠端口号来告诉操作系统,是哪个进程在与之通信,当前的这些数据要交给这个进程来处理。

我们都知道,每一个进程都有一个进程ID来标识。那么为什么还要用一个端口号来标识一个进程呢?端口号和进程ID有什么区别呢?

其实,进程ID就相当于是我们的身份证号。我们每个人都有,且是唯一的。但是,身份证有一个缺点,就是比较长(当然现实中身份证还是属于比较隐私的东西,不能随便告知别人),也不好记忆。当我们进到一家公司工作,会给我们一个工号。这个工号相当于就是端口号。虽然在公司里边也可以用一个身份证来标识每一个员工,但是一家公司根本不可能说拥有相当于全中国人口那么多的员工。可能就几万人甚至几千人,只需要用5位数就可以将所有人都标记出来,而身份证有18位。而且,可能某个人很是优秀,身兼多职,那么对于他所处的每个职位,可能就对应一个不同的工号。同样的,一个进程也可以有多个端口号。虽然说端口号是用于标识一个进程的,但并不是所有的进程都有端口号。端口号是用于在网络中标识一个进程的,只有访问网络的进程才会有端口号。其实这也很好理解,你都没有进入别人的公司,没有成为公司的员工,公司肯定不会说硬塞给你一个工号吧。

 

网络字节序

一个主机通过网络将数据发送到另一个主机的过程中,数据的发送和接收时的字节的处理顺序

发送主机通常将发送缓冲区中的数据按内存地址由低到高的顺序发出;

接收主机把从网络上接到的字节一次保存到接收缓冲区中,也是按照由低到高的顺序保存。

机器都是有大小端之分的,有的机器是大端的,有的机器是小端的。如果一个大端的机器想和一个小端的机器进行通信,如果对数据进行一些处理,就会发生这样的情况:源主机A以大端的方式将数据传送出去,而目的主机B并不知道对方是大端的方式发送的,然后B主机一小端的方式将数据进行接收,很显然,这就出现问题了。发送和收到的数据根本就不一致。

所以,为了避免上述情况发生,也就是主机的大小端模式的不一样导致发送和接收的收据不一致的问题。网络数据流的地址应该这样规定:先发出的数据是低地址,后发出的数据是高地址。

TCP/IP协议规定,网络数据流应该采用大端字节序,即低地址存高字节。

不管这台主机是大端模式的还是小端模式的,都会按照这个TCP/IP规定的网络字节序列来发送/j接收数据。

如果当前发送主机是小端,就需要先将数据转成大端再发送。

具体转的方法系统已经帮我们实现了,只需要调用一下系统给出的接口就可以了系统为我们提供哪些接口呢?

 

#include <arpa/inet.h>

uint32_t    htonl(uint32_t hostlong);

uint16_t    htons(uint16_t hostshort);

uint32_t    ntohl(uint32_t hostlong);

uint16_t    ntohs(uint16_t hostshort);

 

这些函数看着很相似,可能会觉的不太好记忆。所以,理解各个函数的含义有助于我们的记忆。函数名中的 h 代表 host(本地) , n 表示 network(网络) 。l 表示 long(32位长整型),s 表示 short(16位短整数)。htonl 就表示将32位的长整型从主机字节序列转换为网络字节序列,比如说将IP地址转换后准备发送。

如果主机是小字节序,这些函数将参数做相应的大小端转换后返回;如果主机是大端字节序,则什么都不处理,直接将参数返回。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值