一、计算机网络
1、什么是计算机网络
计算机网络是指将地理位置不同的具有独立功能的多台计算机
及其外部设备,通过通信线路连结起来,在网络操作系统,网络管理软件
及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统
2、计算机网络的功能
数据共享
资源共享
提高系统的可靠性
分布式网络处理和负载均衡
3、计算机网络的组成
通信子网:网卡、线缆、集线器、中继器、
交换机:交换计算机与计算机的数据
路由器:网络和网络之间的通信
资源子网:网络中的计算机、打印机、电话等可以提供服务的资源
计算机网络软件:
协议软件:它规定计算机之间通信的规则
TCP/IP协议簇,开放式系统互联。
网络通信软件:网络中实现计算机与设备之间通信的软件。(网卡驱动)
网络管理软件:防火墙 SELinux
网络应用软件:浏览器
网络操作系统:可以提供网络服务的计算机操作系统
4、计算机网络的分类
1、按网络作用范围划分:局域网、城域网、广域网
2、按网络技术划分:广播式网络,点到点网络
3、传输介质划分:有限网,无线网、微波通信、卫星通信
5、网络拓扑结构
星型、树型、总线型、环型、网状型
6、计算机网络的发展过程
1、一计算机为中心的联机
2、分组交换网络的诞生
3、网络体系结构与协议标准化
20世纪80年代ISO组织开放式系统互联参考模型。(OSI参考模型)
但是这个模型照顾到了各方利益,过于庞大
目前所使用的是一系列协议的集合简称TCP/IP协议簇 也叫TCP/IP模型
目前所有计算机系统都按照这个协议通信,所以不同的操作系统之间才可以进行网络通信
C/C++/Java/Python->Windows->socket->tcp/ip<->tcp/ip->socket->Linux->C/C++
4、高速计算机网络(5G)
7、网卡
它负责将数据发送到网络上,也负责从网络获取数据,每个网卡上都有一个独一无二的MAC地址
8、OSI参考模型与TCP/IP参考模型
网络协议是为这个网络数据交换而指定的规则、约束、标准,一个功能完备的计算机网络需要制定一整套复杂的协议集
目前的网络协议是按照网络层次结构模型与各协议的集合称为网络体系结构
OSI七层从下到上:
物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
tcp/ip从下到上
物理层:负责通信网络的收发数据包
网络层:选择、流量控制、网络拥塞、IP协议是该层的核心
传输层:机器之间建立用于会话的端到端连接(用于数据传输),该层的TCP/UDP
应用层:主要为用户提供针对性服务,这层的代表的协议:HTTP,SMTP,SNMP,TELNET
OSI TCP
物理层
数据链路层 物理层
传输层 传输层
网络层 网络层
会话层
表示层 应用层
应用层
9、在计算机网络中每一台计算机都必须有一个唯一的标识MAC地址不容易记忆,它就是IP地址,目前在计算机中以点分十进制表示
4个不超过255的整数,在程序中它就是四字节的整数 ipv4
IP地址的分类
A类:第一个二进制必须是0
0.0.0.0 -127.255.255.255
B类:前两位二进制必须是10
128.0.0.0- 191.255.255.255
C类:前三位二进制必须是110
192.0.0.0 - 223.255.255.255
D类:前四位二进制必须是1110
224.0.0.0 - 239.255.255.255
E类:前四位二进制必须是1111
240.0.0.0 - 255.255.255.255
10、公有IP和私有IP
公有IP:在网络服务提供商登记过的IP叫公有IP
私有IP:由一些公司所组织自己分配,不能在网络中公开直接访问
11、子网掩码
四个不超过255的整数,也是点分十进制表示
网络地址 = IP地址按位与子网掩码
只有在同一子网内的IP地址才能直接进行通信
不再子网内就需要经过路由器
12、网关地址
负责子网出口的计算机,一般由路由器担任(有路由功能的计算机)
13、端口号
ip地址决定与哪一台计算机通信,而端口号决定我们与计算机上的哪一个进程通信
1-1024已经被操作系统预定完了,因此在编程时一般要使用1024以上
http:80
ftp:21
ssh:22
telnet:23
二、网络通信基本概念
1、TCP和UDP的区别
TCP是传输控制协议,面向连接的服务(打电话),安全可靠(三次握手,响应+重传、四次挥手)速度相对较慢,
一般应用于对安全性和完整性有严格要求的场景:FTP、SMTP、HTTP
三次握手:
A要知道两件事,A能到B B也能到A
B也要知道,A能到B,B也能到A
四次挥手:
目的是保证关闭前发送完所有未发送的数据(应用层已经交给底层了,但底层还没有完全发送出去)。
UDP是用户数据报文协议,面向无连接服务(发短信),不保证安全可靠,但是大多数情况下可靠 速度相对较快
一般应用于流媒体(在线的视频,音频)
2、消息流
应用层->表示层->会话层->网络层->传输层->数据链路层->物理层->数据链路层->传输层->网络层->会话层->应用层
3、消息包
当socket接受到要发送的数据时,会先把数据进行拆分成BIT流,然后组合(防丢失)成数据包(可能会丢包)
三、套接字
socket:是一种接口机制,可以让程序无论使用什么端口、协议,都可以从socket进出数据
它负责进程与协议之间的连接
1、编程模式
点对点(p2p):一对一通信
客户端/服务器(C/S):一对多通信
2、创建socket
int socket(int domain, int type, int protocol);
功能:创建socket描述符,可以把socket当作文件来看待,发送数据就是写文件,接受数据就是读文件
domain:
AF_UNIX, AF_LOCAL,AF_FILE 本地通信(进程间通信)
AF_INET 基于32位IP地址通信 IPV4
AF_INET6 基于128位IP地址通信
AF_IPX IPX - Novell 协议
AF_NETLINK Kernel user interface device netlink(7)
AF_X25 ITU-T X.25 / ISO-8208 协议 x25(7)
AF_AX25 Amateur radio AX.25协议
AF_ATMPVC Access to raw ATM PVCs
AF_APPLETALK Appletalk 协议
AF_PACKET Low level packet interface packet(7)
type:通信协议
SOCK_STREAM 数据流协议,TCP
SOCK_DGRAM 数据报协议,UDP
SOCK_SEQPACKET
SOCK_RDM
SOCK_PACKET
protocol:特别通信协议,一般给0即可
返回值是socket描述符,类似文件描述符
3、通信地址
注意:函数接口定义的是sockaddr,而实际提供的是sockaddr_un或sockaddr_in
struct sockaddr {
sa_family_t sa_family;
char sa_data[14];
}
struct sockaddr_un{
_SOCKADDR_COMMON(sun);//地址类型 参看domain
char sun_path[108];//socket文件路径
}
struct sockaddr_in{
_SOCKADDR_COMMON(sun);
in_port sin_port; //端口号 大端字节序
struct in_addr sin_addr;//ip地址 大端四字节整数
}
struct in_addr{
in_addr_t s_addr;
}
4、绑定
socket描述符与物理通信载体(网卡或文件)绑定在一起
int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
sockfd:socket描述符,socket函数的返回值
struct sockaddr *addr:通信地址结构体,实际给的是struct sockaddr_un/struct sockaddr_in 需要强制类型转换
socklen_t addrlen:通信地址结构体类型的字节数,使用sizeof计算
5、连接
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
sockfd:socket描述符
addr:通信目标地址
addlen
返回值:在不同的编程模型下,返回值意义不同,
本地通信:成功返回0 失败返回-1
5、数据接受与发送 read/write
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
recv / send与 read/write 功能一样,flags多了是否阻塞的功能(0阻塞,1不阻塞)
6、关闭套接字 close
如果是网络通信,端口号并不会立即回收,大概会占用三分钟左右
7、字节序转换
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
功能:把32位本机字节序转换成32位网络字节序
uint16_t htons(uint16_t hostshort);
功能:把16位本机字节序转换成16位网络字节序
uint32_t ntohl(uint32_t netlong);
功能:把32位网络字节序转换成32位本机字节序
uint16_t ntohs(uint16_t netshort);
功能:把16位网络字节序转换成16位本机字节序
8、ip地址转换
int inet_aton(const char *cp, struct in_addr *inp);
功能:把点分十进制的ip地址转换成32位无符号整数,使用结构体指针获取
in_addr_t inet_addr(const char *cp);
功能:把点分十进制的ip地址转换成32位无符号整数,使用返回值直接返回
char *inet_ntoa(struct in_addr in);
功能:32位无符号整数转换成点分十进制的ip地址
9、本地通信
进程A 进程B
创建socket AF_LOCAL 创建套接字
准备地址(sockaddr_un) 准备地址
绑定进程A的socket地址 链接(connect,连接进程A的地址)
接受数据 发送数据
关闭套接字 关闭套接字
四、基于TCP的C/S模型
int listen(int sockfd, int backlog);
功能:设置等待链接的最大数量
sockfd:被监听的的sock描述符
backlog:等待链接的最大数量(排队的最大数量)
成功返回0,失败返回-1
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:等待链接
sockfd:链接
addr:获取连接的地址
addrlen:设置链接地址结构体的长度
返回值:专门用于通信的描述符
编程模型
Server 客户端
创建socket套接字 创建套接字
准备地址(sockaddr_in,本机地址) 准备地址(服务器地址)
绑定(bind)
设置监听(listen)
等待链接(accept,fork) 链接
接受请求 recv/read 发送请求
响应请求 send/write 接受响应
关闭(close) 关闭
五、基于UDP的C/S模型
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
功能:发送,UDP协议专用的数据发送函数
sockfd:socket描述符
buf:带发送的的缓冲区首地址
len:待发送的数据字节数
flags:0阻塞,1不阻塞
dest_addr:目标计算机的地址
addrlen:地址结构体的字节数
返回值:成功发送的字节数
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
功能:接收,UDP协议专用的数据接受函数
sockfd:socket描述符
buf:数据存储位置
len:最大接收字节数
flags:0阻塞,1不阻塞
src_addr:获取发送者的地址
addrlen:设置结构体字节数
返回值:成功接受的字节数
编程模型
server client
创建套接字 创建套接字
准备本机地址 准备目标机地址
绑定bind(sockfd+addr) 。。。
接收请求recvfrom 发送请求
响应请求sendto 接受响应
关闭套接字 关闭套接字
注意:从服务器到客户端返回的路线是UDP协议自己设计的
七、windows下网络编程
一般的软件都是Linux/UNIX系统作为服务器,windows作为客户端
windows下的socket便车功能的接口与Linux基本一致函数声明在winsock2.h中
int WSAStartup(WORD,LPWSADATA)
功能:初始化网络版库
WORD:设置网络库版本
MAKEWORD(1,2)第一个是主版本号第二个是副版本号
LPWSADATA:WSADATA数据结构指针,用来获取网络的相关信息