目录
一.为什么要学习网络编程?
1.1 进程间通信方式
1> 内核提供三种:
无名管道
有名管道
信号
2> system V提供三种
消息队列
共享内存
信号灯集
1.2 上述通信方式的弊端
上述通信方式中,只实现了同一主机之间多个进程之间的数据通信,并不能完成跨主机的通信方式
所以,引入了socket套接字通信,套接字通信,既能完成同一主机之间多个进程的通信也能完成跨主机的进程间通信
1.3 跨主机通信方式
1> 基于CS模型:客户端服务器模型,要求客户端有一个客户端软件,客户端将数据传输给服务器,由服务器转发给其他客户端
2> 基于BS模型:浏览器服务器模型,由网页上的相关组件跟服务器进行交互,无需安装客户端软件
二.网络体系结构
2.1网络体系结构概念
1.网络体系结构概念
每一层都有自己独立的功能,单每一层都不可获取
通常把功能相近的协议组织在一起放在一层,协议栈。所以每一层中其实有多个协议
分层的好处:
1、各层之间独立,每一层不需要知道下一层如何实现,而仅仅只需要知道该层通过层间的接口所提供的服务
2、稳定,灵活性好,当任何一层发生变化时,只需要层间接口关系保持不变,而这层以上或以下层不受影响
3、易于实现和维护(知道是什么功能,就到指定层去查找)
4、促进标准化工作:每一层的功能及其所提供的服务都有了精确的说明。
5、结构上不可分割开:各层都可以采用最合适的技术来实现
2.2OSI开放系统互联模型
OSI是由 ISO(国际标准化组织)提出的一个理想化模型。口诀 物数网传会表应。
2.3TCP/IP协议族(簇)的体系结构
TCP/IP协议簇是Internet事实上的工业标准。
TCP/IP网络体系结构四层:
应用层
传输层
网络层
链路层(网络接口和物理层)
虽然TCP/IP体系结构只有四层,但是做的事儿和OSI的七层是一样的。
TCP/IP四层结构 和 OSI开放系统互联模型七层 的对应关系。

