网络编程之网络基础
基础理论:IP、子网掩码、端口号、字节序、网络基础模型、传输协议
socket:TCP、UDP、广播、组播、抓包工具的使用、协议头、并发服务器
一、认识网络
二、IP地址
1.基本概念
1. IP地址是Internet中主机的标识
2. Internet中的主机要与别的机器通信必须具有一个IP地址
3. IP地址为32位(IPv4)或者128位(IPv6)
NAT:公网转私网、私网转公网
4. IPV4表示形式:常用点分十进制形式,如202.38.64.10,最后都会转换为一个32位的无符号整数。
补充:
2.分类


分类 | 地址范围 | 有效地址范围 | 子网掩码 |
A类 | 0.0.0.0~127.255.255.255 | 1.0.0.1~126.255.255.254 | 255.0.0.0 |
B类 | 128.0.0.0~191.255.255.255 | 128.0.0.1~191.255.255.254 | 255.255.0.0 |
C类 | 192.0.0.0~223.255.255.255 | 192.0.0.1~223.255.255.254 | 255.255.255.0 |
D类 | 224.0.0.0~239.255.255.255 | 224.0.0.1~239.255.255.254 | ----- |
E类 | 240.0.0.0~255.255.255.255 | ------ | ----- |
特殊地址:
1. 0.0.0.0:在服务器中,0.0.0.0指的是本机上的所有IPV4地址,如果一个主机有两个IP地址,192.168.1.1 和 10.1.2.1,并且该主机上的一个服务监听的地址是0.0.0.0,那么通过两个ip地址都能够访问该服务
2. 127.0.0.1:回环地址/环路地址,所有发往该类地址的数据包都应该被loop back。本机通信
3. 网络地址: 每一个网段主机号为0的地址; 如:192.168.50.223--->192.168.50.0 它是网络中的一个特殊地址,不能被分配给任何具体的主机
4. 广播地址: 主机号最大的地址是该网段的广播地址 如:192.168.50.223--》192.168.50.255
5. 全网广播地址:255.255.255.255
ifconfig命令:
3.子网掩码
1. 子网掩码:是一个32位的整数,作用是将某一个IP划分成网络地址和主机地址;长度是和IP地址长度完全一样;
2. 特点:网络号全为1,主机号全为0;
3. 公式:网络地址=IP & MASK(子网掩码)
主机地址= IP& ~MASK
注意: 定长与不定长子网划分
三、网络体系结构
网络采用分而治之的方法设计,将网络的功能划分为不同的模块,以分层的形式有机组合在一起。每层实现不同的功能,其内部实现方法对外部其他层次来说是透明的。
每层向上层提供服务,同时使用下层提供的服务
网络体系结构即指网络的层次结构和每层所使用协议的集合
两类非常重要的体系结构:OSI与TCP/IP
1.OSI模型
2.TCP/IP模型
应用层:应用协议和应用程序的集合
传输层:决定数据交给机器的哪个任务(进程)去处理,通过端口寻址
进程一定有进程号,不一定有端口号,端口号只在进行网络通信才有
网络层:提供设备到设备的传输,可以理解为通过IP寻址机器。
网络接口和物理层:屏蔽硬件差异(驱动),向上层提供统一的操作接口
3.OSI和TCP/IP模型对应关系图
4.常见协议
补充:
5.TCP与UDP
TCP:全双工通信、面向连接、可靠
TCP(即传输控制协议):是一种面向连接的传输层协议,它能提供高可靠性通信(即数据无误、数据无丢失、数据无失序、数据无重复到达的通信)。
高可靠原因: 1. 三次握手、四次挥手
2. 序列号和应答机制
3. 超时,错误重传机制
4. 拥塞控制、流量控制(滑动窗口)
适用场景
适合于对传输质量要求较高的通信
在需要可靠数据传输的场合,通常使用TCP协议
MSN/QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议
UDP:全双工通信、面向无连接、不可靠
UDP(User Datagram Protocol)用户数据报协议,是不可靠的无连接的协议。在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输。
适用场景
发送小尺寸数据(如对DNS服务器进行IP地址查询时)
适合于广播/组播式通信中。
MSN/QQ/Skype等即时通讯软件的点对点文本通讯以及音视频通讯通常采用UDP协议
6. 网络调试命令
(1) ping
测试网络连通性(ICMP)
作为平时网络连通检测使用最多的命令,它的作用主要为:
● 用来检测网络的连通情况和分析网络速度;
● 根据域名得到服务器IP;
● 根据ping返回的TTL值来判断对方所使用的操作系统及数据包经过路由器数量。
字节:数据包大小
时间:响应时间,时间越小证明你链接这个地址的速度越快
TTL:Time To Live,从源到目的,每经过一个路由器,TTL减一,当TTL=0,包丢失
(2) ifconfig
查看网络接口信息
ens33:网卡名称 en:Ethernet s:表示热插拔插槽上的设备 33:插槽编号
lo:回环网卡
格式 | 含义 |
ifconfig 具体网卡名称 | 只显示具体网卡的详细信息(无论是否启用) |
ifconfig -a | 表示显示所有网卡包括没有启动的网卡 |
ifconfig 网卡名称 up/down | 表示开启或关闭网卡 |
ifconfig 网络接口 IP地址[/子网掩码长度] | 新建临时IP地址(添加 一块虚拟网卡) |
ifconfig -s | 查看通讯情况 |
(3) netstat
netstat是控制台命令,是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。Netstat用于显示与IP、TCP、UDP相关的统计数据,一般用于检验本机各端口的网络连接情况。
netstat -a //查看所有网络状态
netstat -at //查看tcp所有网络状态
netstat -au //查看udp所有网络状态
netstat -l //查看处于监听状态的链接
netstat -lt //查看处于监听状态的链接tcp
netstat -lu //查看处于监听状态的链接udp
netstat -lx //查看处于监听状态的链接unixs
四、套接字
1. socket发展
1)1982 - Berkeley Software Distributions 操作系统引入了socket作为本地进程之间通信的接口
2)1986 - Berkeley 扩展了socket 接口,使之支持UNIX 下的TCP/IP 通信
3)现在很多应用 (FTP, Telnet) 都依赖这一接口
2. socket介绍
1、是一个编程接口
2、是一种特殊的文件描述符 (everything in Unix is a file)
3、socket是一种通信机制,并不仅限于TCP/IP协议
4、面向连接 (Transmission Control Protocol - TCP/IP)
5、无连接 (User Datagram Protocol -UDP 和 Inter-network Packet Exchange - IPX)
3. 为什么需要socket?
1.普通的I/O操作过程 :打开文件->读/写操作->关闭文件
2.TCP/IP协议被集成到操作系统的内核中,引入了新型的“I/O”操作 ----->进行网络通信的两个进程在不同的机器上,如何连接? 网络协议具有多样性,如何进行统一的操作 ?
需要一种通用的网络编程接口:Socket
4. socket类型
流式套接字(SOCK_STREAM) ---> TCP
提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流。
数据报套接字(SOCK_DGRAM) --> UDP
提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送可能乱序接收。
原始套接字(SOCK_RAW)
可以对较低层次协议如IP、ICMP直接访问,还有一些ping命令
5.位置
五、端口号
● 为了区分一台主机接收到的数据包应该转交给哪个进程来进行处理,使用端口号来区分● TCP端口号与UDP端口号独立(UDP port为8888,TCP port也可为8888 )
● 端口号一般由IANA (Internet Assigned Numbers Authority) 管理
● 端口用两个字节来表示
六、字节序
1. 字节序: 不同类型的cpu主机,内存存储大于一个字节类型的数据在内存中的存放顺序。
2. 浮点类型,字符类型,字符串没有字节序
3. 分类:
小端序(little-endian) - 低序字节存储在低地址 (主机字节序)
大端序(big-endian)- 高序字节存储在低地址 (网络字节序)
注意:
网络中传输的数据必须使用网络字节序,即大端字节序
终端显示的数据必须是主机字节序,即小端字节序
端口号占2字节 --->需要区分大小端---->大小端转换
端口号的字节序转换:
主机字节序转换为网络字节序 (小端序->大端序)
#include <arpa/inet.h>u_long htonl (u_long hostlong); //host to network longu_short htons (u_short short); //掌握这个
网络字节序转换为主机字节序(大端序->小端序)
#include <arpa/inet.h>u_long ntohl (u_long hostlong);u_short ntohs (u_short short);
IP地址的字节序转换:
主机字节序转换为网络字节序 (小端序->大端序)
#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>uint32_t inet_addr(const char *strptr); //该参数是字符串struct in_addr {uint32_t s_addr; }; 功能: 主机字节序转为网络字节序 参数: const char *strptr: 字符串 返回值: 返回一个无符号长整型数(无符号32位整数用十六进制表示), 否则NULL
网络字节序转换为主机字节序(大端序->小端序)
#include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h>char *inet_ntoa(stuct in_addr inaddr); 功能: 将网络字节序二进制地址转换成主机字节序。 参数: stuct in_addr in addr : 只需传入一个结构体变量 返回值: 返回一个字符指针, 否则NULL;
使用时注意:
参数要填的stuct in_addr类型的结构体变量需要通过 struct sockaddr_in 类型的结构体变量的链式调用来获取
七、数据的封装与传递过程
以太网帧:
●对于网络层最大数据帧长度是1500字节
● 对于链路层最大数据长度是1518字节(1500+14+CRC)
● 发送时候,IP层协议栈程序检测到发送数据和包头总长度超过1500字节时候,会进行自动
分包处理,接收端在IP层进行包重组,然后才继续往上传递
八、wireshark抓包
windows上:
linux上:
(1)下载wireshark: sudo apt-get install wireshark
(2) 启用wireshark : sudo wireshark
过滤包:1. ip.addr == x.x.x.x:只显示源或目标IP地址为x.x.x.x的数据包。
2. tcp.port == x:只显示源或目标端口号为x的TCP数据包。
3. udp.port == x:只显示源或目标端口号为x的UDP数据包。
4. ip.src == x.x.x.x:只显示源IP地址为x.x.x.x的数据包。
5. ip.dst == x.x.x.x:只显目标IP地址为x.x.x.x的数据包。
dst:目标
src:源
seq:序列号
ack:确认号
PSH:数据包
ACK:确认包
SYN:握手包(同步包)
FIN:挥手包