网络编程学习篇(一)
一、计算机网络概述
1.1 计算机网络发展简史
- 最早的广域网是基于电路交换的网络,通过建立物理通路来实现通信双方的连接,这种方式不适合突发式的计算机数据传输。
1.1.3 计算机网络的要求
- 计算机网络设计要求包括:简单结构、可靠传输、连接不同种类计算机、网络节点同等重要性、必须具备冗余路由。
1.1.4 分组交换
- 分组交换是一种通过路由选择传送数据的方式,每个分组包含首部和数据段,这种方式提高了传输效率。
1.1.6 因特网发展史
- 因特网的发展从单个ARPANET开始,到1983年TCP/IP协议成为其标准协议,逐步发展成为现在的互联网。
1.2 TCP/IP 协议简介
- TCP/IP协议是一套能使不同计算机之间互联的通信协议族,它采用分层的方式组织,每一层为上一层提供服务。
1.2.2 IP 协议简介
- IP协议是一种无连接、不保证可靠传输的协议,它仅提供尽力而为的传输服务,并且每个IP数据包都包含源地址和目的地址。
1.2.3 TCP 协议简介
- TCP是一种面向连接的、可靠的传输层通信协议,它通过建立连接、数据传输、释放连接的三次握手过程,确保数据的可靠传输。
1.2.4 UDP 协议简介
- UDP是一种面向无连接的传输层通信协议,它不保证数据包顺序、没有错误检测和重传机制,适用于快速传输和简单查询应答服务。
1.3 MAC 地址、IP 地址、Netmask、端口
- MAC地址:网络设备的唯一标识,由48位二进制数组成。
- IP地址:Internet上的主机编址方式,由32位二进制数组成,分为网络ID和主机ID。
- 子网掩码:用于区分IP地址中的网络ID和主机ID。
- 端口:用于区分系统中的多个进程,每个端口对应一个进程。
二、UDP 编程
2.1 编程准备-字节序、地址转换
- 字节序:数据存储顺序,分为小端格式和大端格式。
- 网络字节序:网络协议指定的通讯字节序为大端。
- 字节序转换函数:
htonl
、htons
、ntohl
、ntohs
用于主机字节序与网络字节序之间的转换。 - 地址转换函数:
inet_pton
、inet_ntop
用于IP地址字符串与整型数据之间的转换。
2.2 UDP 介绍、编程流程
- UDP协议:无连接的用户数据报协议,适用于不需要可靠传输的应用。
- socket接口:网络通信的进程间通信机制,socket是一种文件描述符。
2.3 UDP 编程-创建套接字
- 创建套接字:使用
socket
函数创建用于网络通信的socket套接字。
2.4 UDP 编程-发送、绑定、接收数据
- 发送数据:使用
sendto
函数向指定地址发送UDP数据。 - 绑定:使用
bind
函数将IP地址和端口与套接字关联。 - 接收数据:使用
recvfrom
函数接收UDP数据。
2.5 UDP 编程-client、server
- 客户端和服务器都可以发送和接收数据,但在网络编程中,通常将提供服务的一方称为服务器,接受服务的一方称为客户端。
三、UDP 编程-TFTP、广播、多播
3.1 TFTP 简介、通信过程
- TFTP:简单文件传送协议,基于UDP协议实现,用于小文件传输。
3.2 TFTP 协议分析
- TFTP通信过程:包括服务器在69号端口等待请求、使用临时端口与客户端通信、数据包编号变化、数据传输确认等步骤。
3.3 练习—TFTP 客户端
- TFTP客户端:构造请求报文,与服务器通信,接收数据直至传输结束。
3.4 UDP 广播
- 广播:一台主机向同一子网内所有主机发送数据的方式,只能通过UDP或原始IP实现。
3.5 UDP 多播
- 多播:数据在同一分组内收发,可用于广域网,使用D类IP地址。
四、TCP 网络编程
4.1 TCP 介绍、编程流程
- TCP:面向连接的流式协议,提供可靠传输,出错重传,每接收数据需确认。
4.2 TCP 编程-socket
- TCP套接字创建:与UDP类似,但用于面向连接的服务。
4.3 TCP 客户端-connect、send、recv
- connect:主动与服务器建立连接。
- send:发送数据到已连接的服务器。
- recv:接收服务器发送的数据。
4.4 TCP 服务器-bind、listen、accept
- bind:将套接字绑定到特定的IP地址和端口。
- listen:使套接字变为被动监听状态,等待连接。
- accept:接受客户端的连接请求,创建新的套接字处理连接。
4.5 TCP 编程-close、三次握手、四次挥手
- close:关闭套接字,释放资源。
- 三次握手:建立TCP连接的过程。
- 四次挥手:断开TCP连接的过程。
4.6 TCP 并发服务器
- 多进程并发:通过创建多个进程来处理多个客户端连接。
- 多线程并发:通过创建多个线程来处理多个客户端连接。
4.7 Web 服务器介绍
- Web服务器:使用HTTP协议与浏览器进行信息交流,可处理用户请求,运行脚本和程序。
五、网络通信过程
5.1 网络通信概述
- 网络通信:涉及多线程、多进程开发,C/S、B/S模式开发,需要对网络通信整个过程有整体的掌握。
5.2 通信过程(PC+switch)
- 交换机:扩大网络,连接更多设备,具备转发过滤、学习功能等。
5.3 通信过程(PC+switch+router)
- 路由器:连接逻辑上分开的网络,具备路由功能,选择IP路径。
5.4 通信过程(浏览器跨网访问 Web 服务器)
- 浏览器访问Web服务器:涉及DNS解析、默认网关设置、路由表查找等过程。
六、Linux 防火墙
6.1 认识防火墙
- 防火墙定义:在网络之间执行访问控制策略的设备。
- 防火墙分类:硬件防火墙、软件防火墙。
- 防火墙任务:切割信任与不信任网段,划分服务,分析数据包状态。
6.2 防火墙的一般网络布线示意
- 防火墙网络布线:保护网络不受外部和内部攻击。
6.3 防火墙的使用限制
- 防火墙限制:不能保证网络绝对安全,不能阻止病毒或木马,对内部攻击无能为力。
6.4 Linux 的数据包过滤软件:iptables
- iptables规则:重要性、表格与链的概念,规则查看、清除、定义默认策略等。
七、原始套接字
7.1 TCP、UDP 开发回顾
- 原始套接字:不同于SOCK_STREAM、SOCK_DGRAM的套接字,用于接收本机网卡上所有数据帧,发送自定义数据包。
7.2 原始套接字概述、创建
- 创建原始套接字:使用
socket(PF_PACKET, SOCK_RAW, protocol)
,可以捕获和发送特定协议类型的数据包。
7.3 数据包详解
- 数据包格式:Ethernet、IP、TCP、UDP、ICMP等协议的数据包结构。
7.4 编程实例—分析 MAC 数据包
- 分析MAC数据包:通过原始套接字捕获和分析链路层的数据包。
7.5 sendto 发送数据
- sendto:使用
sendto
函数通过 原始套接字发送数据,需要指定本机网络接口。
八、网络开发工具包-libpcap、libnet
8.1 socket 原始套接字回顾
- 原始套接字:允许开发者发送任意数据包到网络,用于开发网络攻击等特殊软件。
8.2 libpcap 介绍、安装
- Libpcap概念:一个网络数据捕获开发包,提供高层编程接口,隐藏操作系统细节。
- Libpcap安装:通过包管理器安装libpcap库。
8.3 libpcap 开发实例
- Libpcap开发:基本步骤包括打开网络设备、设置过滤规则、捕获数据、关闭网络设备。
8.4 libpcap 练习——网络数据分析器
- 网络数据分析器:使用libpcap开发,用于捕获和分析各种类型的网络数据包。
8.5 Libnet 介绍、安装
- Libnet概念:专业的构造和发送网络数据包的开发工具包,提供高层次的API函数库。
- Libnet安装:安装Libnet库,用于构造和发送网络数据包。
8.6 Libnet 开发实例
- Libnet开发:基本步骤包括数据包内存初始化、构造数据包、发送数据、释放资源。