MAC地址介绍
网卡是一块被设计用来允许计算机在计算机网络上进行通讯的计算机硬件,又称为网络适配器或网 络接口卡NIC。
其拥有 MAC
地址,属于
OSI
模型的第
2
层,它使得用户可以通过电缆或无线相互 连接。每一个网卡都有一个被称为 MAC
地址的独一无二的
48
位串行号。网卡的主要功能:
1.数据的封装与解封装
2.链路管理
3.数据编码与译码。
MAC 地址(
Media Access Control Address
),直译为媒体存取控制位址,也称为局域网地址、 以太网地址、物理地址或硬件地址,它是一个用来确认网络设备位置的位址,由网络设备制造商生产时烧录在网卡中。
在 OSI 模型中,第三层网络层负责
IP
地址,第二层数据链路层则负责
MAC 位址 。MAC
地址用于在网络中唯一标识一个网卡,一台设备若有一或多个网卡,则每个网卡都需要并会有一个唯一的 MAC
地址。 MAC 地址的长度为
48
位(
6
个字节),通常表示为
12
个
16
进制数,如:
00-16-EA-AE-3C-40
就是一个MAC
地址,其中前
3
个字节,
16
进制数
00-16-EA
代表网络硬件制造商的编号,它由 IEEE(电气与电子工程师协会)分配,而后
3
个字节,
16
进制数
AE-3C-40
代表该制造商所制造的 某个网络产品(如网卡)的系列号。只要不更改自己的 MAC
地址,
MAC
地址在世界是唯一的。 形象地说,MAC
地址就如同身份证上的身份证号码,具有唯一性。
IP地址介绍
IP 协议是为计算机网络相互连接进行通信而设计的协议。在因特网中,它是能使连接到网上的所 有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守 IP
协议就可以与因特网互连互通。各个厂家生产的网络系统和设备,如以太网、分组交换网等,它们相互之间不能互通,不能互通的主要原因是因为它们所传 送数据的基本单元(技术上称之为“
帧
”
)的格式不同。
IP
协议实际上是一套由软件程序组成的协议 软件,它把各种不同“
帧
”
统一转换成
“IP
数据报
”
格式,这种转换是因特网的一个最重要的特点,使 所有各种计算机都能在因特网上实现互通,即具有“
开放性
”的特点。
IP 地址(
Internet Protocol Address
)是指互联网协议地址,又译为网际协议地址。
IP
地址是
IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以 此来屏蔽物理地址的差异。
IP 地址是一个
32
位的二进制数,通常被分割为
4
个
“ 8
位二进制数
”
(也就是
4
个字节)。
IP
地址 通常用“
点分十进制
”
表示成(
a.b.c.d
)的形式,其中,
a,b,c,d
都是
0~255
之间的十进制整数。 例:点分十进IP
地址(
100.4.5.6
),实际上是
32 位二进制数(
01100100.00000100.00000101.00000110
)
每个
IP
地址包括两个标识码(
ID
),即网络 ID 和主机
ID
。同一个物理网络上的所有主机都使用同一个网络
ID
,网络上的一个主机(包括网络上工作站,服务器和路由器等)有一个主机 ID
与其对应。
Internet
委员会定义了
5
种
IP
地址类型以适合不同容量的网络,即 A
类
~ E
类。
其中
A
、
B
、
C 3
类(如下表格)由
InternetNIC
在全球范围内统一分配,
D
、
E
类为特殊地址。
A类IP地址
一个 A
类
IP
地址是指, 在
IP
地址的四段号码中,第一段号码为网络号码,剩下的三段号码为本地计算机的号码。如果用二进制表示 IP
地址的话,
A
类
IP
地址就由
1
字节的网络地址和
3
字节主机地址组成,网络地址的最高位必须是“0”
。
A
类
IP
地址中网络的标识长度为
8
位,主机标识的长度为
24
位,
A类网络地址数量较少,有 126
个网络,每个网络可以容纳主机数达
1600
多万台。
A 类
IP
地址 地址范围
1.0.0.1 - 126.255.255.254
(二进制表示为:
00000001 00000000 00000000 00000001 - 01111111 11111111 11111111 11111110)。最后一个是广播地址。
A
类
IP
地址的子网掩码为
255.0.0.0
,每个网络支持的最大主机数为
256
的
3
次方
- 2 = 16777214
台。
B类IP地址
一个 B
类
IP
地址是指,在
IP
地址的四段号码中,前两段号码为网络号码。如果用二进制表示
IP
地址的话,B
类
IP
地址就由
2
字节的网络地址和
2
字节主机地址组成,网络地址的最高位必须是
“10”
。
B
类
IP 地址中网络的标识长度为 16
位,主机标识的长度为
16
位,
B
类网络地址适用于中等规模的网络,有 16384 个网络,每个网络所能容纳的计算机数为
6
万多台。
B
类
IP
地址地址范围
128.0.0.1 - 191.255.255.254
(二进制:
10000000 00000000 00000000 00000001 - 10111111 11111111 11111111 11111110) 最后一个是广播地址,B 类
IP
地址的子网掩码为
255.255.0.0
,每个网络支持的最大主机数为
256
的
2
次方
- 2 = 65534
台。
C类IP地址
一个 C
类
IP
地址是指,在
IP
地址的四段号码中,前三段号码为网络号码,剩下的一段号码为本地计算机的号码。如果用二进制表示 IP
地址的话,
C
类
IP
地址就由
3
字节的网络地址和
1
字节主机地址组成,网络地址的最高位必须是“110”
。
C
类
IP
地址中网络的标识长度为
24
位,主机标识的长度为
8
位, C 类网络地址数量较多,有
209
万余个网络。适用于小规模的局域网络,每个网络最多只能包含
254
台 计算机。
C 类
IP
地址范围
192.0.0.1-223.255.255.254 (二进制表示为
: 11000000 00000000 00000000 00000001 - 11011111 11111111 11111111 11111110)。 C类
IP
地址的子网掩码为
255.255.255.0
,每个网络支持的最大主机数为
256 - 2 = 254
台。
D类IP地址
D 类
IP
地址在历史上被叫做多播地址(
multicast address
),即组播地址。在以太网中,多播地址命 名了一组应该在这个网络中应用接收到一个分组的站点。多播地址的最高位必须是 “1110”
,范围从 224.0.0.0 - 239.255.255.255。
特殊的网址
每一个字节都为
0
的地址(
“0.0.0.0”
)对应于当前主机;
IP
地址中的每一个字节都为
1
的
IP
地址(
“255.255.255.255”
)是当前子网的广播地址;
IP
地址中凡是以
“11110”
开头的
E
类
IP
地址都保留用于将来和实验使用。
IP
地址中不能以十进制
“127”
作为开头,该类地址中数字
127.0.0.1
到
127.255.255.255
用于回路测 试,如:127.0.0.1
可以代表本机
IP
地址。
子网掩码
子网掩码(subnet mask
)又叫网络掩码、地址掩码、子网络遮罩,它是一种用来指明一个
IP
地 址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合 IP
地址一起使用。子网掩码只有一个作用,就是将某个
IP
地址划分成网络地址和 主机地址两部分。
子网掩码是一个 32
位地址,用于屏蔽
IP
地址的一部分以区别网络标识和主机标识,并说明该 IP 地址是在局域网上,还是在广域网上。
其对应网络地址的所有位都置为
1
,对应于主 机地址的所有位置都为 0
。子网掩码告知路由器,地址的哪一部分是网络地址,哪一部分是主机地址, 使路由器正确判断任意 IP
地址是否是本网段的,从而正确地进行路由。网络上,数据从一个地方传到另 外一个地方,是依靠 IP
寻址。从逻辑上来讲,是两步的。第一步,从
IP
中找到所属的网络,好比是去 找这个人是哪个小区的;第二步,再从 IP
中找到主机在这个网络中的位置,好比是在小区里面找到这个人。 子网掩码的设定必须遵循一定的规则。与二进制 IP
地址相同,子网掩码由
1
和
0
组成,且
1
和
0
分别 连续。
子网掩码是在 IPv4
地址资源紧缺的背景下为了解决
lP
地址分配而产生的虚拟
lP
技术,通过子网掩码将 A、
B
、
C
三类地址划分为若干子网,从而显著提高了
IP
地址的分配效率,有效解决了
IP 地址资源紧张 的局面。
端口
简介
“端口
”
是英文
port
的意译,可以认为是设备与外界通讯交流的出口。端口可分为虚拟端口和物理端口,其中虚拟端口指计算机内部或交换机路由器内的端口,不可见,是特指TCP/IP
协议中的端口,是逻辑意义上的端口。例如计算机中的 80
端口、
21
端口、
23
端口等。物理端口又称为接 口,是可见端口,计算机背板的 RJ45
网口,交换机路由器集线器等
RJ45
端口。电话使用
RJ11
插 口也属于物理端口的范畴。
如果把 IP
地址比作一间房子,端口就是出入这间房子的门。真正的房子只有几个门,但是一个
IP 地址的端口可以有 65536
(即:
2^16
)个之多!端口是通过端口号来标记的,端口号只有整数, 范围是从 0
到
65535
(
2^16-1
)。
端口类型
1.周知端口(Well Known Ports)
周知端口是众所周知的端口号,也叫知名端口、公认端口或者常用端口,范围从
0
到
1023
,它们紧密 绑定于一些特定的服务。例如 80
端口分配给
WWW
服务,
21
端口分配给
FTP
服务,
23
端口分配给Telnet服务等等。我们在
IE
的地址栏里输入一个网址的时候是不必指定端口号的,因为在默认情况下 WWW 服务的端口是
“80”
。网络服务是可以使用其他端口号的,如果不是默认的端口号则应该在地址栏上指定端口号,方法是在地址后面加上冒号“:”
(半角),再加上端口号。比如使用
“8080”
作为
WWW 服务的端口,则需要在地址栏里输入“
网址
:8080”
。但是有些系统协议使用固定的端口号,它是不能被改 变的,比如 139
端口专门用于
NetBIOS
与
TCP/IP
之间的通信,不能手动改变。
2.注册端口(Registered Ports)
端口号从
1024
到
49151
,它们松散地绑定于一些服务,分配给用户进程或应用程序,这些进程主要是用户选择安装的一些应用程序,而不是已经分配好了公认端口的常用程序。这些端口在没有被服务器资 源占用的时候,可以用用户端动态选用为源端口。
3.动态端口 / 私有端口(Dynamic Ports / Private Ports)
动态端口的范围是从
49152
到
65535
。之所以称为动态端口,是因为它一般不固定分配某种服务,而是 动态分配。
socket套接字
简介
所谓 socket
(套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处 的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口, 是应用程序与网络协议根进行交互的接口。
socket 可以看成是两个网络应用程序进行通信时,各自通信连接中的端点,这是一个逻辑上的概 念。它是网络环境中进程间通信的 API
,也是可以被命名和寻址的通信端点,使用中的每一个套接 字都有其类型和一个与之相连进程。通信时其中一个网络应用程序将要传输的一段信息写入它所在 主机的 socket
中,该
socket
通过与网络接口卡(
NIC
)相连的传输介质将这段信息送到另外一台 主机的 socket
中,使对方能够接收到这段信息。
socket
是由
IP
地址和端口结合的,提供向应用 层进程传送数据包的机制。
socket 本身有
“
插座
”
的意思,在
Linux
环境下,用于表示进程间网络通信的特殊文件类型。本质为内核借助缓冲区形成的伪文件。既然是文件,那么理所当然的,我们可以使用文件描述符引用套接 字。与管道类似的,Linux
系统将其封装成文件的目的是为了统一接口,使得读写套接字和读写文 件的操作一致。区别是管道主要应用于本地进程间通信,而套接字多应用于网络进程间数据的传递。
socket数据结构
socket
地址其实是一个结构体,封装端口号和
IP
等信息。后面的
socket
相关的
api
中需要使用到这个
socket地址。
客户端
->
服务器(
IP, Port
)
socket
网络编程接口中表示
socket
地址的是结构体
sockaddr
,其定义如下:
#include <bits/socket.h>
struct sockaddr {
sa_family_t sa_family;
char sa_data[14];
};
typedef unsigned short int sa_family_t;
sa_family
成员是地址族类型(
sa_family_t
)的变量。地址族类型通常与协议族类型对应。常见的协议 族(protocol family
,也称
domain
)和对应的地址族入下所示:
宏
PF_*
和
AF_*
都定义在
bits/socket.h
中,且后者与前者有完全相同的值,所以二者通常混用。
sa_data
成员用于存放
socket
地址值。但是,不同的协议族的地址值具有不同的含义和长度,如下所示:
由上表可知,14
字节的
sa_data
根本无法容纳多数协议族的地址值。因此,
Linux
定义了下面这个新的 通用的 socket
地址结构体,这个结构体不仅提供了足够大的空间用于存放地址值,而且是内存对齐的。
#include <bits/socket.h>
struct sockaddr_storage
{
sa_family_t sa_family;
unsigned long int __ss_align;
char __ss_padding[ 128 - sizeof(__ss_align) ];
};
typedef unsigned short int sa_family_t;
socket工作原理
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h> // 包含了这个头文件,上面两个就可以省略
int socket(int domain, int type, int protocol);
- 功能:创建一个套接字
- 参数:
- domain: 协议族
AF_INET : ipv4
AF_INET6 : ipv6
AF_UNIX, AF_LOCAL : 本地套接字通信(进程间通信)
- type: 通信过程中使用的协议类型
SOCK_STREAM : 流式协议
SOCK_DGRAM : 报式协议
- protocol : 具体的一个协议。一般写0
- SOCK_STREAM : 流式协议默认使用 TCP
- SOCK_DGRAM : 报式协议默认使用 UDP
- 返回值:
- 成功:返回文件描述符,操作的就是内核缓冲区。
- 失败:-1
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); //socket命名
- 功能:绑定,将fd 和本地的IP + 端口进行绑定
- 参数:
- sockfd : 通过socket函数得到的文件描述符
- addr : 需要绑定的socket地址,这个地址封装了ip和端口号的信息
- addrlen : 第二个参数结构体占的内存大小
int listen(int sockfd, int backlog); // /proc/sys/net/core/somaxconn
- 功能:监听这个socket上的连接
- 参数:
- sockfd : 通过socket()函数得到的文件描述符
- backlog : 未连接的和已经连接的和的最大值, 5
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
- 功能:接收客户端连接,默认是一个阻塞的函数,阻塞等待客户端连接
- 参数:
- sockfd : 用于监听的文件描述符
- addr : 传出参数,记录了连接成功后客户端的地址信息(ip,port)
- addrlen : 指定第二个参数的对应的内存大小
- 返回值:
- 成功 :用于通信的文件描述符
- -1 : 失败
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
- 功能: 客户端连接服务器
- 参数:
- sockfd : 用于通信的文件描述符
- addr : 客户端要连接的服务器的地址信息
- addrlen : 第二个参数的内存大小
- 返回值:成功 0, 失败 -1
ssize_t write(int fd, const void *buf, size_t count); // 写数据
ssize_t read(int fd, void *buf, size_t count); // 读数据
网路服务器连接流程
// TCP
通信的流程
//
服务器端 (被动接受连接的角色)
1.
创建一个用于监听的套接字
-
监听:监听有客户端的连接
-
套接字:这个套接字其实就是一个文件描述符
2.
将这个监听文件描述符和本地的
IP
和端口绑定(
IP
和端口就是服务器的地址信息)
-
客户端连接服务器的时候使用的就是这个
IP
和端口
3.
设置监听,监听的
fd
开始工作
4.
阻塞等待,客户端发起连接解除阻塞,接受客户端的连接,得到一个和客户端通信套接字(fd)
5.
通信
-
接收数据
-
发送数据
6.
通信结束,断开连接
//
客户端
1.
创建一个用于通信的套接字(
fd
)
2.
连接服务器,需要指定连接的服务器的
IP
和 端口
3.
连接成功了,客户端可以直接和服务器通信
-
接收数据
-
发送数据
4.
通信结束,断开连接