网络编程
一、网络基础
1、需要网络通信的原因
(1)进程间通信解决的是本机内通信
(2)网络通信解决的是任意不同机器通信
2、实现网络通信需要的支持
(1)通信设备
1)网卡:PC机自带;
2)路由器,交换机;
3)光纤、电缆、基站。
(2)通信协议
1)操作系统自带协议栈(Linux的特点:丰富的网络协议);
2)裸机开发需要独立的协议栈。
(3)简单网络通信只需要学会使用系统API
3、tcp/ip协议栈
(1)通信协议:双方在做通信之前约定好的动作和传输数据的格式,定义通信标准。
通信协议的作用:让多台机器能够通信。
(2)OSI七层网络模型、Linux四层网络模型
1)协议栈分层好处:
各层之间是独立的;
灵活性好;
结构上可分割开;
易于实现和维护;
能促进标准化工作。
2)物理层:通信介质的信号到数字信号(二进制0101)转换
3)数据链接层:局域网之间计算机通信,通过mac地址(物理网卡)通信
4)网络层:IP地址,路由(通过公司ip来访问全世界)
5)传输层:tcp/udp,tcp(可靠,速度慢),udp(不可靠,速度快),端口(让不同的应用程序,同时使用网络)
6)会话层:控制发包的数据
7)表示层:文件格式
8)应用层:应用程序使用
9)协议栈实现数据的压缩加密和解压解密
(3)IP地址
1)ip地址:实际上是32位二进制数(01100100.00000100.00000101.00000110)100.4.5.6
2)公网ip(广域网通信)
a类:1.0.0.1~126.255.255.254
b类:128.0.0.1~191.255.255.254
c类:192.0.0.1~223.255.255.254
d类:224.0.0.1~239.255.255.254组播,VRRP协议,keepalive高可用
e类:240.0.0.1~255.255.255.254科研
3)私网ip(局域网通信)
A:10.0.0.0~10.255.255.255
B:172.16.0.0~172.31.255.255
C:192.168.0.0~192.168.255.255
4)解决IP地址荒:
ipv4升级到ipv6;
网络地址转换NAT(Network Address Translation):将内网ip转为公网ip。
5)子网掩码作用:
决定一个网段的大小(可用ip的数量);
同一个网段的ip地址,才能直接相互通信,不同网段的ip地址,需要路由器才能相互通信!
6)DNS协议:域名解析
把域名解析成ip地址。
7)ARP协议:
把ip地址解析成mac地址(物理地址,全球唯一)(局域网通信必须通过MAC地址)
(4)TCP协议:传输控制协议
1)特点:面向连接、可靠的字节流传输
2)TCP的报文段格式:
端口号:
端口号的作用:确定和机器上哪个应用程序通信。
特殊端口号:
端口:21
服务:FTP
说明:FTP服务器所开放的端口,同于上传、下载。最常见的攻击者用于寻找打开anonymous的FTP服务器的方法。这些服务器带有可读写的目录。木马Doly Trojan、Fore、Invisible FTP、WebEx、WinCrash和Blade Runner所开放的端口。
端口:22
服务:Ssh
说明:PcAnywhere建立的TCP和这一端口的连接可能是为了寻找ssh。这一服务有许多弱点,如果配置成特定的模式,许多使用RSAREF库的版本就会有不少的漏洞存在。
端口:53
服务:Domain Name Server(DNS)
说明:DNS服务器所开放的端口,入侵者可能是试图进行区域传递(TCP),欺骗DNS(UDP)或隐藏其他的通信。因此防火墙常常过滤或记录此端口。
端口:80
服务:HTTP
说明:用于网页浏览。木马Executor开放此端口。
TCP标识位:
SYN:建立链接
ACK:回应标识
FIN:断开链接
PSH:数据包
URG:紧急指针
RST:重置(重传)
检验方式:
奇偶校验Parity Check
bcc异或校验法(block check character)
crc循环冗余校验(Cyclic Redundancy Check)
mds校验和数字签名
海明码校验
数据大小:
局域网的链路层传输数据的最大长度是1518bit,包括帧的头尾部长度18bit(头14+尾4),IP头部长度为20bit,TCP头尾部长度为20bit,UDP头尾部长度为8bit
TCP在局域网中传输数据的最长长度=1518-18-20-20=1460bit
广域网传输不限定大小,因为超过限定大小,会进行拆包发送
3)连接
建立连接:三次握手
记录对方的ip和端口,正式通信时会自动地使用记录的ip和端口
断开连接:四次挥手
三次握手和四次挥手原因:网络通信是全双工的
dos、ddos攻击
4)保证可靠有序的传输:
三次握手建立连接;
应答机制,就是将数据发送给对方后,对方必须应答是否发送成功;
使用“滑动窗口”机制,根据网络的好坏,控制发送的分组数据的大小。
(5)UDP协议:用户数据包协议
1)无连接不可靠传输
2)UDP的报文格式:
局域网:UDP传输数据的最长长度=1518-18-20-8=1472bit
广域网:用UDP协议发送时,用sendto函数最大能发送数据的长度为:65535-IP头(20)-UDP头(8)=65507字节,用sendto函数发送数据时,如果发送数据长度大于该值,则函数会返回错误
3)协议特点:
无连接的:发送数据之前不需要建立连接,减少了开销和发送数据之前的延时。
尽最大努力交付:不保证可靠的交付,主机不需要维持复杂的链接状态表。
面向报文的:发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界。
没有拥堵控制。
支持一对一、多对一和多对多的交互通信。
(6)TCP和UDP的对比:
二、网络编程
1、C/S和B/S
(1)C/S架构
1)优点:
由于客户端实现与服务器的直接相连,没有中间环节,因此响应速度快;
操作界面漂亮、形式多样,可以充分满足客户自身的个性化要求;
C/S结构的管理信息系统具有较强的事务处理能力,能实现复杂的业务流程。
2)缺点:
需要专门的客户端安装程序,分布功能强,针对点多面广且不具备网络条件的用户群体,不能够实现快速部署安装和配置;
兼容性差,对于不同的开发工具,具有较大的局限性,若采用不同工具,需要重新改写程序;
开发成本较高,需要具有一定专业水准的技术人员才能完成。
(2)B/S结构
1)优点:
具有分布性特点,可以随时随地进行查询、浏览等业务处理;
业务扩展简单方便,通过增加网页即可增加服务器功能;
维护简单方便,只需要改变网页,即可实现所有用户的同步更新;
开发简单,共享性强。
2)缺点:
表现要达到CS程序的程度需要花费不少精力;
在速度和安全性上需要花费巨大的设计成本,这是BS架构的最大问题。
2、套接字
作用:传输层的文件描述符
3、TCP的C/S实现
循环服务器模型:
(1)TCP服务器实现过程:
1)创建套接字:socket函数
定义:int socket(int domain, int type, int protocol);
1) 绑定ip地址和端口号:bind函数
定义:int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
3)无法绑定:使用getsocket函数
4)将套接字文件描述符,从主动变为被动文件描述符(做监听准备):listen函数:
主动描述符可以主动地向对方发送数据;
被动描述符只能被动地等别人主动向你发数据,然后再回答数据,不能主动地发送数据。
5)被动监听客户的连接并响应:accept函数
6)服务器调用read(recv)和write(send),收发数据,实现与客户的通信:
send函数;
recv函数。
7)调用close或者shutdown关闭TCP的连接
(2)TCP客户端的实现过程
1)用socket创建套接字文件,指定使用TCP协议
2)调用connect主动向服务器发起三次握手,进行连接
3)调用read(recv)和write(send)收发数据
4)调用close或者shutdown关闭连接
例:
server.c:
client.c: