【1】认识网络
网络:多设备通信
【2】IP地址
1.基本概念
- IP地址是Internet中主机的标识
- Internet中的主机要与别的机器通信必须具有一个IP地址
- IP地址为32位(IPv4)或者128位(IPv6)
NAT:公网转私网、私网转公网
- IPV4表示形式:常用点分十进制形式,如202.38.64.10,最后都会转换为一个32位的无符号整数。
NAT设备(网络地址转换)
● 功能:NAT设备的主要功能是将内部私有IP地址转换为公共IP地址,或反向操作,以便在局域网和外部网络(如互联网)之间进行通信。
● 工作原理:
当局域网内的设备访问互联网时,NAT设备记录设备的内部IP地址和源端口,并用公共IP地址替换。
响应的流量也会经过NAT设备,NAT通过记录的映射关系将数据包发送回正确的内部设备。
● 作用对象:NAT设备用于管理与外部网络(如互联网)的通信,通常作为路由器的一部分。
DHCP服务器(动态主机配置协议)
● 功能:DHCP服务器的主要任务是自动分配IP地址、子网掩码、默认网关和DNS服务器ip等网络配置给网络中的设备(客户端),简化网络管理。
● 工作原理:
当一个设备(如电脑或手机)首次连接到网络时,它会发送一个DHCP请求。
DHCP服务器接收到请求后,从预设的IP地址池中分配一个可用的IP地址,并返回给客户端。
● 作用对象:DHCP服务器专注于局域网内部的IP地址管理。
2.网络号/主机号(二级划分)
思考:你了解你的身份证号吗?
IP地址 = 网络号+主机号
网络号:表示是否在一个网段内(局域网)
主机号:标识在本网段内的ID,同一局域网不能重复
3.IP地址分类
整体分类
A类:(0.0.0.0-127.255.255.255)(默认子网掩码:255.0.0.0)
第一个字节为网络号,后三个字节为主机号(一个字节占8位)。该类IP地址的最前面为“0”,因为网络号是8位,所以地址的网络号取值于 0~127之间(0000 0000)(0111 1111)。
一般用于大型网络,主机号取值在0 - 2 ^24之间. 127.0.0.1:本机回环地址
B类:(128.0.0.0-191.255.255.255)(默认子网掩码:255.255.0.0)
前两个字节为网络号,后两个字节为主机号。该类IP地址的最前面为“10”,所以地址的网络号取值于128~191之间。
一般用于中等规模网络。
C类:(192.0.0.0-223.255.255.255)(子网掩码:255.255.255.0)
前三个字节为网络号,最后一个字节为主机号。该类IP地址的最前面为“110”,所以地址的网络号取值于192~223之间。
一般用于小型网络(一般教室使用的是C类)。
D类:(224.0.0.0- 239.255.255.255)是多播地址。
该类IP地址的最前面为“1110”,所以地址的范围取值于224~239之间。
一般用于组播用户,组播通信。
E类:是保留地址。该类IP地址的最前面为“1111”,所以地址的取值于240~247之间。
一般是一些保密单位用得到,平时基本不会用到
A类:1.0.0.1~126.255.255.254
B类:128.0.0.1~~191.255.255.254
C类:192.0.0.1~~223.255.255.254
D类(组播地址):224.0.0.1~~239.255.255.254
特殊地址
0.0.0.0:在服务器中,0.0.0.0指的是本机上的所有IPV4地址,如果一个主机有两个IP地址,192.168.1.1 和 10.1.2.1,并且该主机上的一个服务监听的地址是0.0.0.0,那么通过两个ip地址都能够访问该服务。
127.0.0.1:回环地址/环路地址,所有发往该类地址的数据包都应该被loop back。
网络地址: 每一个网段主机号为0的地址; 如: 192.168.50.169--》192.168.50.0
它是网络中的一个特殊地址,不能被分配给任何具体的主机。
广播地址: 主机号最大的地址是该网段的广播地址 如:192.168.50.255
如: b类IP 广播地址为: 130.223.255.255
全网广播地址 : 255.255.255.255, 该地址不能随便用,会影响这个网络
4.子网掩码
- 子网掩码:是一个32位的整数,作用是将某一个IP划分成网络地址和主机地址;
- 子网掩码长度是和IP地址长度完全一样;
- 网络号全为1,主机号全为0;
- 公式:网络地址=IP & MASK(子网掩码)
主机地址= IP& ~MASK
192.168.50.168 255.255.255.0
192.168.50.168 & 255.255.255.0 = 192.168.50.0
192.168.50.168 & ~255.255.255.0 = 192.168.50.168 & 0.0.0.255 = 0.0.0.168
练习:
练习一:B类地址的子网掩码怎么写?255.255.0.0
练习二:B类地址,同一网段最多可以连接多少个主机?216-2=65536-2
练习三:已知一个子网掩码号为255.255.255.192,问:最多可以连接多少台主机?
子网掩码特点:网络号全为1,主机号全为0
192==》1100 0000 26-2
练习四:一个IP地址为192.168.3.183 ,计算其网络号与主机号
C类:255.255.255.0
网络号:192.168.3.0
主机号:0.0.0.183
练习五: 如果有800台电脑, 在不浪费ip情况下, 选用哪个网段?B
5.三级划分
作用: 重新划分网络号和主机号 , 也就是重新组网 , 从而提高资源利用率
二级划分 IP :IP地址= 网络号 + 主机号
三级划分 IP :IP地址= 网络号 + 子网号 + 主机号
笔试1:某公司有四个部门:行政、研发1、研发2、营销,每个部门各50台计算机接入公司局域网,如果要在192.168.1.0网段为每个部门划分子网,子网掩码应该怎么设置,每个子网的地址范围分别是什么?(4个部门之间不能通信)
C类:254
192.168.1.0000 0000
行政:192.168.1.00 00 0000-192.168.1.00 11 1111--》192.168.1.0-192.168.1.63
研发一:192.168.1.01 00 0000-192.168.1.01 11 1111--》192.168.1.64-192.168.1.127
研发二:192.168.1.10 00 0000-192.168.1.10 11 1111--》192.168.1.128-192.168.1.191
营销:192.168.1.11 00 0000-192.168.1.11 11 1111-》192.168.1.192-192.168.1.255
子网掩码:255.255.255.11 00 0000===》255.255.255.192
有两台电脑主机,在最少浪费IP地址的情况下.将172.16.14.4与172.16.13.2划归为同一网段,则子网掩码应该设置为225.255.252.0
B类
172.16.0000 1110.4
172.16.0000 1101.2
三级划分:网络号(172.16)+子网号(二进制0000 11)+主机号(自己的)
255.255.1111 11 00.0==》255.255.252.0
【3】socket
1.socket发展
1)1982 - Berkeley Software Distributions 操作系统引入了socket作为本地进程之间通信的接口
2)1986 - Berkeley 扩展了socket 接口,使之支持UNIX 下的TCP/IP 通信
3)现在很多应用 (FTP, Telnet) 都依赖这一接口
2.socket介绍
1、是一个编程接口
2、是一种特殊的文件描述符 (everything in Unix is a file)
3、socket是一种通信机制,并不仅限于TCP/IP协议
4、面向连接 (Transmission Control Protocol - TCP/IP)
无连接 (User Datagram Protocol -UDP 和 Inter-network Packet Exchange - IPX)
3.为什么需要socket?
1.普通的I/O操作过程 :打开文件->读/写操作->关闭文件
2.TCP/IP协议被集成到操作系统的内核中,引入了新型的“I/O”操作 ----->进行网络通信的两个进程在不同的机器上,如何连接? 网络协议具有多样性,如何进行统一的操作 ?
需要一种通用的网络编程接口:Socket
4.socket类型
流式套接字(SOCK_STREAM) TCP
提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。
数据报套接字(SOCK_DGRAM) UDP
提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。
原始套接字(SOCK_RAW)
可以对较低层次协议如IP、ICMP直接访问,还有一些ping命令
5.位置
【4】端口号
● 为了区分一台主机接收到的数据包应该转交给哪个进程来进行处理,使用端口号来区分
● TCP端口号与UDP端口号独立(UDP port为8888,TCP port也可为8888 )
● 端口号一般由IANA (Internet Assigned Numbers Authority) 管理
● 端口用两个字节来表示
众所周知端口(被占用):1~1023(1~255之间为众所周知端口,256~1023端口通常由UNIX系统占用)
已登记端口:1024~49151(----可用来建立与其它主机的会话----)
动态或私有端口:49152~65535 --固定某些服务使用--
【5】字节序
字节序: 不同类型的cpu主机,内存存储大于一个字节类型的数据在内存中的存放顺序。
分类:
小端序(little-endian) - 低序字节存储在低地址 (主机字节序)
大端序(big-endian)- 高序字节存储在低地址 (网络字节序)
网络中传输的数据必须使用网络字节序,即大端字节序
终端显示的数据必须是主机字节序,即小端字节序
网络传输中,需要将每个主机的主机字节序(CPU决定),转换为网络中统一顺序的网络字节序,才能供双方主机去识别。
只需要转换IP和port就可以,不需要转换传输的数据包的字节序,因为IP和port为 4个字节和2个字节, 而数据报一般都为char类型, 占一个字节,根据字节序的性质,内存存储大于一个字节类型的数据在内存中的存放顺序,所以char类型并不具有字节序的概念。
端口转换 5678
主机字节序转换为网络字节序 (小端序->大端序)
u_long htonl (u_long hostlong); //host to internet long
u_short htons (u_short short); //掌握这个
网络字节序转换为主机字节序(大端序->小端序)
u_long ntohl (u_long hostlong);
u_short ntohs (u_short short);
IP地址转换 "192.168.31.238"
主机字节序转换为网络字节序 (小端序->大端序)
in_addr_t inet_addr(const char *strptr); //该参数是字符串
typedef uint32_t in_addr_t;
struct in_addr {
in_addr_t s_addr;
};
功能: 主机字节序转为网络字节序
参数: const char *strptr: 字符串
返回值: 返回一个无符号长整型数(无符号32位整数用十六进制表示),
否则NULL
网络字节序转换为主机字节序(大端序->小端序)
char *inet_ntoa(stuct in_addr inaddr);
功能: 将网络字节序二进制地址转换成主机字节序。
参数: stuct in_addr in addr : 只需传入一个结构体变量
返回值: 返回一个字符指针, 否则NULL;
【6】tcp编程
(C/S架构:client server B/S架构:browser server)
1.流程
服务器-------------------------------------------------------------------》接电话者
- 创建套接字(socket)---------------》有手机
- 指定网络信息---------------------------》有号码
- 绑定套接字(bind)------------------》绑定手机(插卡)
- 监听套接字(listen)-----------------》待机
- 接收客户端连接连接请求(accept)--》接电话
- 接收、发送数据(recv send)---》通话
- 关闭套接字(close)-----------------》挂电话
客户端-------------------------------------------------------------------》打电话者
- 创建套接字(socket)------------》有手机
- 指定(服务器)网络信息--------》有对方的号码
- 连接(connect)-------------------》拨打电话
- 接收发送消息(recv send)---》通话
- 关闭套接字(close)------------》挂电话
2.函数接口
1.socket
int socket(int domain, int type, int protocol);
功能:创建套接字
参数:
domain:协议族
AF_UNIX, AF_LOCAL 本地通信
AF_INET ipv4
AF_INET6 ipv6
type:套接字类型
SOCK_STREAM:流式套接字
SOCK_DGRAM:数据报套接字
SOCK_RAW:原始套接字
protocol:协议 - 填0 自动匹配底层 ,根据type
系统默认自动帮助匹配对应协议
传输层:IPPROTO_TCP、IPPROTO_UDP、IPPROTO_ICMP
网络层:htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL)
返回值:
成功 文件描述符
失败 -1,更新errno
2.bind
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:绑定
参数:
socket:套接字
addr:用于通信结构体 (提供的是通用结构体,需要根据选择通信方式,填充对应结构体-通信当时socket第一个参数确定)
addrlen:结构体大小
返回值:成功 0 失败-1,更新errno
通用结构体:
struct sockaddr {
sa_family_t sa_family;
char sa_data[14];
}
ipv4通信结构体:
struct sockaddr_in {
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
};
struct in_addr {
uint32_t s_addr;
};
本地通信结构体:
struct sockaddr_un {
sa_family_t sun_family; /* AF_UNIX */
char sun_path[108]; /* pathname */
};
3.listen
int listen(int sockfd, int backlog);
功能:监听,将主动套接字变为被动套接字
参数:
sockfd:套接字
backlog:同时响应客户端请求链接的最大个数,不能写0.
不同平台可同时链接的数不同,一般写6-8个
(队列1:保存正在连接)
(队列2,连接上的客户端)
返回值:成功 0 失败-1,更新errno
4.accept
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
accept(sockfd,NULL,NULL);
功能:阻塞函数,阻塞等待客户端的连接请求,如果有客户端连接,
则accept()函数返回,返回一个用于通信的套接字文件;
参数:
Sockfd :套接字
addr: 链接客户端的ip和端口号
如果不需要关心具体是哪一个客户端,那么可以填NULL;
addrlen:结构体的大小
如果不需要关心具体是哪一个客户端,那么可以填NULL;
返回值:
成功:文件描述符; //用于通信
失败:-1,更新errno
5.recv
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能: 接收数据
参数:
sockfd: acceptfd ;
buf 存放位置
len 大小
flags 一般填0,相当于read()函数
MSG_DONTWAIT 非阻塞
返回值:
< 0 失败出错 更新errno
==0 表示客户端退出
>0 成功接收的字节个数
6.connect
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
功能:用于连接服务器;
参数:
sockfd:socket函数的返回值
addr:填充的结构体是服务器端的;
addrlen:结构体的大小
返回值
-1 失败,更新errno
正确 0
7.send
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:发送数据
参数:
sockfd:socket函数的返回值
buf:发送内容存放的地址
len:发送内存的长度
flags:如果填0,相当于write();
这个需要网络调试助手来验证。