网络编程
网络编程从大的方面说就是对信息的发送到接收,中间传输为物理线路的作用。
- 网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的。
网络发展历史和分层
网络(Internet)- 来源于“冷战”时期
- 1957/10/11:前苏联两颗“Sputnik”卫星先后上天
- 1958:美国总统艾森豪威尔向美国国会提出建立DARPA(国防部高级研究计划署),简称ARPA
- 1968/6:DARPA提出“资源共享计算机网络”,为了实现电脑互联,这个网络称作ARPAnet(阿帕网),是Internet的最早雏形
- 早期阿帕网采用网络控制协议(NCP),不能实现不同类型计算机和不同类型操作系统之间的互联,并且没有纠错功能
- 1974/12:第一份TCP协议详细说明发表,但此协议对于丢包不能有效的纠正
- TCP协议分成两个不同的协议:
- 可靠传输:用来检测网络传输中差错的传输控制协议TCP
- 不可靠传输:专门负责对不同网络进行互联的互联网协议IP
- 于是TCP/IP协议诞生
- 1983:ARPAnet上停止使用NCP,互联网上的主机全部使用TCP/IP协议。TCP/IP协议成为Internet中的“世界语言”
为进行网络中的对等实体数据交换而建立的规则,标准或约定称为网络协议
网络分层
- 网络采用分而治之的方法设计,将网络的功能划分为不同的模块,以分层的形式有机结合再一起
- 每层实现不同的功能,其内部实现方法对外部其他层次来说是透明的(透明传输)。
- 接口:上层使用下层服务的入口;
- 服务:下层为相邻上层提供的功能调用。
- 网络体系结构即指的是网络的层次结构和每层所使用协议的集合
网络接口与物理层
- MAC地址:48位全球唯一,网络设备的身份标识
- ARP/RARP:
- ARP :IP地址->MAC地址
- RARP :MAC地址->IP地址
- PPP协议:拨号协议
网络层
- IP地址
- IP:Internet protocol
- ICMP:Internet控制管理协议(eg:ping命令)
- IGMP:Internet分组管理协议,广播,组播
传输层
- TCP(传输控制协议):提供面向连接的,一对一的可靠数据传输的协议,即数据无误,数据无丢失,数据无失序,数据无重复到达的通信
- TCP(用户数据报协议):提供不可靠,无连接的尽力传输协议,是不可靠的无连接的协议,在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输
- SCTP:是可靠传输,TCP的增强版,能实现多主机多链路的通信
应用层
- 网页访问协议:HTTP/HTTPS
- 邮件发送接收协议:POP3(收)/SMTP(发),IMAP(可接受邮件的一部分)
- 文件传输协议:FTP
- 远程登录:Telnet/SSH
嵌入式相关
- 网络时钟协议:NTP
- 简单网络管理协议:SNMP(实现对网络设备集中式管理)
- 传输音视频协议:RTP/RTSP(安防监控)
网络编程的预备知识
Socket
- socket一般指套接字。所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。
IP地址 - 是指互联网协议地址,又译为网际协议地址。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
端口号 - 所谓的端口,就好像是门牌号一样,客户端可以通过ip地址找到对应的服务器端,但是服务器端是有很多端口的,每个应用程序对应一个端口号,通过类似门牌号的端口号,客户端才能真正的访问到该服务器。为了对端口进行区分,将每个端口进行了编号,这就是端口号。(65535)
字节序 - 即字节在电脑中存放时的序列与输入(输出)时的序列是先到的在前还是后到的在前。
Socket
是一个编程接口,一种特殊的文件描述符,代表网络编程的一种资源,并不限于TCP/IP协议,可提供面向连接服务和无连接服务.
- 流套接字(SOCK_STREAM)
流套接字用于提供面向连接、可靠的数据传输服务(唯一对应TCP)。该服务将保证数据能够实现无差错、无重复送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP(The Transmission Control Protocol)协议 。 - 数据报套接字(SOCK_DGRAM)
数据报套接字提供一种无连接的服务(唯一对应UDP)。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据报套接字使用UDP( User DatagramProtocol)协议进行数据的传输。由于数据报套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理 。 - 原始套接字(SOCK_RAW)
原始套接字与标准套接字(标准套接字指的是前面介绍的流套接字和数据报套接字)的区别在于:原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的数据。因此,如果要访问其他协议发送的数据必须使用原始套接 字(对应多个协议,发送穿透传输层)。
IP地址
IP地址分为IPV4和IPV6
- IPV4:采用32位的整数来表示,(局域网是为了缓解IP4地址不够而产生)
- IPV6:采用128位整数来表示
- mobileIPV6:local IP(本地注册的IP),roam IP(漫游IP)
- IPV4地址:
- IP地址是一个32位的二进制数,通常采用十进制点分形式表示:
eg:192.168.0.1
- IP地址是一个32位的二进制数,通常采用十进制点分形式表示:
IP地址的转换
#include<arpa/inet.h>
int ipet_aton(const char *strptr,struct in_addr *addrptr);
- 将strptr所指的字符串转换成32位的网络字节序二进制值
int_addr_t inet_addr(const char *strptr);
- 功能同上,返回转换后的地址
- 仅适应于IPV4,包含字节序的转换,不能用于255.255.255.255转换
char *inet_ntoa(struct in_addr inaddr);
- 将32位网络字节序二进制地址转换成点分十进制的字符串
int inet_pton(int af,const char *src,void *dst);
- 将IPV4/IPV6的地址转换成binary格式
- af:地址协议族(AF_INET或AF_INET6)
- src:填写点分形式的IP地址
- dst:存放转换后的结果
内网IP和外网IP的关系
内网也就是局域网,是在一个局部的地理范围内(如一个学校、工厂和机关内),一般是方圆几千米以内,将各种计算机,外部设备和数据库等互相联接起来组成的计算机通信网。内网的计算机以NAT(网络地址转换)协议,通过一个公共的网关访问Internet。内网的计算机可向Internet上的其他计算机发送连接请求,但Internet上其他的计算机无法向内网的计算机发送连接请求。
在IP地址3种主要类型里,各保留了3个区域作为私有地址,其地址范围如下:
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
外网:外网是相对于内网而言的。内网上网的计算机得到的IP地址是Internet上的保留地址;而外网上网的计算机得到的IP地址是因特网的公用地址,是非保留的地址。一般我们称运营商搭建的网络为外网,主要负责连接各个公司或者家庭的网络,外网的计算机和因特网上的其他计算机可随意互相访问。
端口号
- 为了区分一台主机接收到的数据包应该转交给哪个进程来进行处理,使用端口号(16位的数字1 ~ 65535)来区别
- TCP端口号和UDP端口号独立
- 端口号一般由IANA管理
- 已知端口:1 ~ 1023(1 ~ 255之间为常用端口,256~1023端口通常由UNIX系统占用)
- 注册端口:1024 ~ 49150
- 动态或私有端口:49151 ~ 65535
字节序
- 不同类型CPU的主机中,内存存储多字节整数序列有两种方法,称为主机字节序(HBO)
- 小端序(little - endian) - 低序字节存储在低字节
- Intel,AMD等采用
- 大端序(big - endian) - 高序字节存储在低地址
- ARM,Motorola等采用
- 小端序(little - endian) - 低序字节存储在低字节
- 网络中传输的数据必须按网络字节序,即大端字节序
- 在进行网络编程时需要注意字节序的转化
主机字节序到网络字节序
- u_long htonl (u_long hostlong);
- u_short htons(u_short short);
网络字节序到主机字节序
- u_long ntohl (u_long hostlong);
- u_short ntohs (u_short short);
host(network) to network(host) long(short)
更详细的内容可以参考另一个博主粥粥同学的文章
计算机之间是如何进行通信的?;详解三次握手和四次挥手
为什么百度查到的ip和ipconfig查到的不一样;详解公网Ip和私网ip;详解网络分类ABC;