网络编程
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+3SMSS大小。
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:
[; path=
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+树查找(非线性索引查找):其本质利用的是二分查找进行快速查找。先自顶而下快速定位到某个范围区间,
在节点内部再根据二分查找,快速查找到叶子节点中的数据