2.4数据封包和拆包的过程
举例
实际:
一帧数据的说明
大小为 64--1518(包含以太网的头部14字节、尾部4字节)
如果数据大于MTU(最大传输单元,linux默认是1500),需要分成多次进行传输
可以使用指令ifconfig查看MTU最大传输单元
2.5TCP/IP四层结构中常见的协议
应用层:
HTTP(Hypertext Transfer Protocol) 超文本传输协议
万维网的数据通信的基础
FTP(File Transfer Protocol) 文件传输协议
是用于在网络上进行文件传输的一套标准协议,使用TCP传输
TFTP(Trivial File Transfer Protocol) 简单文件传输协议
是用于在网络上进行文件传输的一套标准协议,使用UDP传输
SMTP(Simple Mail Transfer Protocol) 简单邮件传输协议
一种提供可靠且有效的电子邮件传输的协议
传输层:
TCP(Transport Control Protocol) 传输控制协议
是一种面向连接的、可靠的、基于字节流的传输层通信协议
UDP(User Datagram Protocol) 用户数据报协议
是一种无连接、不可靠、快速传输的传输层通信协议
网络层:
IP(Internetworking Protocol) 网际互连协议
是指能够在多个不同网络间实现信息传输的协议
ICMP(Internet Control Message Protocol) 互联网控制信息协议
用于在IP主机、路由器之间传递控制消息、ping命令使用的协议
IGMP(Internet Group Management Protocol) 互联网组管理
是一个组播协议,用于主机和组播路由器之间通信
链路层:
ARP(Address Resolution Protocol) 地址解析协议
通过IP地址获取对方mac地址
RARP(Reverse Address Resolution Protocol) 逆向地址解析协议
通过mac地址获取ip地址
注意:
每层使用的协议,由下层决定,不能乱用。
三、TCP和UDP异同(笔试面试重点)
共同点:同属于传输层的协议
TCP ----> 稳定
1> 提供面向连接的,可靠的数据传输服务
2> 传输过程中,数据无误、数据无丢失、数据无失序、数据无重复
1、TCP会给每个数据包编上编号,该编号称之为序列号
2、每个序列号都需要应答包应答,如果没有应答,则会将上面的包重复发送直到正确为止
3> 数据传输效率低,耗费资源多
4> 数据收发是不同步的
1、为了提高效率,TCP会将多个较小,并且发送间隔短的数据包,沾成一个包发送,该现象称为沾包现象
2、该沾包算法称之为Nagle算法
5> TCP的使用场景:对传输质量比较高的以及传输大量数据的通信,在需要可靠通信的传输场合,一般使用TCP协议
例如:账户登录,大型文件下载的时候
UDP ----> 快速
1> 面向无连接的,不保证数据可靠的,尽最大努力传输的协议
2> 数据传输过程中,可能出现数据丢失、重复、失序现象
3> 数据传输效率高,实时性高
4> 限制每次传输的数据大小,多出部分直接忽略删除
5> 收发是同步的,不会沾包
6> 适用场景:发送小尺寸的,在接收到数据给出应答比较困难的情况下
例如:广播、通讯软件的音视频
四.网络编程基础相关的概念
4.1字节序
1> 计算机中有关多字节整数的存储方式,根据主机CPU处理数据的方式不同,我们将主机分为大端存储和小端存储的主机
大端存储:低地址位存储数据的高位的存储方式
小端存储:低地址位存储数据的低位的存储方式
验证大小端方式
还可用共用体验证
4.1.1字节序的转换问题:
主机字节序:本地主机存储多字节整数的方式,分为大端存储和小端存储的主机字节序
网络字节序:多字节整数在网络中传输的存储方式称为网络字节序,规定网络字节序为大端存储
4.1.2转换函数
主机:host
网络:network
转换:to
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong); //将4字节无符号整数的主机字节序转换为网络字节序,参数是主机字节序,返回值是网络字节序
uint16_t htons(uint16_t hostshort); //将2字节无符号整数的主机字节序转换为网络字节序,参数是主机字节序,返回值是网络字节序
uint32_t ntohl(uint32_t netlong); //将4字节无符号整数的网络字节序转换为主机字节序,参数是网络字节序,返回值是主机字节序
uint16_t ntohs(uint16_t netshort); //将2字节无符号整数的网络字节序转换为主机字节序,参数是网络字节序,返回值是主机字节序
#include <stdio.h>
#include <myhead.h>
int main(int argc, char const *argv[])
{
unsigned int num = 0x12345678;
unsigned short num2 = 0x1234;
unsigned int num_t = htonl(num);//主机字节序转换为网络字节序
unsigned int num3_t = ntohl(num_t); // 网络字节序转换主机字节序
unsigned short num2_t = htons(num2);
unsigned int num4_t = ntohs(num2_t);
printf("%#x\n", num_t);
printf("%#x\n", num2_t);
printf("%#x\n", num3_t);
printf("%#x\n", num4_t);
return 0;
}
4.1.3何时使用字节序转换相关函数
1、在进行多字节整数网络传输时,需要使用字节序的转换
2、对于单字节整数传输时,无需使用字节序的转换
3、对于字符串的传输时,无需使用字节序的转换
4.2ip地址
1> IP地址的概念:IP地址是计算机在网络中的唯一标识,由两部分组成,分别是标识网络区域的网络号,和该网络下的主机编号
网络号:确定计算机所从属的网络
主机号:标识设备在该网络下的一个编号
2> 作用:在网络传输过程中,给网络传输载体必须加上源ip地址和目的ip地址,以便于找到对应的主机
路由器就是以此信息为依据进行路由选择的
3> IP地址的分类
1、IPv4:是使用4字节无符号整数表示的一个ip地址,取值范围:[0, 3^32-1]
局域网:为了解决ip地址不够用的问题,让多个主机使用同一个ip地址
WAN:Wide Area Network 广域网
LAN:Local Area Network 局域网
2、IPv6:是使用16字节无符号整数表示的一个ip地址,取值范围:[0, 2^128-1]
注意:IPv6不兼容IPv4
4> IP地址的划分:由于ip地址比较庞大,我们将其进行分组,一个分为5类网络,分别是A类网络、B类网络、C类网络、D类网络、E类网络
4.2.1一个局域网下的特殊的IP地址
1、网络号 + 0:表示该网络,不分配给任何主机使用
2、网络号 + 255:广播地址,不分配给任何主机使用
3、网络号 + 1:默认为网关地址
4、127.0.0.1:本地环回地址,用于主机内部自测使用
5、0.0.0.0:表示当前局域网的任意一个主机号
6、255.255.255.255:一般表示广播
4.2.2点分十进制
为了方便记忆,我们将ip地址的每一个字节单独转换为10进制数据,以小数点作为分割来表示IP地址,用字符串表示,但是,在网络传输过程中,使用的还是整数的形式
那么,就需要提供 点分十进制与整数 进行转换的函数
in_addr_t inet_addr(const char *cp); 功能:将ip地址的点分十进制数据转换为网络字节序的整数 参数:ip地址的点分十进制字符串 返回值:网络字节序的ip地址的整数表示 char *inet_ntoa(struct in_addr in); 功能:将ip地址的网络字节序转换为点分十进制的字符串 参数:ip地址的网络字节序整数 返回值:点分十进制字符串
#include <myhead.h> int main(int argc, char const *argv[]) { char *st = "192.168.126.29"; // 点分十进制转换为网络字节序 unsigned int ip_nerwork = inet_addr(st); printf("ip_network=%#x\n", ip_nerwork); // ip地址对应的网络字节序 return 0; }
4.3端口号(重要)
1> 为了区分同一主机上的多个进程,使用端口号来进行处理
2> 端口号是一个2字节的无符号整数存储,取值范围【0,65535】
3> 网络通信中两个决定性因素:IP + 端口号
4> 端口号的分类:
众所周知的端口号:
0~1023端口我们编程时候不要使用,是那些”VIP“应用程序占了
TCP 21端口:FTP文件传输服务
TCP 23端口:TELNET终端仿真服务
TCP 25端口:SMTP简单邮件传输服务
TCP 110端口:POP3邮局协议版本3
TCP 80端口:HTTP超文本传输服务
TCP 443端口:HTTPS加密超文本传输服务
UDP 53端口:DNS域名解析服务
UDP 69端口:TFTP文件传输服务
特殊的端口函数,存储在linux中的 /etc/services文件中
TCP和UDP的端口号是相互独立的(重要)
可以使用的:1024~49151,就是我们平时编写服务器使用的端口号
临时端口号:49152~65535,这部分是客户端运行时候动态选择的
4.4域名解析
由于使用IP地址来指定计算机不方便人们记忆,且输入时候容易出错,用字符标识网络种计算机名称方法。
这种命名方法就像每个人的名字,这就是域名(Domian Name)
域名服务器(Domain Name server):用来处理IP地址和域名之间的转换。
域名系统(Domain Name System,DNS):域名翻译成IP地址的软件
一个域名,可以绑定多个ip
域名结构
例如域名 http: //www.baidu.com.cn 从右向左看
cn为高级域名,也叫一级域名,它通常分配给主干节点,取值为国家名,cn代表中国
com为网络名,属于二级域名,它通常表示组织或部门
中国互联网二级域名共40个,edu表示教育部门,com表示商业部门,gov表示政府,军队mil等等
baidu为机构名,在此为三级域名,表示百度
www:万维网world wide web,也叫环球信息网,是一种特殊的信息结构框架。
http:使用的是超文本传输协议