1.网络:
1.数据传输
2.数据共享
2.协议:
1.通信双方约定的一套协议标准
3.国际网络协议标准:
1.OSI网络协议模型
分层:
应用层 要传输的数据
表示层 数据是否加密传输
会话层 是否建立可控的会话连接
传输层 数据传输的方式
网络层 数据的路由(跨局域网通信)
数据链路层 局域网内部的通信
物理层 物理介质连接
2.TCP/IP网络协议模型
应用层 HTTP、HTTPS、MQTT、SMTP、FTP、TFTP、...
传输层 TCP、UDP
网络层 IPv4 IPv6 ARP RARP MAC地址:网卡地址(唯一) IP地址:网络地址
物理层
4.UDP和TCP:
UDP:用户数据报协议
特点:
1.实现机制简单
2.资源开销小
3.不安全、不可靠
TCP:传输控制协议
过程:
1.三次握手建立连接
发送方 接收方
SYN
ACK + SYN
ACK
2.传输过程中有序列号和确认号保障数据传输的完整性
PSH
ACK
3.四次挥手结束连接
FIN
ACK
FIN
ACK
特点:
1.实现机制复杂
2.资源开销大
3.安全、可靠
5.IPv4协议:
管理员形式: 192.168.0.158
内存形式: 11000000. 10101000. 00000000. 10011110
子网掩码: 255.255.255.0
11111111. 11111111. 11111111. 00000000
IP地址 = 网络位 + 主机位
网络位:表示局域网的编号
主机位:该IP地址是在局域网中的第几台主机
子网掩码:区分IP地址的网络位和主机位(IP地址都会搭配子网掩码使用)
子网掩码对应的二进制形式中是1的部分对应IP地址的网络位
是0的部分对应IP地址的主机位
网段号:网络位不变,主机位全为0,则表示网段号 192.168.0.0
广播号:网络位不变,主机位全为1,则表示广播号 192.168.0.255
一个局域网内,网段号和广播号,不能作为主机的IP地址使用
192.168.100.137
11000000.10101000.01100100.10001001
11111111.11111111.11111111.11100000
255.255.255.224
11000000.10101000.01100100.10000000
11000000.10101000.01100100.10011111
网段号:192.168.100.128
广播号:192.168.100.159
1.IP地址的分类:
公有地址:能够直接上网的IP地址
私有地址:不能够直接上网的IP地址
A类:0.0.0.0 - 126.255.255.255
255.0.0.0
管理超大规模型网络
私有地址: 10.0.0.0 - 10.255.255.255
B类:128.0.0.0 - 191.255.255.255
255.255.0.0
管理大中规模型网络
私有地址:172.16.0.0 - 172.31.255.255
C类:192.0.0.0 - 223.255.255.255
255.255.255.0
管理中小规模型网络
私有地址:192.168.0.0 - 192.168.255.255
D类:224.0.0.0 - 239.255.255.255
组播地址
E类:240.0.0.0 - 255.255.255.255
实验地址
2.MAC地址:
网卡地址(唯一的)
实现在局域网内部通信
3.IP地址:
实现跨网段通信
4.端口号:
区分同一台主机上不同的应用程序
6.虚拟机网络地址设置:
NAT模式:Ubuntu虚拟出来一个网卡,IP地址也是虚拟的,只要windows有网,Ubuntu就有网
桥接模式:Ubuntu直接使用真实的网卡作为操作系统的网卡,通过实际网卡进行数据收发(网络传输不经过windows了)
1.将虚拟机设置为桥接模式:
1.点击"虚拟机"
2.点击"设置"
3.点击"网络适配器"
4.选择"桥接模式"
5.点击"确定"
2.将网卡桥接到无线网卡上:
1.点击"编辑"
2.点击"虚拟网络编辑器"
3.点击"更改设置"
4.选择桥接到 无线网卡
5.点击"确定"
3.设置UbuntuIP地址为自动获取IP地址
1.打开网卡配置文件
sudo vim /etc/network/interfaces
2.修改文件内容
auto lo
iface lo inet loopback
auto ens33
iface ens33 inet dhcp
3.保存退出
4.重启网络服务
sudo /etc/init.d/networking restart
5.ifconfig
查看网卡地址信息
6.ping www.baidu.com
PING www.a.shifen.com (183.2.172.185) 56(84) bytes of data.
64 bytes from 183.2.172.185 (183.2.172.185): icmp_seq=1 ttl=52 time=35.0 ms
64 bytes from 183.2.172.185 (183.2.172.185): icmp_seq=2 ttl=52 time=35.4 ms
64 bytes from 183.2.172.185 (183.2.172.185): icmp_seq=3 ttl=52 time=35.2 ms
7.UDP编程:
1.socket 套接字
通信对象的抽象
2.函数接口:
1.socket
int socket(int domain, int type, int protocol);
功能:
创建一个用来网络通信的终端节点
参数:
domain:协议族 AF_INET
type:套接字的类型
SOCK_STREAM:流式套接字 TCP
SOCK_DGRAM:数据报套接字 UDP
SOCK_RAW:原始套接字
protocol:
默认传0
返回值:
成功返回创建的文件描述符
失败返回-1
2.sendto
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
功能:
发送数据信息
参数:
sockfd:套接字文件描述符
buf:发送数据空间首地址
len:发送的字节数
flags:发送属性(默认为0)
dest_addr:目的地址信息存放空间首地址
addrlen:目的地址的长度
返回值:
成功返回发送字节数
失败返回-1
struct sockaddr_in {
sa_family_t sin_family; /* address family: AF_INET */
in_port_t sin_port; /* port in network byte order */
struct in_addr sin_addr; /* internet address */
};
/* Internet address. */
struct in_addr {
uint32_t s_addr; /* address in network byte order */
};
3.inet_addr
in_addr_t inet_addr(const char *cp);
功能:
将字符串IP地址转换为内存IP地址类型
4.htons
uint16_t htons(uint16_t hostshort);
功能:
将本地字节序转换成网络字节序
练习:
发端循环从终端接收消息,发送给接收端,
输入.quit退出
5.bind
int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
功能:
将一个套接字与IP和端口号绑定
参数:
sockfd:套接字文件描述符
addr:绑定的IP地址和端口号信息
addrlen:地址的大小
返回值:
成功返回0
失败返回-1
注意:
1.只能绑定自己这台主机的IP和端口
2.端口号只能被一个套接字绑定,多次绑定会报错提示端口号被占用
6.recvfrom
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
功能:
接收数据
参数:
sockfd:套接字文件描述符
buf:存放数据空间首地址
len:存放数据最大字节数
flags:属性默认为0
src_addr:存放发送方地址信息空间首地址
addrlen:接收发送方的地址信息长度
返回值:
成功返回实际接收字节数
失败返回-1
8.UDP通信流程:
1.发送方:
socket
sendto
close
2.接收方:
socket
bind
recvfrom
close
发送方:sendto本身具有绑定的功能(IP地址绑定为当前主机的IP,端口号绑定随机端口)
作业:
1.编写程序实现利用UDP实现文件的发送
发送端 接收端
./send ./recv
filename