网络基础1;
网络划分:局域网-》城域网-》广域网
1. ip地址:在网络中唯一标识一台主机---uint32位的整数(ipv4)
在网络通信中的每一条数据中都应该包含有目的IP地址+源ip地址
IP地址无符号32位的整数决定了ip地址的个数:不到43亿--不够用
DHCP--动态地址分配( 谁上网给谁分配ip地址)
NAT---网络地址转换技术:将数据中源ip地址,转化位中间转发设备的ip地址-数据按照什么路径出去就应该安照什么路径回来
ipv6:uint8_t iP[16]----并不向前兼容ipv4--导致ipv6的推广使用特别慢。
2. 端口号:在一台主机上标识一个进程--当计算机收到一个数据之后能够通过数据中的目的端口信息来决定
这个数据应该交给那个进程处理
每条网络中的数据都应该包含有:源端口+目的端口
uint16_t 端口号:范围0~65535;
特性:一个端口号只能被一个进程占用;一个进程可以使用多个端口号
3.协议:通信双方数据格式的约定
协议分层:就是在通信环境中协议的封装,使通信环境层次更加清晰,更容易实现标准化;更加容易使用;实现网络互联;
OSI七层参考模型:应用层-》表示层-》会话层-》传输层-》网络层-》链路层-》物理层
TCP/IP五层模型:应用层-》传输层-》网络层-》链路层-》物理层
应用层:负责应用程序之间的数据沟通;HTTP/FTP/DNS/DHCP/SMTP
传输层:负责端与端之间的数据传输;tcp/udp协议
网络层:负责地址管理与路由选择;ip协议,设备;路由器
链路层:负责相邻设备之间数据传输;以太网(ether)协议;max(网卡的硬件地址,无符号,48位,16进制)
物理层:负责光电信号的传输;以太网协议;典型设备;集线器
网络通信数据传输的处理流程
《用户数据》
《应用协议》-《用户数据》
《传输协议》-《应用协议》- 《用户数据》 数据段
《网络层协议》-《传输协议》-《应用协议》- 《用户数据》 数据报
《以太头》-《网络层协议》-《传输协议》-《应用协议》- 《用户数据》-《以太尾》 数据帧
数据发送方:数据封装
数据接受方:数据分用
3.网络字节序:
字节序:cpu在内存中对数据的存取顺序----针对存储大小大于大于一个字节的数据类型
主机字节序:一个主机的大小端字节序取决于cpu架构---X86,免费授权的架构;MIPS架构(大端字节序)
在网络通信中(两台不同主机之间的通信)--通信双方并不知道对方的主机字节序
小端:低地址存低位
大端:低地址存高位
主机字节序大小端的识别:union{int a=1;ucharb;}b==1-- 小端 b=0---大端
int a=1; uchar*b=(uchar*)&a b[0]=1小端
在通信过程中,通信双方有可能因为主机字节序不同儿导致数据二义性(发送的数据,和对方获取得到的数据不同)
解决方法:通信时,双方不管自己主机字节序是什么,网络通信中的数据全部采用大端字节序格式,在网络通信中使用大端字节序
作为网络字节序标准进行通信
4.网络通信是两端通信;其中一端叫客户端;另一端就叫服务端
通信双方中主动发起请求的这一方是客户端---必须知道服务端在哪里
通信双方中被动接受请求的这一方是服务端---必须告诉客户端自己在哪里
传输层有两个协议:TCP/UDP---需要用户告诉操作系统,到底传输层应该用哪一个
udp(用户数据报协议):无连接,不可靠,面向数据报 传输速度快,性能高,但是不保证可靠传输
应用于实时性要求极高,安全性不是很高---视频传输
tcp (传输控制协议):面向连接。可靠传输,面向字节流, 传输速度较慢,性能较低,但是保证可靠传输
安全性要求极高----文件传输
5.套接字编程:socket编程
基于UDP协议的socket客户端与服务端通信编程
-1. int socket(int domain, int type, int protocol);// 创建套接字
domain:地址域 AF_INET---IPV4地址域
type:套接字类型
SOCK_STREAM 流式套接字
SOCK_DGRAM 数据报套接字
protocol:传输层协议类型
0--默认
IPPROTO_TCP
IPPROTO_UDP
-2. int bind(int sockfd,const sockaddr*addr,socklen_t addrlen);//为套接字绑定地址信息
-3. ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
-4.ssize_t sendto(int sockfd, void *buf, size_t len, int flags, struct sockaddr *dest_addr, socklen_t len);
-5. int close(int fd);//关闭套接字