目录
一、相关概念
1.网络:是由若干结点的连接这些结点的链路组成,网络结点可以是计算机、交换机等设备。
传输介质:同轴电缆、双绞线、光纤。 网络设备:交换机、路由器、集线器等。
2.互联网:把多个网络连接起来就构成了互联网。最大的互联网为Inter网。
3.IP:结合Inter网的每个主机的每个接口分配的一个在全世界的唯一标识符。可以方便我们寻址。有PV4和IPV6两种类型。
- 类型:
IPV4类似“A、B、C、D”的格式,是32位的,用“.”分成四个段,每个段8个位(0-255),用10进制表示。IPV4报头:
IPV6为128位,类似“xxxxxxxxxxxxxxxxxxxxxxxxxx”,用“.”分成8个段,每个段16位,用4个16进制表示。
- 组成: 网络号+主机号
- 分类:
每类地址开头都是固定的,所以每类地址都有自己的范围:
A类:0.0.0.0 ——127.255.255.255;
B类:128.0.0.0 ——191.255.255.255;
C类:192.0.0.0 —— 233.255.255.255;
D类和E类地址不常用。
4.MAC地址
在局域网中,硬件地址又称物理地址或MAC地址,是固定在计算机适配器的ROM的地址。如果把计算机中的适配器换掉,那计算机所在的局域网的地址发生改变;如果把一个计算机所在的地址位置改变,但他的MAC地址是不会改变的。
5. 网络协议
网络基本协议就是一组网络规则的集合,是共同遵守的规定或标准。
常用的有:HTTP(超文本传输协议)、 FTP(文件传输协议)、TCP(传输控制协议)、UDP(用户数据报协议)、ICMP(因特网控制报文协议)、ARP(地址解析协议) 、RARP(逆地址解析协议)。
二、网络分层模型
1. 网络分层模型可分为OSI模型、TCP/ip协议族4层结构。
物理层:以二进制形式在物理介质上传输数据;
数据链路层:通过各种协议,将有差错的物理信道变成无差错、能可靠传输数据帧的数据链路。在物理层提供比特流的基础上,提供可靠的通过物理介质传输数据的方法。差错检测、透明传输、封装成帧。
网络层:实现数据包的选路和转发,核心是IP协议和ICMP协议。
IP协议根据数据包的数目的IP地址决定如何传递。若不能直接转发给主机,则会寻找合适的路由器由路由器转发数据。 IP协议通过逐跳的方式确定路径。IP数据报的发送传输及接收都是相互独立的,没有上下关系。缺点无法处理乱序和重复 的IP数据报。
ICMP为上层提供无状态、无连接、不可靠的服务。无状态指通信双方不同步传输数据的状态信息;无连接指通信双方 都 不能 长久的维持对方的任何信息;不可靠指的是不能保证IP数据报准确到达接收端。
传输层:为两台应用主机提供端到端的通信,只关心通信的起始端和目的端,不在乎数据包的中转过程。主要有TCP、UDP、SCTP协议。TCP是超时重传、确认应答方式来确定数据报被正确的发送至目的地。UDP提供不可靠、无连接、基于数据报的服务。SCTP协议是为因特网上传输电话信号设计的。
会话层:建立、维护和管理会话。
表示层:数据格式化、数据加密。
应用层:处理应用程序的逻辑。为应用程序提供服务。
网络通信流程图:
2.主机字节序列和网络字节序列
主机字节序列分为大端字节和小端字节序,不同的的主机采用的字节序列可能不同。
- 大端指的是一个整数的高位字节存储在内存低地址处,低字节存储在内存高地址处。
- 小端个整数的高位字节存储在内高地址处,低字节存储在内存低地址处。
不同字节序两主机在传递数据时,要将数据发送到网络时规定整型数据使用大端,所以也将大端字节序改为网络字节序。在对方在接收到数据后,可以根据自己的字节序转换。头文件:#include<netinet/in.h>
网络编程接口及相关函数介绍:
三、常见网络协议分析
1.TCP协议(全双工通信方式)
- 可靠的、面向连接,基于字节流服务。
TCP是超时重传、确认应答方式来确定数据报被正确的发送至目的地,所以TCP服务是可靠的。在TCP协议通信双方通信 时必须先建立TCP连接,并在内核为该链接维持一些必要的数据结构。在通信结束后双方必须关闭连接以释放内核数据。基 于流的数据没有边界(长度)限制,他可以一直从通信地一端流入另一端。发送端可逐个字节地向数据写入数据,接收端可 以逐个字节将他们读出。
- TCP报头:
- 在linux下实现TCP协议通信步骤说明:
TCP的面向连接:服务器与客户端在真正交互前必须建立一个连接,后面的交互都在这个连接上完成
- 在建立连接过程中,要实现同步报文段;——>三次握手
- 在链接上交互,数据传输更加可靠; ——>四次挥手
- 交互完成后,需要断开链接,以释放内核资源;——>心跳包机制
TCP的可靠性:
- 保证数据能传输到目的端 ——>应答确认 超时重传 滑动窗口 拥塞控制
- 保证数据不乱序,不重复 ——>TCP固定头部有32位序号
- 保证数据不失真 ——>16为校验码
2.UDP协议:
- 无连接、不可靠、基于数据报的服务。
“不可靠”意味着UDP无法保证数据从起始端发送后能够正确传输到目的端。如若数据丢失,或者目的端口通过数据校验发现数据错误将其丢掉,那UDP只会简单通知程序发送失败。UDP每次发送数据报时都有规定长度,接收端必须以该长度为最小单位将其所有内容一次性读出,否则数据就会被截断。
- UDP报头:
- 特点:发送端执行的写操作次数和接收端执行的读操作的次数没有任何关系,应用程序对数据的发送和接收无边界限制。
- linux下建立UDP会话过程
其中:int recvfrom(int sockfd,void *buff,size_t size,int flag,struct sockaddr *peer_addr,socklen_t *addr_len);
int sendto(int sockfd,void *buff,size_t size,int flag,struct sockaddr *des_addr,socklen_t *addr_len);
- UDP协议与TCP协议
TCP协议(字节流服务):
- 发送端send的次数与接收端recv的次数不等;
- 发送端send的次数与网络层封装的TCP报头个数不等;
- 接收端recv若一次没有将数据接收完,下次recv连接会读取后续数据;
第一条与第二条是因为数据粘包的问题。
UDP协议(数据报服务):
- 发送端sendto的次数与接收端recvfrom的次数相等;
- 发送端send的次数与网络层封装的TCP报头个数相等;
- 接收端recvfrom若一次没有将UDP报文中的数据接收完,剩下的数据将会被丢弃;
4.DNS(域名解析协议) 应用层
将域名转化为IP地址 DNS服务器上存储域名到IP地址的映射。 访问方式分为两种:
递归查询:DNS服务器代表客户机查询或联系其他DNS服务器以完成解析该名称,并将应答返回至客户机;
迭代查询:客户机可自己联系其他用的DNS服务器解析名称,若客户机这样做,他会使用基于服务器应答的独立和附加的查 询,这过程成为迭代。
- 查询步骤:
1.在浏览器输入www.baidu.com域名时,服务器首先会检查自己本地的hosts文件是否有这个网址映射关系,若有完成域名 解析;
2.若hosts文件与本地DNS解析器缓存没有相应的映射关系,首先会找TCP/IP参数中设置的首选DNS服务器,我们叫他本地 DNS服务器,如果查询的域名包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,但此解析不具有 权威性;
3.若本地的DNS服务器、本地区域文件与缓存解析失效,则根据本地DNS服务器的设置,是否设置了转发模式来进行查询。 若用转发模式,本地DNS就把请求发送至13台根服务器上,根DNS服务器在收到请求后判断这个域名(.com)是由谁管 理,并返回一个该顶级域名服务器的一个IP。本地DNS服务器收到IP后,这台负责域名收到请求后,若无法解析,会查找 下一级的DNS服务器(baidu.com)给本地服务器,以此类推,直到找到IP,并缓存到本地。解析过程由右向左。
.——>.com——>baidu.com——>www.baidu.com——>.........
4.若是不是转发模式,则与上步骤相反,由下向上找。www.baidu.com——> qq.com——>.com——>.
5.HTTP协议(默认80端口) 应用层
1. 简介:对客户端和服务器端之间数据传输的格式规范,简称超文本传输协议。基于TCP/IP通信协议来传递数据,工作于客户 端 ——服务器端架构上。浏览器作为客户端向web服务器端发送请求,服务器根据收到的请求向客户端发送相应。
2.特点:
- 支持客户/服务器(C/S)模式;
- 简单快速。客户向服务器请求服务时,只需传送请求方法个路径。
- 灵活。允许传输任意类型的数据对象。
- 无连接:限制每次连接只处理一个请求。服务器处理完客户的请求后并受到客户的回应后,断开连接;
- 无状态:对处理事务无记忆力
3.请求方式:
- GET:请求获得资源。不对服务器产生任何其他影响;
- POST:客户端向服务器提交数据的方法,这种方法会影响服务器。服务器可能根据上传情况创建新的资源,或更新原有资 源;
- PUT:请求服务器存储一个资源。
- HEAD:和GET方法类似,仅仅要求服务器返回头部信息,而且不虚传输任何实际内容;
- TRACE:要求服务器返回原始HTPP请求的内容。用来查看中间服务器对http请求的影响;
- OPTIONS:查看服务器对某个特定的URL都支持哪些请求方法。也可把URL设置为*,从而获取服务器支持请求的所有方 法;
- CONNECT:用于某些代理服务器,能把要求的链接转化为一个安全隧道;
- PATCH:对某个资源做部分修改。
4.Http报头
请求报头结构:
应答报头结构:
应答状态:
1XX:指示信息--表示请求已接收,继续处理;
2XX:成功---- 表示请求已经被成功接收,理解,接受;
3XX:重定向-要完成请求必须进行更近一步的操作;
4XX:客户端错误-请求有语法错误或者请求无法实现;
5XX:服务器端错误---服务器未能实现合法的请求;
5.具体应答状态码:
*400---客户端请求有语法错误,不能被服务器理解:
*401----请求未经授权;
*403-- - 服务器收到请求,但拒绝提供服务;
*404----请求资源不存在;
*500---服务器发生不可预期的错误;
*503---服务器当前不能处理客户端的请求,一段时间后可能恢复正常。
6.http与https(网络协议)的区别:
- https需要申请ca证书,一般免费证书很少,需要缴费;
- http是超文本传输协议,信息是明文传输;https是具有安全性的SSL加密传输协议;
- http和https是完全不同的连接方式,用的端口也不同(http:80,https:443);
- http协议链接简单,无状态;
- https协议由SSL+http协议构成的可进行加密传输、身份认证的网络协议,比http协议安全。
http和https主要应用于浏览器与网站服务器之间传递数据。http协议以明文方式发送内容,不提供任何的数据加密,如果攻击者截取了浏览器与服务器之间的传输报文,就可以直接读懂其中的信息,因此http协议不适合传输一些敏感信息。https协议为了数据传输的安全,在http协议的基础上加入了SSL协议,SSL协议依靠证书检验服务器的身份,并未浏览器和服务器之间的通信加密。
7.IP协议
是一个不可靠、无连接、无状态的协议。
不可靠:IP协议不能保证数据能准确的发送的接收到,尽自己最大努力发送
无连接:通信双方不能长久的维持对方的任何信息,所以在每次发送前要确定对方的IP地址。
无专状态:不同步传输数据的状态。IP协议发送的报文的发送、接收、传输是独立的,与上下文切换没有关系。接收方可能接收到乱序的、重复的报文段。
-
IP分片
报文段传输的一种方式。当传输报文段的长度大于最大传输单元(MTU),他就会将报文段进行分片传输,然后由接收方接收报文段并重组报文段。
IP分片发生在IP层,不仅源端主机会进行分片,中间的路由器也有可能分片,因为不同的网络的MTU是不一样的,如果传输路径上的某个网络的MTU比源端网络的MTU要小,路由器就可能对IP数据报再次进行分片。而分片数据的重组只会发生在接收端的IP层。
为什么要避免IP分片???
对于TCP是尽量避免IP分片的,在IP层分片后,如果某一个片丢失,就需要对整个报文段重传。IP层是没有重传机制,当来自TCP报文段的某一片丢失后,TCP在超时后重发整个TCP报文段,该报文段对应于一份IP数据报,没有办法只重传数据报中的一个数据报片。而且如果对数据报分片的是中间路由器,而不是起始端系统,那么起始端系统就无法知道数据报是如何被分片的,因此基于这种原因,TCP是经常要避免分片的。
那么TCP层是如何避免IP层的分片呢?首先,TCP在建立连接时会进行3次握手,而在这3次握手中,客户端和服务端通常会协商一个值,那就是MSS(最长报文大小),用来表示本段所能接收的最大长度的报文段。MSS=MTU-TCP首部大小-IP首部大小,MTU值通过查询链路层得知。
当两端确认好MSS后进行通信,TCP层往IP层传输数据时,如果TCP层缓冲区的大小大于MSS,那么TCP层都会将其中的数据分组进行传输,这样就避免了在IP层进行分片。
原因是IP层是没有超时重传机制的,如果IP层对一个数据包进行了分片,只要有一个分片丢失了,只能依赖于传输层进行重传,结果是所有的分片都要重传一遍,这个代价有点大。由此可见,IP分片会大大降低传输层传送数据的成功率,所以我们要避免IP分片。
对于UDP而言,由于UDP是不需要保证可靠性的,没有超时和重传机制,这使得UDP很容易导致IP分片。
在IP首部中,我们看到有一个占了3位的标志字段,其中第1位作为保留字段;第2位分段用来表示一个数据报是否允许在IP层被分片;而第3位更多分片字段,则是当数据报被分片时,让接收端知道在什么时候完成所有的分片组装,除了最后一片外,其他每个组成数据报的片都要把该比特置1。
而如果将其中的分段标志比特位置1,表示不允许IP层对数据报进行分片。例如当路由器收到一份需要分片的数据报,而在IP首部又设置了不分片(DF)的标志比特,路由器会丢弃数据报并发送一个ICMP差错报文(“需要进行分片但设置了不分片比特”)。
缺点:
1.分片带来的性能消耗
分片和重组会消耗发送方、接收方一定的CPU等资源,如果存在大量的分片报文的话,可能会造成较为严重的资源消耗;
分片对接收方内存资源的消耗较多,因为接收方要为接收到的每个分片报文分配内存空间,以便于最后一个分片报文到达后完成 重组。
2.分片丢包导致的重传问题
如果某个分片报文在网络传输过程中丢失,那么接收方将无法完成重组,如果应用进程要求重传的话,发送方必须重传所有分片 报文而不是仅重传被丢弃的那个分片报文,这种效率低下的重传行为会给端系统和网络资源带来额外的消耗。
3.分片攻击
黑客构造的分片报文,但是不向接收方发送最后一个分片报文,导致接收方要为所有的分片报文分配内存空间,可由于最后一个 分片报文永远不会达到,接收方的内存得不到及时的释放(接收方会启动一个分片重组的定时器,在一定时间内如果无法完成 重组,将向发送方发送ICMP重组超时差错报文,,只要这种攻击的分片报文发送的足够多、足够快,很容易占满接收方内 存,让接收方无内存资源处理正常的业务,从而达到DOS的攻击效果。
4.安全隐患
由于分片只有第一个分片报文具有四层信息而其他分片没有,这给路由器、防火墙等中间设备在做访问控制策略匹配的时候带来了麻烦。
如果路由器、防火墙等中间设备不对分片报文进行安全策略的匹配检测而直接放行IP分片报文,则有可能给接收方带来安全隐患和威胁,因为黑客可以利用这个特性,绕过路由器、防火墙的安全策略检查对接收方实施攻击;
如果路由器、防火墙等中间设备对这些分片报文进行重组后在匹配其安全策略,那么又会对这些中间设备的资源带来极大的消耗,特别是在遇到分片攻击的时候,这些中间设备会在第一时间内消耗完其所有内存资源,从而导致全网中断的严重后果。