浅谈网络编程
引言
网络学习的核心内容就是网络协议的学习
网络协议:网络中进行数据交换而建立的规则、标准或者说是约定的集合
因为不同用户的数据终端可能采取的字符集是不同的,两者需要进行通信,必须要在一定的标准上进行
目前 TCP/IP 协议已经成为 Internet 中的「通用语言」
下图为不同计算机群 之间利用 TCP/IP 进行通信的示意图
Paste_Image.png
网络层次的划分
为了使不同计算机厂家生产的计算机能够相互通信,以便在更大的范围内建立计算机网络
国际标准化组织(ISO)在 1978 年提出了“开放系统互联参考模型”
即著名的 OSI/RM 模型(Open System Interconnection/Reference Model)
除了标准的 OSI 七层模型以外,常见的网络层次划分还有 TCP/IP 四层协议 以及 TCP/IP 五层协议
各个模型对比图
Paste_Image.png
一、应用层「Application Layer」
简介
基本数据单位:报文
主要协议
FTP(文件传送协议)、Telnet(远程登录协议)、DNS(域名解析协议)
SMTP(邮件传送协议)、POP3协议(邮局协议)、HTTP协议(Hyper Text Transfer Protocol)
具体分类
会话层
管理主机之间的会话进程,即负责 建立、管理、终止进程之间的会话
通过在数据中插入校验点来实现数据的同步
表示层
对上层数据或信息进行变换以保证一个主机应用层信息可以被另一个主机的应用程序理解
表示层的数据转换包括:数据的加密、压缩、格式转换等
应用层
为操作系统 或 网络应用程序 提供 访问网络服务的接口
1. HTTP「Hypertext Transfer Protocol」超文本传输协议
作用:规定客户端和服务器之间的数据传输格式
特点:
简单快速:HTTP协议简单,HTTP服务器程序小,通信速度快
允许传输各种各样的数据
HTTP 0.9 和 1.0使用 非持续连接,限制每次连接只处理一个请求,请求做出响应后,马上断开,节省传输时间
1)发送请求的方法「不同的方法对资源有不同的操作方式」
PUT:增,给服务器添加资源
DELETE:删,给服务器删除资源
POST:改,修改服务器资源
GET:查,查找服务器资源
2)请求参数
传递给服务器的具体数据,比如:帐号、密码
浏览器和服务器对URL的长度有限制,一般不超过 1K
GET请求参数
格式:URL +?+ 参数1=值1 +&+ 参数2=值2「参数间用 & 隔开」
多值参数,格式:URL +?+ 参数1=值1 +&+ 参数1=值2
安全性差「直接将请求暴露在 URL 里」
GET请求的URL一般会记录在服务器的访问日志里,服务器的访问日志是黑客攻击的重点对象之一
仅仅是查询数据使用
POST请求参数
服务器参数全部放在 请求体 中
理论上,没有大小限制。实际上,取决于服务器的处理能力
安全性好 即便是 POST也要加密后提交
增、删、改服务器数据使用
3)HTTP 通信过程 - 请求
I. 请求头:对客户端环境,请求信息的描述
Host: 120.25.226.186:32812 格式:服务器主机地址: 端口
GET/minion.png HTTP/1.1 格式:请求方法/请求资源路径 HTTP/协议版本
User-Agent: Mozilla/5.0 客户端的类型,客户端的软件环境
Accept: text/html, */* 客户端所能接收的数据类型
Accept-Language: zh-cn 客户端的语言环境
Accept-Encoding: gzip 客户端支持的数据压缩格式
II. 请求体:客户端发给服务器的具体数据,比如:文件数据「POST才会有」
4)HTTP 通信过程 - 响应
I. 响应头:服务器的描述,返回数据的描述
HTTP/1.1 200 OK 格式:HTTP协议版本 状态码 状态名称
Server: Apache-Coyote/1.1 服务器的类型
Content-Type: image/jpeg 返回数据的类型
Content-Length: 56811 返回数据的长度
Date: Mon, 23 Jun 2014 12:54:52 GMT 响应的时间
II. 响应体:服务器返回客户端的具体数据,比如:文件数据
III. 常见的响应状态码
状态码
英文名称
中文描述
200
OK
请求成功
400
Bad Request
客户端请求语法错误,服务器无法解析
404
NotFound
根据客户端的请求,找不到资源
500
Internal Server Error
服务器内部错误无法完成请求
2. DNS 「Domain Name System」域名系统协议
简介
DNS 就是进行域名解析的服务器
DNS 命名用于 Internet 等 TCP/IP 网络中,通过用户友好的名称查找计算机和服务
用于命名、组织到域层次结构中的计算机和网络服务,可以简单地理解为 将 URL 转换为 IP 地址
域名:是由圆点分开一串单词或缩写组成的,域名与 IP 地址之间是一一对应的
3. DHCP「Dynamic Host Configuration Protocol」 动态主机设置协议
简介
局域网的网络协议,使用 UDP 协议工作
主要有两个用途:
给内部网络或网络服务供应商自动分配 IP 地址
给用户或者内部网络管理员作为对所有计算机作中央管理的手段
4. URL「Uniform Resource Locator」统一资源定位符
一个 URL 对应网上一个资源
客户端「Client」移动应用(iOS、android等应用)
服务器「Server」为客户端提供服务、提供数据、提供资源的机器
请求「Request」客户端向服务器索取数据的一种行为
响应「Response」服务器对客户端的请求做出的反应,一般指返回数据给客户端
基本格式:协议: // 主机地址 / 路径
协议:资源的 查找/传输 方式
HTTP 超文本传输协议,访问的是远程的网络资源。格式:http://
file 访问本地计算机上的资源。格式:file:// 不用加主机地址
mailto 访问电子邮件。格式:mailto:
FTP 访问的是共享主机的文件资源。格式:ftp://
主机地址:存放资源的主机「服务器」的 IP地址「域名」
路径:资源在主机「服务器」中的 具体位置
二、传输层「Transport Layer」
简介
基本数据单位:报文 或 段
主要协议:TCP协议「传输控制协议」、UDP 协议「用户数据报协议」
重要设备:网关
功能
建立、维护和取消传输连接
将数据可靠地传送到相应的端口
将上层数据分段,并提供端到端的可靠的或不可靠的传输 以及 端到端的 差错控制 和 流量控制问题
端到端:连接是两个终端主机之间的连接,这两个终端系统的连接中要经过很多个设备「路由器」
点对点:连接是通信双方直接通过电缆进行的连接,中间没有经过其他任何设备
1. Socket「套接字」
简介
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的 一端 称为一个 Socket
通过 Socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据
通信的两端都是 Socket
网络通信其实就是 Socket 间的通信「数据在两个 Socket 间通过 IO 传输」
Socket 是 应用层 和 传输层 之间的桥梁
HTTP 与 Socket 的区别
HTTP 是基于 Socket 的实现;HTTP 应用层协议,主要解决如何包装数据
HTTP 传输的数据格式是规定好的,Socket 实现数据传输是最原始,Socket 实现的数据传输格式可自定义
Socket 是对 TCP/IP 协议的封装,Socket 本身并不是协议,而是一个调用接口「API」
通过 Socket 我们才能使用 TCP/IP 协议
I. 网络通信的要素
首先,定位到要通信的程序:使用 IP地址、端口;其次,确定如何传输数据:使用 协议、数据传输方式
有可能多种协议使用同一种数据传输方式,所以在 Socket 编程中,需要同时指明数据传输方式和协议
IP 地址「网络主机设备的 唯一标识」
Port,端口号「定位程序」
作用:表示进程的逻辑地址,是不同进程的标识
有效端口:0~65535,其中 0~1024 由系统使用或者保留端口,开发中建议使用 1024 以上 的端口
Protocol,传输协议「网络通讯的约定」
简介:协议仅仅是一种规范,必须由计算机软件来实现,由计算机组织制定。例如,如何建立连接,如何相互识别等
特点:通信的双方必须使用同一协议才能通信
常见协议:TCP、UDP、IP
Socket 类型,数据传输方式
SOCK_STREAM 流式 Socket,表示面向连接的数据传输方式
数据可以准确无误地到达另一台计算机
如果损坏或丢失,可以重新发送,但效率相对较慢
常见的 http 协议就使用 SOCK_STREAM 传输数据,因为要确保数据的正确性,否则网页不能正常解析。
SOCK_DGRAM 数据报式 Socket,表示无连接的数据传输方式
计算机只管传输数据,不作数据校验
如果数据在传输中损坏,或者没有到达另一台计算机,无法补救,无法重传
因为 SOCK_DGRAM 所做的校验工作少,所以效率比 SOCK_STREAM 高
注意:SOCK_DGRAM 没有想象中的糟糕,不会频繁的丢失数据,数据错误只是小概率事件
II. Socket 的连接过程
长连接:指在一个连接上可以连续发送多个数据包,在连接保持期间,如果没有数据包发送,需要双方发链路检测包
短连接:指通讯双方有数据交互时,就建立一个连接,数据发送完成后,则断开此连接,即每次连接只完成一项业务的发送
服务器监听
服务器端 Socket 并不定位具体的客户端 Socket,而是处于等待连接的状态,实时监控网络状态
客户端请求
由客户端的 Socket 提出连接请求,要连接的目标是服务器端的 Socket
为此,客户端的 Socket 必须首先描述它要连接的服务器的 Socket
首先,指出服务器端 Socket 的 IP 和 Port Number
然后,向服务器端 Socket 提出连接请求
连接确认
是指当服务器端 Socket 监听到或者说接收到客户端 Socket 的连接请求
它就响应客户端 Socket 的请求,建立一个新的线程,把服务器端 Socket 的描述发给客户端,一旦客户端确认了此描述,连接就建立好了
连接后,服务器端 Socket 继续处于监听状态,继续接收其他客户端套接字的连接请求
Socket 连接图解
Paste_Image.png
2. TCP「Transmission Control Protocol」传输控制协议
简介
面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,四次挥手断开连接
TCP 负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地
使用 TCP 的协议
FTP(文件传输协议)、Telnet(远程登录协议)、SMTP(简单邮件传输协议)
POP3(和 SMTP 相对,用于接收邮件)、HTTP 协议等
特点
每条传输连接只能有两个端点,只能进行点对点的连接,不支持多播和广播的传输方式
连接中可以进行大数据传输「数据不受限制」
通信双方可以同时发数据和接收数据
每次发送请求使用 TCP 协议
必须建立连接「效率会稍低」,是可靠协议,送达安全
TCP 报文首部格式
序号:Seq「Sequence Number」序号占32位,用来标识从计算机 A 发送到计算机 B 的数据包的序号,计算机发送数据时对此进行标记
确认号:Ack 「Acknowledge Number」确认号占32位,客户端和服务器端都可以发送,`Ack = Seq + 1 说明收到数据包
标志位:每个标志位占用 1 Bit
URG:紧急指针「urgent pointer」有效
ACK:确认序号有效
PSH:接收方应该尽快将这个报文交给应用层
RST:重置连接
SYN:Synchronous,建立一个新的同步连接
FIN:Finish,断开一个连接
Paste_Image.png
I. 建立连接-三次握手
建立连接非常重要,是数据正确传输的前提
模拟步骤
[Shake 1] 套接字A:“你好,套接字 B,我这里有数据要传送给你,建立连接吧。”
[Shake 2] 套接字B:“好的,我这边已准备就绪。”
[Shake 3] 套接字A:“谢谢你受理我的请求。”
具体步骤
CLOSED 状态:没有建立连接,客户端已经调用 socket() 函数创建了套接字
LISTEN 状态:服务器端调用 listen() 函数后,开始监听客户端请求
服务器没有回传 ACK 包,客户端会重新发送,直到服务器回传 ACK 包
SYN-SEND 状态:向服务器端发送过了数据包
SYN-RECV 状态:服务器已经将数据包发出
ESTABLISED 状态:连接已经成功建立
Paste_Image.png
必要性
在「两次握手」的情形下,假设 Client 想跟 Server 建立连接,但是却因为中途连接请求的数据报丢失了,故Client端不得不重新发送一遍,这个时候 Server 端仅收到一个连接请求,因此可以正常的建立连接
有时候 Client 端重新发送请求不是因为数据报丢失了,而是有可能数据传输过程因为网络并发量很大在某结点被阻塞了,这种情形下Server端将先后收到 2 次请求,并持续等待两个 Client 请求向他发送数据...
问题就在这里,Cient端实际上只有一次请求,而 Server 端却有 2 个响应,极端的情况可能由于 Client 端多次重新发送请求数据而导致 Server端最后建立了 N 多个响应在等待,因而造成极大的资源浪费!
II. 断开连接-四次挥手
释放不再使用的资源
不能正常断开,会造成数据传输错误,套接字不能关闭,持续占用资源,如果并发量高,服务器压力堪忧
模拟步骤
[Shake 1] 套接字A:“任务处理完毕,我希望断开连接。”
[Shake 2] 套接字B:“哦,是吗?请稍等,我准备一下。”
等待片刻后……
[Shake 3] 套接字B:“我准备好了,可以断开连接了。”
[Shake 4] 套接字A:“好的,谢谢合作。”
具体步骤
FIN 状态:Finish,表示断开连接
TIME_WAIT 状态:TIME_WAIT 要等待 2MSL 才会进入 CLOSED 状态,如果 2MSL 后还未收到服务器重传的 FIN 包,就说明服务器已经收到了 ACK 包
客户端最后一次发送 ACK 包时,若服务器收不到,服务器会再次发送 FIN 包
如果这时客户端完全关闭了连接,那么服务器无论如何也收不到 ACK 包了,所以客户端需要等待片刻、确认后,才能进入 CLOSED 状态
报文最大生存时间(MSL,Maximum Segment Lifetime)
数据包在网络中是有生存时间的,超过这个时间还未到达目标主机就会被丢弃,并通知源主机
CLOSED 状态:断开连接状态
Paste_Image.png
3. UDP「User Datagram Protocol」用户数据协议
简介
将数据及源和目的封装成数据包中,不需要建立连接
使用 UDP协议包括:TFTP(简单文件传输协议)、SNMP(简单网络管理协议)、DNS(域名解析协议)、NFS、BOOTP
特点
每个数据报的大小限制在 64K 之内
支持单播,组播,广播等多种通信方式
每次发送请求使用 UDP 协议
无需建立连接,是不可靠协议「效率高」
三、网络层「Network Layer」
简介
基本数据单位:IP 数据报
重要的设备:路由器
为数据包选择路由
作用
路径选择、路由选择、逻辑寻址
实现两个主机系统之间的数据透明传送
具体功能:寻址、路由选择、建立连接、保持和终止连接等
网络层负责对子网间的数据包进行路由选择
网络可以实现 拥塞控制、网际互连 等功能
包含的主要协议
IP 协议(Internet Protocol,因特网互联协议)
简介:仅仅提供不可靠、无连接的传送服务「TCP/IP 的核心协议」
功能:无连接数据报传输、数据报路由选择和差错控制
ICMP 协议(Internet Control Message Protocol,因特网控制报文协议)
ARP 协议(Address Resolution Protocol,地址解析协议)
RARP 协议(Reverse Address Resolution Protocol,逆地址解析协议)
1. IP 地址
简介:一共 4 个字节的长度,32 位
1)网络地址
构成:网络号(包括子网号)+ 主机号
网络地址的主机号为全 0,网络地址代表着整个网络
2)广播地址
通常称为直接广播地址,是为了区分受限广播地址
广播地址的主机号为全 1
向 某个网络的广播地址发送消息,该网络内的所有主机都能收到该广播消息
3)IPv4 地址分类
A、B、C 类私有地址
私有地址「private address」也叫专用地址,它们不会在全球使用,只具有本地意义
A 类私有地址:10.0.0.0/8,范围是:10.0.0.0~10.255.255.255
B 类私有地址:172.16.0.0/12,范围是:172.16.0.0~172.31.255.255
C 类私有地址:192.168.0.0/16,范围是:192.168.0.0~192.168.255.255
地址的分类
A 类地址以 0 开头,前 1 个字节作为网络号,地址范围为:0.0.0.0~127.255.255.255
B 类地址以 10 开头,前 2 个字节作为网络号,地址范围是:128.0.0.0~191.255.255.255
C 类地址以 110 开头,前 3 个字节作为网络号,地址范围是:192.0.0.0~223.255.255.255
D 类地址以 1110 开头,地址范围是 224.0.0.0~239.255.255.255,D 类地址作为组播地址「一对多的通信」
E 类地址以 1111 开头,地址范围是 240.0.0.0~255.255.255.255,E 类地址为保留地址,供以后使用
注:只有A、B、C 有网络号和主机号之分,D 类地址和 E 类地址没有划分网络号和主机号
4)特殊的 IP 地址解释
本地网络
全 1 的 IP 地址:255.255.255.255「受限的广播地址」
受限广播地址只能用于本地网络,路由器不会转发以受限广播地址为目的地址的分组
一般广播地址既可在本地广播,也可跨网段广播
注:一般的广播地址「直接广播地址」能够通过某些路由器,而受限的广播地址不能通过路由器
广播地址
全 0 的 IP 地址:0.0.0.0
常用于寻找自己的 IP 地址
例如在我们的 RARP,BOOTP 和 DHCP 协议中,若某个未知 IP 地址的无盘机想要知道自己的IP地址,它就以 255.255.255.255 为目的地址,向本地范围(具体而言是被各个路由器屏蔽的范围内)的服务器发送 IP 请求分组
127.0.0.0/8 回环地址
表示本机的地址,常用于对本机的测试,用的最多的是 127.0.0.1
/8:表示 从前到后有 8 个 1 的网络掩码,即子网掩码为 255.255.0.0
5)网络划分
简介
网络地址 = IP 地址 & 子网掩码
通过子网掩码来实现网络划分「1 代表该位是网络位, 0 代表该位是主机位」
将原来的主机号借前几位做子网号,主机号相应的减少了,网络号不变
不划分子网:IP 地址 = 网络号 + 主机号
划分子网:IP 地址 = 网络号 + 子网号 + 主机号
注意:全为 0 或 1 的 IP 地址是不能被计算子网掩码内的
利用子网数来计算子网掩码
在求子网掩码之前,先搞清楚要划分的子网数目,以及每个子网内的所需主机数目
将子网数目转化为二进制来表示;
如欲将B类IP地址 168.195.0.0 划分成 27 个子网:27=11011
取得该二进制的位数,设为 N
该二进制为五位数,N = 5
取得该 IP 地址的类子网掩码,将其主机地址部分的的前 N 位设为 1
将 B 类地址的子网掩码 255.255.0.0 的主机地址从前向后前 5 位设为 1,得到子网掩码 255.255.248.0
利用主机数来计算子网掩码
如欲将 B 类 IP 地址 168.195.0.0 划分成若干子网,每个子网内有主机 700 台:
将主机数目转化为二进制来表示
700=1010111100
如果主机数小于或等于 254(注意去掉保留的两个 IP 地址),则取得该主机的二进制位数,为 N,这里肯定 N<8
如果大于 254,则 N>8,这就是说主机地址将占据不止 8 位,该二进制为十位数,N=10
使用 255.255.255.255 来将该类 IP 地址的主机地址位数全部置 1,然后从后向前的将 N 位全部置为 0
将该 B 类地址的子网掩码 255.255.0.0 的主机地址全部置 1,得到 255.255.255.255,然后再从后向前将后 10位置 0
即为:11111111.11111111.11111100.00000000,即 255.255.252.0
这就是主机为 700 台的 B 类 IP 地址 168.195.0.0 的子网掩码
根据每个网络的主机数量进行子网地址的规划和计算子网掩码
比如一个子网有 10 台主机,那么对于这个子网需要的 IP 地址是
10+1+1+1=13
注意:加的第一个 1 是指这个网络连接时所需的网关地址,接着的两个 1 分别是指网络地址和广播地址
2. ARP/RARP 地址解析协议
ARP「Address Resolution Protocol」简介
根据 IP 地址获取物理地址的一个 TCP/IP 协议
可用于查询本机 ARP 缓存中 IP 地址和 MAC 地址的对应关系、添加或删除静态对应关系等
ARP 欺骗
地址解析协议是建立在网络中各个主机互相信任的基础上的
主机可以自主发送 ARP 应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机 ARP 缓存
攻击者可以向某一主机发送伪 ARP 应答报文,使其发送的信息无法到达预期的主机或到达错误的主机
ARP 工作流程
IP 数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)
Paste_Image.png
RARP「Reverse Address Resolution Protocol」简介
将局域网中某个主机的物理地址转换为 IP 地址
比如:局域网中有一台主机只知道物理地址而不知道 IP 地址
那么可以通过 RARP 协议发出征求自身 IP 地址的广播请求,然后由 RARP 服务器负责回答。
3. RIP/OSPF 路由选择协议
RIP协议
底层是贝尔曼福特算法
它选择路由的度量标准「metric」是跳数,最大跳数是15 跳,如果大于15 跳,它就会丢弃数据包
OSPF协议
Open Shortest Path First 开放式最短路径优先,底层是迪杰斯特拉算法
是链路状态路由选择协议,它选择路由的度量标准是带宽
4. NAT「Network Address Translation」网络地址转换协议
简介
属接入广域网「WAN」技术,是一种 将私有地址 转化为 合法 IP 地址的转换技术
解决了 lP 地址不足的问题,能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机
四、数据链路层「Data Link Layer」
简介
功能:为网络层提供可靠的数据传输
其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点
基本数据单位:帧
主要的协议:以太网协议
重要设备:网桥 和 交换机
在不可靠的物理介质上提供可靠的传输
该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等
作用
将数据组合成数据块
这种数据块为帧「frame」
控制帧在物理信道上的传输,包括如何处理传输差错
调节发送速率以使与接收方相匹配
在两个网络实体之间提供数据链路通路的建立、维持和释放的管理
五、物理层「Physical Layer」
简介:激活、维持、关闭通信端点之间的机械特性、电气特性、功能特性以及过程特性。
作用
该层为上层协议提供了一个传输数据的可靠的物理媒体
物理层确保原始的数据可在各种物理媒体上传输
物理层记住两个重要的设备名称,中继器(Repeater,也叫放大器)和 集线器