网络编程
    1 通过计算机程序来实现网络的通信协议,或遵循已有的协议规范,通过编程来实现计算机间的数据交换。
    网络协议
    1 为实现网络通信而制定的一系列规则。
    TCP/IP协议
    1 TCP/IP是互联网的基石协议。
    2 在诞生之初,TCP/IP只包含TCP与IP协议,随着协议的蓬勃发展,TCP/IP不断地纳入了其它的协议,由此演变成了现在的TCP/IP协议栈。
    3 我们在进行网络编程时,主要是使用套接字(socket)所提供的接口来使用系统中的TCP/IP协议栈的数据传输服务。
    TCP/IP协议栈
    1 链路层、网络层、传输层、应用层(每一层有哪些协议,都需要掌握)
    2 以HTTP为例,当客户端发起一个HTTP请求时,应用层、传输层、网络层和链路层的相关协议依次对该请求进行封装并添加对应的
    首部,最终在 链路层生成以太网数据包。 以太网数据包通过物理介质传输给对方主机,对方接收到数据包以后,再逐层采用对应
    的协议进行解包,最终把HTTP数据交给应用程序处理。
    IP协议
    1 目前的IP协议版本分为4和6,前者称为IPv4 ,后者称为IPv6,IPv4使用4个字节来表示一个ip地址,而IPv6使用16个字节,当前使用最广泛的仍是IPv4。
    2 IPv4的地址数量有限,IPv6会逐渐替代IPv4。
    3 IP地址的本质是数字,用户常见的IP地址是点分十进制形式的IPv4地址, 通过点号将地址分成了四组,每个字节为一组,
    每组的范围在0-255之间,例如:127.0.0.1。
    4 IP协议的主要特性:①不可靠,无状态传输。②路由寻址。
    ip路由重点掌握
    IP地址分类
    1 IPv4地址由两部分组成: 网络号+主机号。
    2 A类:网络号占1个字节,主机占3个字节。网络号最高位必须是0。
    3 B类:网络号占2个字节,主机占2个字节。网络号最高位必须是10。
    4 C类:网络号占3个字节,主机占2个字节。网络号最高位必须是110。
    5 D类:多播地址,前四位必须为1110,后28位表示多播组号。
    子网掩码
    1 通过子网掩码可以明确知道当前地址中的网络号,子网号,主机号。 子网掩码有32位,
    其中bit为1的留给网络号和子网号,bit为0的留给主机号。
    2 通过子网掩码可以判断两个ip地址是否在同一个网络内。
    ip地址分别和子网掩码做与运算,结果相等就是在同一个网络内。
    3 计算出ip地址的主机号,通过对子网掩码进行非运算,在用ip地址与子网掩码进行与运算可以得到主机号。
    TCP协议
    1 TCP协议的主要特性,可概括为以下三点: (1) 面向连接 (2) 字节流 (3) 可靠传输 .
    2 所谓面向连接,是指通信双方必须先建立一对一的连接,然后才能进行消息的收发操作。
    连接是指软件上的连接,不是物理上的。
    3 字节流是指无边界传输,发送方不会指明消息的长度,消息的发送次数与读取次数并不是对等的关系。
    无边界是指字节流长度没有符号分隔,数据都是连接在一起的。
    4 可靠传输,是指协议本身提供了应答确认,超时重传,拥塞控制等机制来保证消息的可靠传输。
    TCP报文格式
    1 源端口,目的端口,IP数据报中的源IP,目的IP,用来唯一确定一条TCP连接
    2 32位序号用来标识发送端的字节流编号。
    3 32位确认号用来标识对发送端的确认,通常为发送方的序号+1。
    4 4位首部长度用来标识报文首部有多少个32bit。
    5 校验和由发送端填充,接收端通过该字段检验头部+数据是否损坏。
    TCP协议三次握手与四次挥手
    1 建立连接的第一个TCP报文包含SYN标志,同时初始化一个序列号(ISN)。
    SYN是发送序列号
    2 第二个TCP报文包含SYN标志,同时包含一个ACK标志,确认序号为第一个TCP报文的ISN+1。
    3 第三个TCP报文只包含ACK标志,确认序号为第二个TCP报文的ISN+1。
    4 退出TCP连接是一样的原理,由SYN标志变为FIN标志。
    5 SYN标志表示建立连接,FIN标志表示退出连接。
    TCP状态转移
    1 TCP连接的任意一端在任意时刻都处于某种状态,在Linux中通过netstat命令查看当前状态:netstat -tlan。
    2 服务器通过listen系统调用进入LISTEN状态,收到客户端的SYN包以后,发送一个ACK包,
    进入SYNC_RECVD状态。成功建立连接以后处于ESTABLISHED状态。
    3 客户端主动关闭连接后,处于FIN_WAIT_1状态,服务端返回一个ACK包后处于CLOSE_WAIT状态,
    同时向客户端发送一个FIN包,客户端处于TIME_WAIT状态。
    TIME_WAIT状态
    1 TCP客户端在收到服务端发送的FIN报文以后,并没有立即进入CLOSED状态,因为假设服务器的FIN报文丢失,
    那么服务器会进行重传,这样可以保证可靠地终止TCP连接。
    2 可以给TIME_WAIT状态设定的等待时间为2MSL,而TCP报文在网络中的最大生存时间为MSL,
    就可以保证新的TCP连接不会受到旧报文的影响。
    3 总结TCP的可靠性:(1)建立连接的可靠性(2) 数据传输的可靠性(3) 退出连接的可靠性。
    TCP协议中的应答确认(接收端)
    1 应答确认:TCP传输数据的过程中,接收方每次收到数据都会对传输方发送一个ACK报文。这个ACK报文带有确认序列号,
    发送方根据确认序列号的下一个位置继续发送数据。
    2 接收端延迟确认:TCP协议中的延迟确认用来改善网络性能,将几个ACK响应组合在一起成为单个响应,
    或者将ACK响应与响应数据一起发送给对方,从而减少协议开销。延迟确认机制如下:
    ①当有响应数据要发送时,ACK会随响应数据立即发送给对方;
    ②如果没有响应数据,ACK将延迟发送,以等待是否有响应数据可以一起发送。在linux系统中,这个延迟时间默认为40ms
    ③如果在等待发送ACK期间,对方的第二个数据包又到达了,此时要立即发送ACK。
    这里不等待的原因:第二个数据包已收到,说明已经延时,无需再等待。否则加长延时,影响性能。
    TCP协议中的Nagle算法(发送端)
    1 Nagle算法的基本定义:任意时刻,最多只能有一个未被确认的小段。 所谓”小段”,是指小于MSS的数据块,所谓”未被确认””,
    是指发送消息以后,未收到对方发送的ACK确认报文。使用Nagle算法可以提升网络带宽的利用率,减少网络拥堵。
    MSS的大小是指1460大小的字节。
    提升的原理:规定一个等待时间,等待一定数量的小段,再一起发送。不会有很多的小段在频繁发送。
    2 Nagle算法主要规则
    ①数据包长度达到MSS,则允许发送;
    ②数据包包含FIN标志位,则允许发送;
    ③套接字设置了TCP_NODELAY选项,则允许发送;
    ④未设置TCP_CORK选项时,若所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送;
    ⑤一旦发生超时(一般为200ms),则立即发送。超时是指没有收到对方的确认。表示对方没有手动,重新补发。
    TCP协议的超时重传
    1 协议栈中的TCP模块在每次发送数据包时,都会启动一个定时器,在超时时间内如未收到接收方的应答确认,则会对数据包进行重传。
    tcpdump命令简介
    1 tcpdump命令常用关键字与常用选项:在tcpdump中可使用and,or,not等操作符组合成复杂的抓包命令
    疑点:对捉包不理解
    拥塞控制:慢启动算法
    1 lTCP连接建立好以后,系统会初始化一个拥塞窗口(CWND),该窗口指明了发送端最多发送的字节大小(IW)。发送端每接收到一个
    确认,CWND会增加一个报文段。例如初系统始化时CWND的大小为1个报文段(MSS:1460),收到应答以后,CWND变为2个报文段。
    在这2个报文段的基础上,又收到应答确认,则CWND变为4个报文段。
    2 l拥塞窗口实际是以指数形式增加,为防止窗口过快膨胀,系统设定了一个阈值ssthresh,超出该阈值则进入拥塞避免阶段。
    在拥塞避免阶段CWND按照以下算法线性增加(1个RTT内只更新一次CWND):CWND += SMSSSMSS/CWND
    当发送端检测到拥塞发生时,比如传输超时或收到重复确认,则ssthresh减小为当前窗口大小的一半。如果是超时引起的拥塞,
    则CWND重置为1个报文段大小。这就是所谓的慢启动算法。
    拥塞控制:快速重传与快速恢复
    1 发送端收到1次重复确认,并不表示真的发生了网络拥塞。为检测是否真的发生了拥塞,TCP发送端假设连续收到3个重复的确认,
    就认为发生了拥塞。然后启动快速重传和快速恢复算法来处理拥塞:
    连续收到第3个重复确认的报文以后,将ssthresh减小为当前窗口大小的一半,同时设置CWND为ssthresh+3
    SMSS大小。
    2 在这一期间,即使数据包未超时,也立即重传,这就是所谓的快速重传。
    此后每收到1个重复的确认,就设置CWND为CWND+SMSS大小
    当收到新数据包的确认以后,将CWND重置为ssthresh大小,恢复到拥塞避免阶段。此即快速恢复。
    UDP协议
    1 数据报式传输:这类传输的特点是,数据传输不是连续的,信息与信息之间有明确的边界,发送端每次发送的数据,
    接收端收到的都是一个完整独立的数据包。
    2 无连接,不可靠:通信双方在使用UDP协议进行通信前,无需建立逻辑上的连接,也无应答确认、
    超时重传等机制来保证数据传输的可靠性。
    3 速度快,实时性强:UDP协议的无连接特性,数据传输无需应答确认,使得在数据传输的实时性方面优于TCP协议。
    UDP报文格式
    1 16位UDP长度指明了UDP数据报文的长度。
    2 16位校验和是可选的,对首部与数据计算了校验和。
    HTTP协议
    1 HTTP协议是一种请求-响应式协议,客户端发起一个http请求,服务端再对该请求作出响应。
    以用户通过浏览器访问网页为例,来理解http的请求-响应过程:
    ①打开浏览器,在浏览器中输入某网页的url
    ②浏览器对url进行解析,会得到一个IP地址和端口号,如果url中未出现端口号,那么选择http协议的默认端口号80。
    ③浏览器根据得到的IP地址与端口号,建立一个TCP连接
    ④TCP连接建立成功以后,浏览器发起一个http请求
    ⑤http服务器收到该请求,对请求进行解析,再将网页内容发送给浏览器
    ⑥浏览器对服务端返回的HTML文本进行解析和渲染,用户最终看到了网页内容
    2 URL是统一资源定位符,HTTP协议使用URL来进行资源的定位。 HTTP URL的常用形式:http://:/?
    HTTP协议请求方法
    1 GET :幂等请求,表示获取服务器上的资源,使用get请求时,请求参数会在URL中进行体现。
    2 POST :非幂等请求,表示向服务器提交资源,以让服务器进行处理,请求参数不会出现在URL中,而是出现在请求体中。
    从语义上来说,post请求是作为一种写操作,而get请求则作为读操作,读操作容易被浏览器缓存。
    3 PUT :幂等请求,与POST请求类似,表示对服务器的特定资源进行更新,如果服务器上无此资源,会先进行创建。
    4 DELETE :幂等请求,表示对服务器的特定资源进行删除
    HTTP协议请求格式主要分为:请求行,请求头,请求体。
    1 请求行的格式为:METHOD URL HTTP/VERSION CRLF。
    2 请求头里面包含的是字段名/字段值对,格式为字段名:字段值,字段名/字段值对以回车换行符进行分隔。
    3 请求体中通常包含的是请求的参数信息,请求体中的内容由应用程序负责解。析。
    4 html的1.1版本使用默认是长连接,服务器处理完请求后不会马上关闭。可以发起n次请求,keep-alive 。
    短链接,服务器处理完请求后,会马上关闭连接。只能发送1次请求,处理完就关闭,影响性能。
    HTTP协议响应格式主要分为:状态行,响应头,响应体。
    1 状态行的格式为:HTTP/VERSION STATUS REASON CRLF 。
    2 响应头里面包含的是一系列字段名-字段值对,格式为字段名:字段值。字段名-字段值对以回车换行符进行分隔。
    3 响应体表示响应的具体内容.
    4 如果是get请求,重定向是没有区别的。
    如果是post请求,服务器会重新响应一个新的url请求。
    HTTP是无状态协议
    1 无状态是指每一次请求都是独立的,不会携带状态信息。
    2 请求独立意味着请求与请求之间不保存上下文信息。
    3 例如浏览器前后向http服务器发起两次请求,服务器处理完第1次请求,立即关闭连接,
    处理浏览器的第2个请求时再重新建立连接。这两次请求彼此独立,互不依赖。
    说明这是短链接。
    4 优点:HTTP协议的无状态特性简化了服务端的处理。
    服务端无需关心客户端的N次请求是否相关,只需简单地根据当前请求的参数进行特定处理,处理完毕以后,再关闭连接。
    5 如何让HTTP变成有状态呢?用cookie
    客户端cookie
    1 cookie是保持客户端连接状态的必要性的一种解决方案。(保存上下信息)
    2 cookie是网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),
    由用户客户端计算机暂时或永久保存的信息。 (例如一些网页下次登录时无需输入信息,直接登录即可)
    cookie的核心:
    1 cookie是文本文件
    2 cookie文件中存储的数据用来识别用户身份
    3 cookie暂时或永久地保存于用户所在的计算机中
    Set-Cookie
    1 Set-Cookie是在HTTP服务器对用户验证成功以后向客户端发送的一个响应字段,包含在HTTP响应的头部中。
    2 Set-Cookie响应头的格式:Set-Cookie: =[; =][; expires=][; domain=]
    [; path=][; secure]
    Cookie
    1 Cookie是HTTP客户端向HTTP服务器请求时所携带的请求字段,包含在HTTP头部,用来向服务器发送用户的状态信息。
    这里的状态信息实际是服务器在Set-Cookie字段中响应的状态信息。服务器会根据HTTP请求头中的cookie字段的
    信息来进行验证,验证通过以后,用户的状态才得以延续。
    2 浏览器不仅是HTTP客户端,还是一个方便的网络调试工具,在浏览器中可以分析HTTP的请求过程,
    以及查找HTTP请求的字段信息。
    单点登录(sso)
    1 cookie保存pc端的登录信息。(是由服务端的set-cookie保存相关信息)
    2 app端在访问系统或子系统时,会通过cookie验证,可直接访问,无需再登录。
    3 反过来,先登录子系统,保存的信息,下次登录顶级系统时,则需要重新登录。
    服务端Session(会话)
    1 用户登录成功站点以后,服务端会创建一个标识用户身份的cookie,然后将cookie响应给客户端。
    2 用户下次访问站点时,浏览器会从缓存或磁盘中读取cookie信息,如果cookie未过期,并且与请求的站点
    信息(域名,请求URL等)匹配,那么会将cookie写入HTTP请求头,发送至服务端进行验证。
    3 服务端是怎么进行验证的呢?
    以用户登录进行举例,用户在登录成功以后,服务端会在内存中为该用户创建一个session,该session保存了用户的状态信息。
    同时为当前session分配一个唯一的编号。在上节中讲到了Set-Cookie,服务端在发送cookie时,会将该编号写入Set-Cookie的字段中。
    HTTP Set-Cookie请求头举例
    pass
    HTTP缓存控制:Cache-Control(优先级高)
    pass
    代理服务器
    1 正向代理,例如在用爬虫时,用代理ip进行工作,被封时,不会影响到本地主机的ip地址。
    有专门的ip池,需要钱的。
    正向代理也有缓存。
    2 反向代理,例如nginx。反向代理可以用缓存机制(cache),减少源服务器被访问的压力。
    3 源服务器,
    HTTP缓存控制:Expires
    pass
    缓存控制:Last-Modified/If-Modified-Since
    pass
    缓存控制:ETag/If-None-Match
    pass
    F5与CTRL+F5
    手动重新获取请求是否变更
    pass

    Socket编程
    1 socket即套接字,应用程序在使用传输层进行数据通信时,可以通过套接字中的相关函数来完成数据的通信。
    2 在TCP/IP网络应用中,通信的两个进程,通常采取的是客户/服务器模式,客户端向服务器发出请求,服务器接收到请求后,
    再提供相应的服务。
    3 TCP/IP协议中的传输层为客户端进程和服务端进程提供端到端的通信,端到端是指逻辑上的连接,这里的”端”,
    实质是应用程序的端口号。
    4 socket是IP地址与端口号的组合,形如(IP:PORT)的格式, 服务端的socket与客户端的socket组成了一个唯一的套接字对。
    socket模块
    1 Python内置了一个基本的socket模块,通过socket模块可以访问套接字接口的全部方法。
    2 使用socket进行编程,可以实现网络的主机间或主机内部的进程间的通信。
    socket对象常用方法
    pass
    Socket编程的核心流程:服务端
    1 通过socket模块的socket方法初始化一个套接字对象,根据具体的需求,选择流式套接字还是数据报套接字
    2 通过socket对象的bind方法将套接字对象与套接字地址进行绑定
    3 如果是流式套接字,需要执行listen方法,以监听客户端的TCP连接请求,然后再执行accept方法来获取连接的socket对象。
    数据报套接字是无连接的,不需要listen和accept。
    4 流式套接字通过已连接的socket对象,执行recv或send方法与客户端进行数据的收发,
    数据报套接字直接通过socket对象与客户端进行数据的收发(执行recvfrom和sendto方法)。
    5 关闭套接字对象,释放资源。
    Socket编程的核心流程:客户端
    1 通过socket模块的socket方法初始化一个套接字对象,根据具体的需求,选择流式套接字还是数据报套接字
    2 如果是流式套接字,需要先执行connect方法,向服务端发起一个TCP连接,然后再进行数据的收发,
    数据报套接字是无连接的,直接通过socket对象与服务端通信。
    3 关闭套接字对象,释放资源
    HTTP编程
    1 http协议是一种应用层协议,通常的实现是基于TCP协议来实现数据的可靠传输。python中的http包,
    集合了多个用于处理http协议的模块。
    http包的主要模块
    pass
    HttpSever类
    pass
    BaseHTTPRequestHandler类
    pass
    BaseHTTPRequestHandler对象的常用方法
    pass
    **

    常用的数据结构
    1 线性结构:其直观的表现就是一条直线。逻辑结构表现为一条直线的结构就是线性结构
    2 非线性结构:表现为一条非直线的就是非线性结构。
    顺序表与链表
    1 在内存中占据了某一段连续空间的存储结构,叫做顺序存储。基于顺序存储的表结构就叫做顺序表,
    Python中的字符串,列表,元组,其底层实现都基于顺序表
    2 顺序表的优势在于,可以根据索引来快速定位某一个内存单元。
    不足在于查找具体的值时,需要从头进行遍历。
    3 顺序存储的空间是固定的,元素较少时,会浪费内存空间。超出存储空间阈值时,需要重新分配内存。
    4 基于链式存储的表结构,就叫做链表,链表也是一种线性表。
    5 链表中的节点通过内存编号链接到下一个节点,节点间的前后关系可通过前驱和后继来进行表示。
    6 链表通常为非连续存储,不能通过索引来快速定位,但它的优势在于在对链表进行插入和删除操作时,
    只需修改节点中的内存编号。
    顺序表与哈希表
    1 优化顺序表的查找性能,主要有两种方法,一是将顺序表中的值进行排序,然后利用二分查找算法来快速查找。
    二是利用哈希表。
    2 哈希表中的每一个表单元存储了键名在数据表中的索引,这样下次对键进行查找时,
    即可直接按索引去数据表中查找
    3 哈希冲突:线性探测、链式法去解决。
    栈与队列
    1 栈是一种后进先出的数据结构(LIFO)。
    2 队列是基于FIFO的数据结构。FIFO即先进先出.
    3 跨机器通信,可以用redis里面的队列通信(网络通信)。(分布式锁、阻塞队列都是考点)
    4 管道也可以通信,但不是安全的。队列是加了锁的管道,所以队列是安全的。
    树结构
    1 树结构是一种非线性结构,没有父节点的被称为根节点。没有子节点的则被称为叶子节点。
    2 链表也是树结构,特殊的树结构。

    常用的算法
    1 对算法进行分析,主要分析的是算法的执行时间以及占用的空间。
    时间复杂度
    1 时间复杂度,通常分析的是在最坏情况下的执行时间。
    2 在数据结构与算法这门基础课程中,使用大O表示法来度量算法执行时间的上界,
    即假设存在正常数c以及n0, 当N>=n0时,满足T(n)<=cf(n),则记为T(n)=O(fn)。
    排序算法
    1 稳定性:指数据集合中有多个等值的数据,在排序后,相对位置保持不变的。
    2 冒泡排序:相邻元素两两间进行比较,按照升序或降序的关系互换位置。
    3 选择排序:从数据集合中选出最小(大)的一个元素,存放在序列的起始位置,再从剩余的未排序元素中
    寻找到最小(大)的元素,放到已排序的序列的末尾。不断重复这样的过程,直至实现排序。
    4 计数排序:利用顺序表的索引天然有序的原理,将数值映射到表中的索引,即可实现排序。
    5 桶排序:对桶排序进行简单的理解:将某一段区间的元素映射到顺序表中的一个表单元,这里的表单元即桶。
    6 快速排序:采用分而治之的思想,每次选取一个中间值(一趟排序),将数据集分为左右两区间,
    左区间的元素均小于该中间值,右区间的元素均大于该中间值。(没看懂)
    7 堆排序:利用堆结构的特性来实现排序
    8 并归排序:采用分而治之思想,先递归对半拆分,后递归两两合并。
    查找算法**
    1 二分查找:先对数据集合进行排序,然后每次与中间位置的元素进行比较,相等则直接返回,
    不相等则根据数据集合升序或降序来查找另外一半区间。
    2 哈希查找:对待查找的元素计算哈希值,再映射到哈希表,以进行快速查找
    3 单词查找数:Trie是一种树结构,除根节点外,每个节点只包含一个字符。在Trie结构中,
    可以利用字符串的公共前缀来减少查询时间,以最大限度地减少无谓的字符串比较。
    4 B+树查找(非线性索引查找):其本质利用的是二分查找进行快速查找。先自顶而下快速定位到某个范围区间,
    在节点内部再根据二分查找,快速查找到叶子节点中的数据