![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
学习笔记
文章平均质量分 80
___Blue_H
0和1的世界简单一点
展开
-
STL容器:deque实现
概述 vector是单向开口的连续线性空间,deque则是一种双向开口的连续线性空间,可以在头尾两端分别做元素的插入和删除操作。vector虽然从技术上也可以实现对头尾两端进行操作,但由于vector的底层实现特点的原因,其头部操作效率奇差,故STL没有为vector实现这一功能。 deque和vector的最大差异,一在于deque允许于常数时间内对头部进行插入和删除操作,二在于deque是动态...原创 2018-04-23 17:38:48 · 885 阅读 · 0 评论 -
地址解析协议
概述根据OSI模型的要求,为了跨越不同类型物理网络进行分组交换,需要网络层软件使用的地址和底层网络硬件使用的地址之间进行转换。网络接口硬件通常有一个主要的硬件地址(如MAC地址),由硬件交换的帧需要使用正确的硬件地址定位到正确的接口。但Internet网络需要使用自己的IP地址。主机之间的通信需要跨越多层网络,仅知道IP地址是不够的,还需要知道主机在网络中的有效硬件地址。在TCP/IP中,地址...原创 2018-06-05 20:42:25 · 2487 阅读 · 0 评论 -
IP数据报
IP(Internet Protocol)是TCP/IP协议族中的核心协议,所有TCP、UDP、ICMP和IGMP数据都通过IP数据报传输。在Internet中它是能使连接到网络上的所有设备实现相互通信的一套规则,它提供了一种尽力而为、无连接的数据报交付服务。“尽力而为”的含义是不保证IP数据报能成功到达目的地,任何可靠性必须由上层(例如TCP)提供;“无连接”意味着IP不维护...原创 2018-06-08 17:03:45 · 16520 阅读 · 0 评论 -
IPv6扩展头部
扩展头部 在IPv6中,那些由IPv4选项提供的特殊功能,通过在IPv6头部之后增加扩展头部实现。路由、时间戳、分片和超大分组等功能都在IPv6扩展头部中实现,因此没有为这些特殊功能在IPv6的基本头部分配相应的位。基于这种设计,IPv6头部固定为40字节,扩展头部仅在需要时添加。通常情况下,扩展头部仅由终端主机处理。IPv6的格式特点一定程度上简化了高性能路由器的设计和实现,因为I...原创 2018-06-08 22:18:31 · 15911 阅读 · 3 评论 -
网络地址转换
NAT概述 网络地址转换(Network Address Translation,NAT)诞生于1994年,它的提出是在IPv4地址资源面临枯竭的背景下。NAT的设计初衷之一是为了作为IPv6全面部署之前的过渡策略(虽然现在已成为IPv6部署推进滞后的原因之一),采用NAT滞后,互联网地址就不再需要时全球唯一的,因此可以在互联网的不同部分(称为地址范围(address realm)...原创 2018-08-09 22:26:28 · 6929 阅读 · 0 评论 -
隧道技术简介
隧道技术 隧道技术(Tunneling)是一种通过使用互联网络的基础设施在网络之间建立一条虚拟链路以传递数据的方式。使用隧道传递的数据可以是不同协议的PDU,隧道将其他协议的PDU重新封装后通过网络发送,新的PDU提供路由信息,以便通过互联网传递被封装的数据。由于PDU经过重新封装,使得数据的发送方和接收方就像在一条专有“隧道”中进行数据传输和通信,隧道技术因此得名。一般来说,隧道是在高层...原创 2018-08-02 04:09:13 · 18525 阅读 · 0 评论 -
广播和组播
概述 网络信息传输主要有4种方式:单播(unicast)、任播(anycast)、组播(multicast)和广播(broadcast)。广播和组播为应用程序提供了两种服务:数据分组交付至多个目的地,通过客户端请求/发现服务器。 ·交付至多个目的地。有许多应用程序将信息交付至多个收件方,例如,互动式会议、邮件或新闻分发至多个收件方。没有广播或组播,这些类型的服务只能...原创 2018-08-11 19:11:32 · 32516 阅读 · 0 评论 -
IP转发
当主机通信的目的地是直接相连的主机(例如点到点链接)或共享网络(例如以太网),IP数据报直接发送到目的地,不需要或者不适用路由器。否则,主机将数据报发送到一台路由器,由该路由器将数据报交付到目的地,这个过程可能要经过多个路由。这就是IP转发。大多数主机既可配置为路由器,也可配置为主机。主机与路由器的处理IP数据报的区别在于:主机不转发那些不是由它生成的数据报,路由器会这样做。在整个IP转发方案...原创 2018-08-02 19:49:49 · 12800 阅读 · 0 评论 -
动态主机配置协议
动态主机配置协议(Dynamic Host Configuration Protocol, DHCP)是一种流行的客户机/服务器(C/S)协议。几乎所有常用的客户端操作系统和大量的嵌入式设备(例如网络打印机和VoIP电话)都支持DHCP。这些设备通常使用DHCP获得IP地址、子网掩码、路由器的IP地址、DNS服务器的IP地址。其他服务的相关信息(例如使用VoIP的SIP服务器)也可通...原创 2018-08-07 20:59:48 · 6650 阅读 · 0 评论 -
散列表
定义 散列表(Hash Table)也叫哈希表,是根据关键字进行数据访问的数据结构。散列表将关键字映射到表中的某个位置来访问数据,提供映射的叫散列函数(Hash Function)。通过散列函数,我们可以实现对数据的快速访问(理想情况下是常数时间内,但这取决于散列函数、碰撞概率、负载系数等因素)。 实际上,散列表是普通数组概念的推广。由于对普通数组可以直接寻址,使得...原创 2018-05-24 13:39:23 · 895 阅读 · 0 评论 -
STP/RSTP
网桥和交换机 交换机本质上是高性能的网桥(细节上有所不同,这里只针对共同点),它们用于连接多个物理的链路层网络(如以太网)或成组的站,并对网络数据的流通进行管理。以下内容将网桥和交换机忽略区别,同等看待。 网桥/交换机最基本的应用就是将两个交换机连接起来形成一个扩展的局域网,如图所示:工作过程 第一次打开网桥/交换机时,它的数据库...原创 2018-05-22 23:36:58 · 23903 阅读 · 0 评论 -
STL容器:优先队列priority_queue
priority_queue顾名思义,是一个具有权值概念的queue,它和queue一样允许加入新元素、移除旧元素等功能。由于这是一个queue,所以只允许在底部加入元素,从顶部取出元素。但优先队列带有权值概念,其内的元素自动按照元素的权值排序。权值最高者排在最前面。 STL的priority_queue用二叉堆来实现,关于二叉堆的实现以及堆排序在另外的文章:二叉堆、堆...原创 2018-04-24 08:48:41 · 295 阅读 · 0 评论 -
IP地址结构
分类寻址(网络号+主机号) 在最初定义Internet地址结构时,每个单播IP地址都有一个网络部分,用于识别接口使用的IP地址在哪个网络中可被发现;以及一个主机地址,用于识别由网络部分给出的网络中的特定主机。因此,地址中的一些连续位称为网络号,其余连续位称为主机号。 基于上述分类方法,IPv4地址按照网络号和主机号的长度被分为五大类。A、B、C类用于为Internet(单播地址)中的设备接口分配地...原创 2018-05-16 23:55:29 · 27524 阅读 · 0 评论 -
端到端原则与命运共享原则
端到端原则 当我们设计一个大的系统(例如操作系统或网络协议族)时,总会遇到“在什么位置实现某个功能”的问题。端到端原则(The End-To-End Arguments)起初就是为了解决在通信系统中的在什么地方增加功能最合适,然而在接下来的时间里,它被用来维护公开性、增强可靠性健壮性、保护用户的选择权和使用户的开发更容易等。在计算机网络中,它对网络体系结构的发展具有核心指导意义。...原创 2018-05-13 11:13:16 · 3696 阅读 · 1 评论 -
面向连接与无连接
面向连接与面向无连接是两种方法,在网络中用于相关网络协议的制定(例如TCP是面向连接的,而UDP是面向无连接的),在应用中,它们代表着数据通信的两种不同的传输数据技术。本文主要指协议与服务。 面向连接(Connection-Oriented) 面向连接协议是TCP/IP协议族的重要组成部分,面向连接依赖发送方和接收方之间的显示通信和阻塞以管理双方的数据传输,...原创 2018-05-13 11:23:50 · 15521 阅读 · 0 评论 -
以太网帧
帧格式 以太网帧(Ethernet frame)是符合以太网标准的链路层协议数据单元(PDU),其格式有Ethernet V1、Ethernet V2、RAW 802.3、IEEE 802.3/802.2 LLC和IEEE 802.3/802.2SNAP。现在大多数网络应用都使用Ethernet V2格式,而交换机之间的BPDU则采用IEEE802.3/LLC格式。但所有的以太网(...原创 2018-05-20 20:46:59 · 14248 阅读 · 4 评论 -
局域网
定义 局域网(Local Area Network,LAN)是指在某一区域内由多台计算机互联组成的计算机组。从功能上,局域网被定义为若干台计算机或其他设备在彼此相隔不远的物理范围内,以允许用户互相通信和共享资源的方式互连在一起的系统。而从技术上,局域网则是由特定类型的传输媒体(如光缆、电缆和无线路由)和网络适配器(网卡)互连在一起的计算机组。功能性定义强调的是外界行为和服务,技术性定义强调的是结构...原创 2018-05-21 20:08:41 · 3180 阅读 · 0 评论 -
虚拟局域网
局域网的发展是虚拟局域网的基础,局域网(LAN)通常是一个单独的广播域,主要由网桥或交换机等网络设备连接同一网段内的所有节点形成。处于同一个局域网之内的网络节点之间可以直接通信,而处于不同局域网段的设备之间的通信则必须经过路由器才能通信。 随着网络的不断扩展,接入设备逐渐增多,网络结构也日趋复杂,必须使用更多的路由器才能将不同的用户划分到各自的广播域中,在不同的局域网之...原创 2018-05-21 20:47:58 · 17024 阅读 · 1 评论 -
IP地址表示
IP地址 IP地址(Internet Protocol Address)是因特网中使用的网络层地址,全称为因特网协议地址,又译为网际协议地址。连接到Internet的每个设备至少有一个IP地址,用以接入Internet收发数据。IP地址表示IPv4 IPv4地址通常采用电分四组(或称点分十进制)表示法,例如0.0.0.0,165.197.45.0等。点分四组表示法由四个用点分隔的十进制数组成。实际...原创 2018-05-15 23:27:20 · 4148 阅读 · 0 评论 -
Linux C网络编程基础
目录Linux套接字结构定义Linux C的网络基础操作函数字节顺序转换函数族IP地址转换函数族域名转换函数Linux网络套接字操作函数创建套接字描述符函数绑定套接字函数建立连接函数倾听套接字切换函数接收连接函数关闭连接函数套接字读写函数套接字地址获取函数发送和接收函数Linux套接字结构定义Linux在头文件<sys/so...原创 2018-08-12 16:23:09 · 10907 阅读 · 1 评论 -
UDP
概述 用户数据保协议(User Datagram Protocol,UDP)是开放系统互联模型(Open System Interconnection,OSI)中传输层协议的一种,是一种保留消息边界的简单的面向数据报的协议。UDP不提供差错纠正、队列管理、重复消除、流量控制和拥塞控制,但提供差错检测(包含我们在传输层中碰到的第一个真实的端到端(end-to-end)校验和)。这种协...原创 2018-08-13 22:54:34 · 7373 阅读 · 2 评论 -
TCP拥塞控制
路由器因无法处理高速率到达的流量而被迫丢弃数据信息的现象称为拥塞。即使仅有一条通信连接,也可能造成一个甚至多个路由器拥塞,若不采取对策,网络性能将受到很大影响以致瘫痪(最坏情况下甚至形成拥塞崩溃)。为避免或在一定程度上缓解这种状况,TCP规定通信的每一方都要实行拥塞控制机制。拥塞检测 针对丢包现象,TCP采取的首要措施是重传,包括超时重传和快速重传。但简单的重传有...原创 2018-09-19 17:50:27 · 920 阅读 · 1 评论 -
Go的基本数据类型
整数与其他程序设计语言一样,Go的整型也分为有符号整型和无符号整型两类。有符号整型有int、int8、int16、int32、int64;无符号整型有uint、uint8、uint16、uint32、uint64、uintptr。上述整型中,后面带数字的整型有明确的大小,数字即代表比特位。int、uint、uintptr的大小并不明确,或者说与编译器相关。uintptr足以完整存放指针,仅用于...原创 2019-01-31 21:36:43 · 888 阅读 · 0 评论 -
Go语言的常量
Go语言的常量是一种表达式,常量可以保证在编译阶段就计算出表达式的值。所有的常量本质上都属于基本类型:数字、布尔型、字符串等。Go语言的常量定义与变量类似,只不过使用了const关键字修饰,但不能使用短变量声明关键字 := 来定义常量。对于常量操作数,所有数学运算、逻辑运算和比较运算的结果依然是常量,常量的转换结果和某些内置函数的返回值(例如len、cap、real、imag、complex和...原创 2019-02-01 22:24:51 · 873 阅读 · 0 评论 -
Go语言的函数特性
函数声明Go语言的每一个函数声明都包含一个函数名、一个形参列表、一个可选的返回列表以及函数体:func name(parameter-list) (result-list) {body}上述函数声明的语法通式中,若函数仅有一个或没有返回值,返回列表的圆括号可以省略。函数的类型称作函数签名。当两个函数拥有相同的形参列表和返回列表时(形参和返回值的名字不作为判断依据),这两个函数的类型或签...原创 2019-02-02 23:41:02 · 261 阅读 · 0 评论 -
Go语言的结构体
概述与C相同,Go的结构体是零个或多个任意类型的命名变量组合在一起的聚合数据类型,每个变量叫做结构体的成员。结构体的每个成员都通过点号来访问。定义结构体时,成员通常一行写一个,但相同类型的成员也可以写在同一行上。但需要注意的是:成员的顺序对于结构体同一性很重要,如果我们将变量的定义顺序调换或者将本来单行定义的变量写成同一行(或反之),那么我们就会定义一个不同的结构体类型。命名结构体类型...原创 2019-02-06 22:49:35 · 245 阅读 · 0 评论 -
Go语言的方法
目录方法概述 嵌套结构体中的方法调用方法变量方法表达式封装方法概述尽管Go没有统一的面向对象编程(OOP)的定义,但依然支持方法(C++中常叫做成员函数)。因为对我们来说,对象就是一个值或变量,并且拥有其方法,而方法是某种特定类型的函数。OOP就是使用方法来描述每个数据结构的属性和操作。Go语言的方法声明和普通函数声明类似,只是在函数名前面多了一个参数。这个参数把这...原创 2019-02-09 23:44:05 · 613 阅读 · 0 评论 -
Go语言的接口
概述接口是一种抽象类型,是对其他类型行为的概括与抽象,从语法角度来看,接口是一组方法定义的集合。很多面向对象的语言都有接口这个概念,但Go语言接口的独特之处在于它是隐式实现。换句话说,对于一个具体的类型,无须声明它实现了哪些接口,只要提供接口所必需的方法即可。这种设计让编程人员无须改变已有类型的实现就可以为这些类型创建新的接口——对于那些不能修改包的类型,这一点特别有用。以Go标准库中的f...原创 2019-02-12 12:45:09 · 4637 阅读 · 3 评论 -
Go语言的类型断言
类型断言是一个作用在接口值上的操作,写出来类似于x.(T),其中x是一个接口类型的表达式,而T是一个类型(称为断言类型)。类型断言会检查作为操作数的动态类型是否满足指定的断言类型,这有两种可能:1.如果T是一个具体类型,那么类型断言会检查x的动态类型是否为T。如果是则检查成功,类型断言的结果就是x的动态值,类型就是T,如果不是则检查失败。2.如果T是一个接口类型,那么类型断言会检查x的动态...原创 2019-02-12 14:51:46 · 921 阅读 · 0 评论 -
TCP滑动窗口与流量控制
TCP采用可变滑动窗口来实现流量控制。TCP连接的两端交互作用,互相提供数据流的相关信息,包括报文段序列号、ACK号和窗口大小(即接收端的可用空间)。发送端根据这些信息动态调节窗口大小来控制发送,以达到流量控制的目的。每个TCP头部的窗口大小字段表明接收端可用缓存空间的大小,以字节为单位。该字段长度为16位,但窗口缩放选项可用大于65535的值。报文段发送方在相反方向上可接受的最大序...原创 2018-09-19 10:53:26 · 13737 阅读 · 1 评论 -
TCP重传机制
由于TCP的下层网络(IP)可能出现丢失、重复或失序的情况,TCP协议提供可靠数据传输服务。为保证数据传输的正确性,TCP会重传其认为已丢失(包括报文中的比特错误)的包。TCP使用两套独立的机制来完成重传,一是基于时间,二是基于确认信息的构成。 第一种基于时间的重传在其下的数据链路层、网络层乃至同层的UDP协议都有使用,即设置一个计时器来判断数据传输是否超时,当然它们...原创 2018-09-18 21:47:57 · 28892 阅读 · 0 评论 -
Linux的信号机制
信号机制信号机制是一种使用信号来进行进程之间传递消息的方法,信号的全称为软中断信号,简称软中断。信号的本质是软件层次上对中断的一种模拟(软中断)。它是一种异步通信的处理机制,事实上,进程并不知道信号何时到来。在头文件<signal.h>中定义了64种信号,这些信号的名字都以SIG开头,且都被定义为正整数,称为信号编号。可以用“kill -l”查看信号的具体名称。上图中编...原创 2018-08-23 13:53:42 · 6640 阅读 · 1 评论 -
浮点数初探及C++类型转换规则
浮点数简要介绍:浮点数是C++的第二组基本类型。我们对浮点数最直观的认识就是能表示带小数部分的数字。但浮点数在计算机究竟是如何存储及表示的呢?以十进制数824.33和8.2433为例,这两个数的区别在于小数点的位置。我们都知道,这两个数用科学计数法可以分别表示成8.2433×102和8.2433×101,浮点数为计算机用一个定点数与一个基数(一般为2)的幂的乘积来近似(注意是近似)表示一个实数...原创 2017-04-26 23:05:52 · 1195 阅读 · 0 评论 -
Linux C多进程编程基础
关于进程概念相关的内容请打开链接,本文所介绍的是进程的POSIX标准。进程的关系 Linux中的所有进程都是相互联系的,进程之间的的从属关系有父/子关系和兄/弟关系。 Linux内核创建了进程标号为0以及进程标号为1的进程。其中PID为1的进程是初始化进程init,Linux中的所有进程都是由其衍生而来的,在shell下执行程序启动的进程则是shell进程的子进...原创 2018-08-20 23:15:51 · 3894 阅读 · 0 评论 -
Linux C多线程编程基础
获取线程标识符 每一个线程都有一个在进程中唯一的线程标识符,在Linux中用一个数据类型pthread_t来表示,实际上这个类型是一个机器相关的无符号整型数据。 Linux提供了两个函数用于获取和比较线程标识符。#inlcude <pthread.h>pthread_t pthread_self(void); //返回值是线程自身的线程标...原创 2018-08-23 21:36:26 · 2492 阅读 · 0 评论 -
Linux C互斥锁和条件变量(POSIX标准)
与进程类似,线程也存在同步的问题,当多个控制线程共享相同的内存时,需要确保每个线程看到一致的数据视图,如果每个线程使用的变量都是其他线程不会读取或修改的(比如线程私有数据),就不会存在一致性问题。通常来说用户可以使用互斥量(互斥锁)或者的条件变量(条件锁)的方式来解决线程的同步问题。互斥锁 互斥锁是一个简单的锁定命令,它可以用来锁定共享资源使得其他线程无法访问。互...原创 2018-08-24 13:26:52 · 12224 阅读 · 6 评论 -
TCP连接的建立与终止
TCP是一种面向连接的单播协议,在发送数据之前,通信双方必须在彼此之间建立连接。虽然TCP和UDP使用相同的网络层(IPv4或IPv6),但是TCP给应用程序提供了一种与UDP完全不同的服务——面向连接(connection-oriented)、字节流传输。TCP可靠性TCP提供了一个字节流接口,TCP必须把一个发送应用程序的字节流转换成一组IP可以携带的分组,这被称为组包(packeti...原创 2018-08-30 23:19:38 · 4506 阅读 · 0 评论 -
TCP状态转换
TCP状态转换图 TCP连接的建立与终止,以及在连接的不同阶段需要发送的各种类型的报文段,实质上都是由TCP所属的状态决定的。当前的状态会在各种触发条件下改变,状态转换规则可以概括为如下所示的TCP状态转换图: TCP初始化时从CLOSED状态启动,通常根据是执行主动打开操作(客户端请求)还是被动打开操作(服务器接收请求),TCP将分别转换到SYN_SENT或L...原创 2018-09-17 21:57:55 · 2133 阅读 · 0 评论 -
重置报文段与TCP连接错误处理
当TCP头部中的RST位被置位时,该报文段就被称作“重置报文段”。一般来说,当发现一个到达的报文段对于相关连接而言是不正确的,TCP就会发送一个重置报文段(所谓的相关连接是指由重置报文段的TCP与IP头部的4元组所指定的连接)。重置报文段的触发通常在以下场景中。针对不存在端口的连接请求通常情况下,当一个连接请求到达本地却没有相关进程在目的端口侦听时就会产生一个重置报文段。UDP协议规定,当...原创 2018-09-18 20:21:20 · 1119 阅读 · 0 评论 -
Go并发编程——goroutine与channel
goroutine并发编程表现为程序由若干个自主的执行单元组成,在Go里,每一个并发执行的活动称为goroutine。从宏观作用上看,goroutine类似于操作系统或其他编程语言中的进程/线程,但实现却大不相同。Go语言中,当一个程序执行时,只有一个goroutine来调用main函数,这个routine称为主goroutine,新的goroutine通过关键字 go 进行创建——在函数...原创 2019-02-15 01:56:45 · 654 阅读 · 0 评论