Linux的系统编程阶段已经结束了…网络编程开始…
网络基础1->套接字编程->网络基础2->网络基础3->高级io
基本概念:
交换机:实现数据转发功能,链接多台计算机,但是不具备选择路径的能力
路由器:实现路径选择能力
互联网:大量路由器星型链接(向四面八方开枝散叶)
按照网络覆盖范围划分:
局域网:小的星型网络,覆盖范围1000米
城域网:10公里范围内网络
广域网:覆盖范围超过10公里
因特网:国际化的广域网
局域网技术:
以太网:以太网(Ethernet)是一种计算机局域网技术
令牌环网:每个主机都拥有一个令牌帧,谁拿到令牌谁进行数据传输
ip地址:
在网络唯一标识一台主机—uint32_t,无符号32位整数
在网络通信中的每一条数据中都应该包含有目的ip地址+源ip地址(为了回复)
ip地址个数为43亿,路由器也需要有ip地址
不够用,所以有了DHCP和NAT技术
DHCP(动态地址分配)—谁上网给谁分配ip地址
NAT(网络地址转换)—把源ip地址改成中端转发设备的地址
解决ip地址不够用的根本方法:ip分版本,ipv4和ipv6
uint8_t ip[16],16*8=128位,2^128
但是不向前兼容ipv4—导致ipv6的推广使用特别慢
端口号:
在一台主机上标识一个进程—当计算机收到一个数据之后能够通过数据中的目的端口信息来决定这个数据应该交给哪一个进程处理
每条网络中的数据都应该包含有:源端口+目的端口
uint16_t 范围为:0~65535
特性:
一个端口号只能被一个进程占用,但是一个进程可以使用多个端口号
0和1用高低电平表示,wifi的0和1使用波长标识
协议:
通信双方数据格式的约定
协议分层:
在通信环境中对每一层提供的服务以及接口还有使用的协议进行封装,使通信环境层次更加清晰,更加容易实现标准化;更加容易使用;实现网络互连
osi(open system internet)七层参考模型:
应用层->表示层->会话层->传输层->网络层->链路层->物理层
TCP/IP五层模型:
应用层->传输层->网络层->链路层->物理层
应用层:负责应用程序之间的数据沟通;HTTP/FTP/DNS/DHCP/SMTP
传输层:负责端与端之间的数据传输;TCP/UDP
网络层:负责地址管理与路由选择;IP;路由器;
链路层:负责相邻设备之间的数据传输;MAC地址(网卡硬件地址,ether地址);EtherNet(以太网)协议;交换机;
物理层:负责光电信号的传输;EtherNet(以太网)协议;集线器;
网络通信数据传输的处理流程:
原始数据:hello 对方收到原始数据
| ^
| |
v |
应用层:QQ描述这个hello(qq协议,可能是加密) 打印原始数据
| ^
| |
v |
传输层:操作系统拿到数据,tcp协议封装 port交给qq,解密
| ^
| |
v |
网络层:描述从哪个主机到哪个主机,ip协议 unsigned protocol交给tcp协议
| ^
| |
v |
链路层:封装一个以太头和一个以太帧尾,ether协议 eth的h_proto交给ip协议
| ^
| |
v |
物理层:将光电信号(高低电平)发送出去,010101...之类--------------------------->到达对方主机
网络字节序:
字节序:cpu在内存中对数据的存取顺序—针对存储大小大于一个字节的数据类型
主机字节序:取决于cpu架构(x86小端,MIPS大端)
在网络通信中(两台不同主机之间的通信),通信双方并不知道对方的字节序
在通信过程中,通信双方有可能因为主机字节序不同而导致数据二义性(发送的数据和对方获取到的数据不同)
大小端的判断方法:
union
{
int a=1;
uchar b;
}
if(b==1)
{
//小端
}
if(b==0)
{
//大端
}
解决方法:
通信时,双方不管自己的主机字节序是什么,网络通信中的数据全部采用大端字节序格式
网络通信是两端通信,其中一端叫客户端,另一端叫服务端;
通信双方中主动发起请求的,叫做客户端(必须知道服务端在哪里)
通信双方中被动接收请求的,叫做服务端(必须告诉客户端自己在哪里,通常都是固定地址)
传输层有两个协议:TCP/UDP—需要用户告诉操作系统,到底传输层应该用哪一个
UDP(用户数据报协议):无连接,不可靠,(只需要知道对端地址,就可以发送数据)面向数据报
TDP(传输控制协议):面向连接,可靠传输,面向字节流
UDP传输性能高,但是不保证可靠传输,适用于对数据传输实时的程序,对数据安全不太在意,比如视频传输
TCP传输性能较低,但是保证可靠传输,适用于文件之类的传输,对数据的安全极致在意