LINUX网络编程--网络的发展与通信
一.网络的发展
二十世纪五十年代,美苏进入冷战时期,由于安全问题,美国担心传统的通讯系统如果遇到核心枢纽被摧毁的情况,整个通讯网络就会瘫痪,于是DARPA开始研发计算机通信。
二.网络基础概念
1.DNS解析:PC 先通过 DNS 服务器(通常由路由器自动分配,如 114.114.114.114)将 www.baidu.com解析为IP地址1832.172.17;
2.判断网络位置:
PC通过子网掩码(255.255.255.0)计算目标IP的网络号; 本地IP(192.168.0.150)的网络号:192.168.0.0(与子网掩码按位与运算); 百度IP(192.2.172.17)的网络号:183.2.172.0(与子网掩码按位与运算); 两者网络号不同,说明目标在外网,需要通过默认网关(192.168.0.1)转发。
3.数据转发
PC 将数据发送到网关(192.168.0.1,通常是家用路由器)。
网关通过其公网 IP(由运营商分配)将数据转发到互联网,经过多级路由最终到达百度服务器。
4.响应返回:百度服务器的响应按原路返回,经网关转发到你的IP ;
TCP/IP协议栈:
应用层 //你好 ;
表示层 //压缩 加密 ;
会话层 //管理一次通信过程 ;
传输层 //传输过程中网络信息 控制 ;
网络层 //网络间如何通信 ;
数据链路层 //01组合的数据帧 ;
物理层 //物理通信 电气特性 ;
osi模型 (开放的系统互联模型)
7.应用层 //
6.表示层 //加密传输的需要 --- 数据的格式化
加密解密 gzip
5.会话层 //连接状态 --长连接 ,短链接,连接的质量问题
网络断开,连接状态,keep-close keep-alive
//登录某个网站:
4.传输层 //传输控制协议
tcp udp 协议 文件 视频,音频
可靠传输 &
tcp:
下载文件,传输文件。
udp:
音频,视频,游戏开黑
3.网路层 ----- 数据包 (packet)
ip NAT
//怎么找到 对方
2.链路层 (封装成帧 + 差错控制)
交换机 (全双工,实时的工作的。)
数据的格式化 (大量数据交互时,字节为单位,字节大小端)
帧
校验
1.物理层 ----- bit流
100Mb/8 Gbits 100MB 同轴电缆
(
电气特性: 0,1高低电平特性
物理特性: 0,1
规程特性: 超5类 ,超6类,远距离传输
)
说明:
1.物理层:
主要定义物理设备标准,
如:网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。
主要作用是: [传输比特流]
(就是由1、0转化为电流强弱来进行传输,到达目的地后再转化为1、0,也就是我们常说的数模转换与模数转换)。
这一层的数据叫做"比特"(bit)。
2.数据链路层:
定义了如何让格式化数据以帧为单位进行传输,以及如何让控制对物理介质的访问。
这一层通常还提供错误检测和纠正,以确保数据的可靠传输。
如:串口通信中使用到的115200、8、N、1
这一层传输的数据:帧数据 (按到一定格式组织起来的一组数据)
3.网络层:(路由器)
在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。
Internet的发展使得从世界各站点访问信息的用户数大大增加,而网络层正是管理这种连接的层。
如:常见的路由器,就是这在一层工作。
路由 ---选择路径?
这一层传递的数据:数据段(包)
4.传输层:transmit control
定义了一些传输数据的协议和端口号(WWW端口80等),
如:
TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),
UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,
如QQ聊天数据就是通过这种方式传输的)。
主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。
常常把这一层数据叫做段。
5.会话层:
通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。
主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)。
如:上网,看视频。刷新 --- 好了!youku视频
www.youku.com/video1<----会话----> 优酷服务器。
6.表示层:
可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。
例如,PC程序与另一台计算机进行通信,其中一台计算机使用扩展二一十进制交换码(EBCDIC),
而另一台则使用美国信息交换标准码(ASCII)来表示相同的字符。如有必要,表示层会通过使
用一种通格式来实现多种数据格式之间的转换。
如:日本人 --- qq_日语
表示层:
规定 用怎么形式表示信息?
7.应用层:
是最靠近用户的OSI层。
这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务。
参见:<osi七层网络模型.png>
osi是一个参考模型(教学模型)
实际用到网络层次 --- tcp/ip模型
网络操作相关函数
提供 一个 网络操作的特殊文件
socket //1.socket是网络通信的特殊文件
//2.socket也是linux系统提供的一个编程接口
// 通过这个编程接口,就可以使用到linux的网络功能
socket函数#include <sys/types.h> /* See NOTES */#include <sys/socket.h>int socket(int domain, int type, int protocol);功能:创建了通信的一端 返回文件描述符 参数:@domain //域 -- 范围 //ip地址 // ipv4 32位数据 // ipv6 128位 //本地套接字 //protocol //协议AF_INET@type //用来说明socket这种网络通信的文件的类型 SOCK_STREAM //流式套接字 ---tcp Provides sequenced, reliable, two-way(双工), connection-based byte streams. An out-of-band data transmission mechanism may be supported.SOCK_DGRAM //数据报套接字 ---udpSupports datagrams (connectionless, unreliable messages of a fixed maximumlength).@protocol //协议 0 //linux系统上 SOCK_STREAM --- TCP//类linux系统行 // SOCK_DGRAM --- UDP返回值:成功 返回socket对应的fd失败 -1 && errno被设置 //perror
协议:
传输层的协议
tcp协议
udp协议
[重点的两个协议]:
TCP(transmision control protocol):(类似 打电话)---可靠(1.连接 2.可靠传输 3.字节流)
特点:
a.面向连接(就是在进行通信之前,必须建立好一条逻辑上的通路)
b.提供可靠传输(四个"无",无丢失,无失序,无差错,无重复)
建立连接:
tcp三次握手 目的:建立连接
client ------------------ server
1 -- 我要通话 --> 1 //连接的请求
2 <--嗯,我知道了,你可以-- //对方接听电话 喂
3 -- 嗯,好的 --> //喂
可靠的连接。 类似,打电话.
应用场合:
(1). 对可靠性要求较高场合
(2). QQ微信等 软件的登录时
UDP(User datagram Protocol):(类似 生活中的广播) (1.不可靠, 2.无连接 3.数据报)
特点:
不提供可靠传输,
在数据发送时,不需要建立连接
应用:
(1).小数据,但是对速度要求较高
(QQ.及时文本信息,语音等),实时性要求较高场合!
(2).广播,组播 //电子教师(vnc --- 广播)
(3).无线网的传输 //udp
TCP(即传输控制协议):
是一种面向连接的传输层协议,它能提供高可靠性通信(即数
据无误、数据无丢失、数据无失序、数据无重复到达的通信)
适用情况:
1. 适合于对传输质量要求较高,以及传输大量数据的通信。
2. 在需要可靠数据传输的场合,通常使用TCP协议
3. MSN/QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议
UDP(User Datagram Protocol)用户数据报协议,是不
可靠的无连接的协议。在数据发送前,因为不需要进行
连接,所以可以进行高效率的数据传输。
适用情况:
1. 发送小尺寸数据(如对DNS服务器进行IP地址查询时)
2. 在接收到数据,给出应答较困难的网络中使用UDP。(如:无
线网络)
3. 适合于广播/组播式通信中。
4. MSN/QQ/Skype等即时通讯软件的点对点文本通讯以及音视频通
讯通常采用UDP协议
5. 流媒体、VOD、VoIP、IPTV等网络多媒体服务中通常采用UDP
方式进行实时数据传输
tcp cs模型:
tcp通信 类似 打电话
tcp客户端: //角色 --- 主动的一方
socket //买了个电话
bind(可选) //买了sim卡
connect //拨打电话
----------------------
write //通信
read
close //挂机
tcp服务器://角色 --- 被动的一方
socket //买了个电话
bind //买了sim卡
listen //监听--待机
accept //接听
-------------------
read //通信
write
close //挂机
connect int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);功能:通过socket链接到指定的地址上 参数:@sockfd --- socket创建的fd@addr --- 标识网络中一个进程对应的地址 ip 确定一台主机 端口号 用来标识一个网络通信的进程 ip+端口号 struct sockaddr *addr//不是通用的 socket 不同的通信范围 不同通信域 都有自己特定的结构体 ipv4struct 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 -- ip地址*/};/* Internet address. */struct in_addr {in_addr_t s_addr; /* address in network byte order */};in_addr_t inet_addr(const char *cp);@addrlen 说明 第二个参数的 地址类型的大小
返回值:成功 0失败 -1&&errno
端口号:16位的整型数据 0~1023 //1024 ---知名端口号 //http -- 80 1024~50000 //特定端口号 50000~ //临时分配的端口号 大小端 0x12345678发送 --- 转换 --- 网络字节序 (大端)接收 --- 根据主机的大小端转换
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
h -- host
to -- 到
n --network
l -- long //处理4字节数据
s -- short //处理2字节数据
in_addr_t inet_addr(const char *cp);
cp 表示要用的ip地址的字符串 //点分十进制
"192.168.0.150"
返回:网络字节序形式的ip地址的32位数值
服务器端
ocket
bind //
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
int bind (int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:给sockfd 绑定一个地址信息(ip+port)
参数:@sockfd --- 要操作的socket @addr --- 要绑定的地址信息 @addrlen --- 地址信息对应的大小
返回值:成功 0失败 -1&&errno#include <sys/types.h> /* See NOTES */#include <sys/socket.h>int listen(int sockfd, int backlog);功能:将sockfd对应的socket设置为监听套接字 //这个套接字 负责看 有没有客户端,发送连接请求 //有了放等待队列中参数:@sockfd ---socket 的fd@backlog --- 等待队列的长度
返回值:成功 0失败 -1&&errno
accept函数
int accept (int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:从监听的socket中提取连接请求,完成连接(三次握手)返回已连接的一个新socket
参数:@sockfd --- 监听的socket的fd@addr --- 用来存放,客户端的地址信息 @addrlen --- 值结果参数 注意: 必须初始化 ,初始成 addr对应sockaddr_in 类型的大小
返回值:成功 返回 已连接的socket的fd //专门用于后面通信的 失败 -1 &&errno
char *inet_ntoa(struct in_addr in);
//将网络字节序形式的ip地址 转换为 点分十进制格式的 ip 字符串