linux 之文网络编程基础 (一)、网络编程基本概念
1. 计算机网络基础
1.1 计算机网络的要求
1958年,出于军事考虑, 美国国会成立ARPA,目的是造出计算机网络,要求是:
1.2 分组交换
在各种网络应用中,端系统彼此交换报文( message) 。 报文能够包含协议设计者需要的任何东西 。报文可以执行一种控制功能(例如,图 1-2 所示例子中的"你好"报文) ,也可以包含数据,例如电子邮件数据、 JPEG 匮|像或 MP3音频文件 。 为了从源端系统向目的端系统发送一个报文,源将长报文划分为较小的数据块,称之为分组( packet) 。
在源和目的之间,每个分组都通过通信链路和分组交换机 (packel swùch)(交换机主要有两类:路由器和链路层交换机)传送 。分组以等于该链路最大传输速率的速度传输通过通信链路 。 因此,如果某源端系统或分组交换机经过-条链路发送一个 L 比特的分组,链路的传输速率为 R 比特/秒,则传输该分组的时间为 L/R 秒
1.3 交换方式
多数分组交换机在链路的输入端使用存储转发传输机制 。节点收到分组,先暂时存下来,再检查首部,按照首部中的目的地址,找到何时的节点转发出去。
2. 七层模型
计算机网络分层的目的:
将复杂的事情,切割成一个一个小片,每一次做好了,数据包就能正确的组成、发送、拆包、接收。
3. 四层模型
- 链路层:只会对mac地址进行判断,组包。负责帧与帧的收发。(源mac、目的mac。)
- 网络层:只会对ip 地址进行判断,组包,决定给哪个主机。主机到主机的收发。( 源ip、目的ip)
- 传输层:只会对端口号进行判断,组包,决定给哪个程序。端到端(进程到进程)的收发。(源端口、目的端口。)
- 应用层:
5、协议的概念
固定的数据格式,两方都遵循,接受者才能接收到、知道怎么解析。
各个层对应的常用协议:
- 关机后,再开机,ip地址不变,就是通过RARP协议实现的。即通过MAC地址,向路由器获得之前分配的IP地址。
- 每一个网卡都有一个mac地址,A给B发送消息,必须携带B的mac地址,否则无法发送信息。可以通过ip发送数据包获得。
- 应用层协议很多。传输层只有两个。Ping命令用的是ICMP协议。一般网络层使用IP协议。
- 我们需要将协议的报头给记住。TCP UDP IP MAC
4. 网卡
- 网卡是俗称,真实名字叫网络适配器。
- 作用:用来发送接收数据,将模拟信号转成数字信号。
每块网卡都有一个全球唯一的表示id。这个全球唯一的标识id号就是mac地址。Mac地址有48位,6个字节。Mac地址是用来标识网卡的物理地址,物理地址是不可以改变的。
注意:我们电脑里,打开网络,会看到两个网卡 wlan 和 以太网。
5.ip地址
5.1 ip地址概念
用来标识主机或网卡的虚拟IP。
- Ipv4 :32位
- IPv6 :128位(解决IP地址不够用的问题)
IP由两部分组成,子网id、主机id两部分组成,也就是结合子网掩码才能确定IP地址。
//查看ip mac地址
Ifconfig
5.2 ip分类
- 共有IP:直接能够连接外网的IP。
- 私有IP:需要通过公网后才能连接外网的IP。(由interNIC 统一规划的IP。)
- 回环地址:使用回环地址,数据包经过引用层 传输层
网络层以后,不经过链路层,直接再回到应用层。通常回环IP为:127.0.0.1。访问本主机、测试协议栈是否好使。
设置ip地址命令
Eth0 网卡 netmask 子网掩码
5. 子网掩码
由连续的1或者连续的0组成。 Ip地址由:子网id、主机id两部分组成。子网掩码的作用就是用来区分这两部分。
例如:如果已经知道一个主机的IP为10.1.2.2,如果想要知道它的主机ID和子网ID,必须要知道它的子网掩码。 例如上个IP,与子网掩码就行匹配,对应子网掩码1的就是该IP的子网IP,对应IP为0的就是该IP的主机IP。
因为一个IP共占4个字节,假如子网ID占3个字节的话,即子网掩码为:255.255.255.0
。 那么该子网最多能连接的主机数为:2的8次方-2。(因为一个字节8位,因此有2的8次组合,但是主机id全为0和全为1 的两个IP 不可以使用,因此减2。全为0是网段地址,全为1是广播地址。)
设置IP地址命令:
Eth0 网卡 netmask 子网掩码
6. 网关
占用该网段的一个ip地址。它负责将数据转发到外网。也就是在局域网中找不到通信的ip地址的时候,就会将这个数据交给网关。网关负责将找不到的ip的交给写一个路由器。(网关一般放在路由器上。)
7.端口
接收到一个数据包后,先经过链路层,判断是否发给我的mac地址,是的话,通过网络层,判断是否发给我的ip地址,是的话,经过传输层,判断发给哪个端口号,每个端口号对应一个应用程序。(端口号实际上标识一个进程的缓冲区。)
每一个网络应用程序必须有一个端口号标识。端口是唯一的,但是端口可以重用。重用是指:本来QQ占用端口号3000,当QQ退出后,别的程序可以占用这个端口号。
最大端口号:0-65535
为什么不用进程号标识进程?而专门用端口号标识?
如果使用进程号,关机后,再次打开这个进程,进程号就变了。就像写信,目的地址一直在变化。而端口号可以保证这一点,一个软件的端口号一般不变。
知名端口号:一些知名的软件有固定的端口号(0-1023),别的程序不能再用。例如:
- Ssh: 22(默认端口号)
- Web服务器: 80(默认端口号)
动态端口号:1024-65535
7.组包过程和拆包过程
主机A 通过飞秋向 主机B 发送 hello的 组包拆包流程。
注意:
只要两个进程通过网络通信,数据包头一定有这14个字节。