.pom文件详解<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd "> <parent> <artifactId>xxx</artifactId> <groupId>xxx</groupId> <version>xxx</version> <relativePath>xxx</relativePath> </parent> <modelVersion> 4.0.0 </modelVersion> <groupId>xxx</groupId> <artifactId>xxx</artifactId> <packaging> jar </packaging> <version> 1.0-SNAPSHOT </version> <name> xxx-maven </name> <url> http://maven.apache.org </url> <description> A maven project to study maven. </description> <prerequisites> <maven></maven> </prerequisites> <issueManagement> <system> jira </system> <url> http://jira.baidu.com/banseon </url> </issueManagement> <ciManagement> <system></system> <url></url> <notifiers> <notifier> <type></type> <sendOnError></sendOnError> <sendOnFailure></sendOnFailure> <sendOnSuccess></sendOnSuccess> <sendOnWarning></sendOnWarning> <configuration></configuration> </notifier> </notifiers> </ciManagement> <inceptionYear /> <mailingLists> <mailingList> <name> Demo </name> <post> banseon@126.com </post> <subscribe> banseon@126.com </subscribe> <unsubscribe> banseon@126.com </unsubscribe> <archive> http:/hi.baidu.com/banseon/demo/dev/ </archive> </mailingList> </mailingLists> <developers> <developer> <id> HELLO WORLD </id> <name> banseon </name> <email> banseon@126.com </email> <url></url> <roles> <role> Project Manager </role> <role> Architect </role> </roles> <organization> demo </organization> <organizationUrl> http://hi.baidu.com/xxx </organizationUrl> <properties> <dept> No </dept> </properties> <timezone> -5 </timezone> </developer> </developers> <contributors> <contributor> <name></name> <email></email> <url></url> <organization></organization> <organizationUrl></organizationUrl> <roles> <role> Project Manager </role> <role> Architect </role> </roles> <timezone></timezone> <properties> <dept> No </dept> </properties> </contributor> </contributors> <licenses> <license> <name> Apache 2 </name> <url> http://www.baidu.com/banseon/LICENSE-2.0.txt </url> <distribution> repo </distribution> <comments> A business-friendly OSS license </comments> </license> </licenses> <scm> <connection> scm:svn:http://svn.baidu.com/banseon/maven/banseon/banseon-maven2-trunk(dao-trunk) </connection> <developerConnection> scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk </developerConnection> <tag></tag> <url> http://svn.baidu.com/banseon </url> </scm> <organization> <name> demo </name> <url> http://www.baidu.com/banseon </url> </organization> <build> <sourceDirectory></sourceDirectory> <scriptSourceDirectory></scriptSourceDirectory> <testSourceDirectory></testSourceDirectory> <outputDirectory></outputDirectory> <testOutputDirectory></testOutputDirectory> <extensions> <extension> <groupId></groupId> <artifactId></artifactId> <version></version> </extension> </extensions> <defaultGoal></defaultGoal> <resources> <resource> <targetPath></targetPath> <filtering></filtering> <directory></directory> <includes> <include></include> </includes> <excludes> <exclude></exclude> </excludes> </resource> </resources> <testResources> <testResource> <targetPath></targetPath> <filtering></filtering> <directory></directory> <includes> <include></include> </includes> <excludes> <exclude></exclude> </excludes> </testResource> </testResources> <directory></directory> <finalName></finalName> <filters></filters> <pluginManagement> <plugins> <plugin> <groupId></groupId> <artifactId></artifactId> <version></version> <extensions>true/false</extensions> <executions> <execution> <id></id> <phase></phase> <goals></goals> <inherited>true/false</inherited> <configuration></configuration> </execution> </executions> <dependencies> <dependency> </dependency> </dependencies> <inherited>true/false</inherited> <configuration></configuration> </plugin> </plugins> </pluginManagement> <plugins> <plugin> <groupId></groupId> <artifactId></artifactId> <version></version> <extensions>true/false</extensions> <executions> <execution> <id></id> <phase></phase> <goals></goals> <inherited>true/false</inherited> <configuration></configuration> </execution> </executions> <dependencies> <dependency> </dependency> </dependencies> <inherited>true/false</inherited> <configuration></configuration> </plugin> </plugins> </build> <profiles> <profile> <id></id> <activation> <activeByDefault>true/false</activeByDefault> <jdk>jdk版本，如:1.7</jdk> <os> <name> Windows XP </name> <family> Windows </family> <arch> x86 </arch> <version> 5.1.2600 </version> </os> <property> <name> mavenVersion </name> <value> 2.0.3 </value> </property> <file> <exists> /usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/ </exists> <missing> /usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/ </missing> </file> </activation> <build> <defaultGoal /> <resources> <resource> <targetPath></targetPath> <filtering></filtering> <directory></directory> <includes> <include></include> </includes> <excludes> <exclude></exclude> </excludes> </resource> </resources> <testResources> <testResource> <targetPath></targetPath> <filtering></filtering> <directory></directory> <includes> <include></include> </includes> <excludes> <exclude></exclude> </excludes> </testResource> </testResources> <directory></directory> <finalName></finalName> <filters></filters> <pluginManagement> <plugins> <plugin> <groupId></groupId> <artifactId></artifactId> <version></version> <extensions>true/false</extensions> <executions> <execution> <id></id> <phase></phase> <goals></goals> <inherited>true/false</inherited> <configuration></configuration> </execution> </executions> <dependencies> <dependency> </dependency> </dependencies> <goals></goals> <inherited>true/false</inherited> <configuration></configuration> </plugin> </plugins> </pluginManagement> <plugins> <plugin> <groupId></groupId> <artifactId></artifactId> <version></version> <extensions>true/false</extensions> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd "> <parent> <artifactId>xxx</artifactId> <groupId>xxx</groupId> <version>xxx</version> <relativePath>xxx</relativePath> </parent> <modelVersion> 4.0.0 </modelVersion> <groupId>xxx</groupId> <artifactId>xxx</artifactId> <packaging> jar </packaging> <version> 1.0-SNAPSHOT </version> <name> xxx-maven </name> <url> http://maven.apache.org </url> <description> A maven project to study maven. </description> <prerequisites> <maven></maven> </prerequisites> <issueManagement> <system> jira </system> <url> http://jira.baidu.com/banseon </url> </issueManagement> <ciManagement> <system></system> <url></url> <notifiers> <notifier> <type></type> <sendOnError></sendOnError> <sendOnFailure></sendOnFailure> <sendOnSuccess></sendOnSuccess> <sendOnWarning></sendOnWarning> <configuration></configuration> </notifier> </notifiers> </ciManagement> <inceptionYear /> <mailingLists> <mailingList> <name> Demo </name> <post> banseon@126.com </post> <subscribe> banseon@126.com </subscribe> <unsubscribe> banseon@126.com </unsubscribe> <archive> http:/hi.baidu.com/banseon/demo/dev/ </archive> </mailingList> </mailingLists> <developers> <developer> <id> HELLO WORLD </id> <name> banseon </name> <email> banseon@126.com </email> <url></url> <roles> <role> Project Manager </role> <role> Architect </role> </roles> <organization> demo </organization> <organizationUrl> http://hi.baidu.com/xxx </organizationUrl> <properties> <dept> No </dept> </properties> <timezone> -5 </timezone> </developer> </developers> <contributors> <contributor> <name></name> <email></email> <url></url> <organization></organization> <organizationUrl></organizationUrl> <roles> <role> Project Manager </role> <role> Architect </role> </roles> <timezone></timezone> <properties> <dept> No </dept> </properties> </contributor> </contributors> <licenses> <license> <name> Apache 2 </name> <url> http://www.baidu.com/banseon/LICENSE-2.0.txt </url> <distribution> repo </distribution> <comments> A business-friendly OSS license </comments> </license> </licenses> <scm> <connection> scm:svn:http://svn.baidu.com/banseon/maven/banseon/banseon-maven2-trunk(dao-trunk) </connection> <developerConnection> scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk </developerConnection> <tag></tag> <url> http://svn.baidu.com/banseon </url> </scm> <organization> <name> demo </name> <url> http://www.baidu.com/banseon </url> </organization> <build> <sourceDirectory></sourceDirectory> <scriptSourceDirectory></scriptSourceDirectory> <testSourceDirectory></testSourceDirectory> <outputDirectory></outputDirectory> <testOutputDirectory></testOutputDirectory> <extensions> <extension> <groupId></groupId> <artifactId></artifactId> <version></version> </extension> </extensions> <defaultGoal></defaultGoal> <resources> <resource> <targetPath></targetPath> <filtering></filtering> <directory></directory> <includes> <include></include> </includes> <excludes> <exclude></exclude> </excludes> </resource> </resources> <testResources> <testResource> <targetPath></targetPath> <filtering></filtering> <directory></directory> <includes> <include></include> </includes> <excludes> <exclude></exclude> </excludes> </testResource> </testResources> <directory></directory> <finalName></finalName> <filters></filters> <pluginManagement> <plugins> <plugin> <groupId></groupId> <artifactId></artifactId> <version></version> <extensions>true/false</extensions> <executions> <execution> <id></id> <phase></phase> <goals></goals> <inherited>true/false</inherited> <configuration></configuration> </execution> </executions> <dependencies> <dependency> </dependency> </dependencies> <inherited>true/false</inherited> <configuration></configuration> </plugin> </plugins> </pluginManagement> <plugins> <plugin> <groupId></groupId> <artifactId></artifactId> <version></version> <extensions>true/false</extensions> <executions> <execution> <id></id> <phase></phase> <goals></goals> <inherited>true/false</inherited> <configuration></configuration> </execution> </executions> <dependencies> <dependency> </dependency> </dependencies> <inherited>true/false</inherited> <configuration></configuration> </plugin> </plugins> </build> <profiles> <profile> <id></id> <activation> <activeByDefault>true/false</activeByDefault> <jdk>jdk版本，如:1.7</jdk> <os> <name> Windows XP </name> <family> Windows </family> <arch> x86 </arch> <version> 5.1.2600 </version> </os> <property> <name> mavenVersion </name> <value> 2.0.3 </value> </property> <file> <exists> /usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/ </exists> <missing> /usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/ </missing> </file> </activation> <build> <defaultGoal /> <resources> <resource> <targetPath></targetPath> <filtering></filtering> <directory></directory> <includes> <include></include> </includes> <excludes> <exclude></exclude> </excludes> </resource> </resources> <testResources> <testResource> <targetPath></targetPath> <filtering></filtering> <directory></directory> <includes> <include></include> </includes> <excludes> <exclude></exclude> </excludes> </testResource> </testResources> <directory></directory> <finalName></finalName> <filters></filters> <pluginManagement> <plugins> <plugin> <groupId></groupId> <artifactId></artifactId> <version></version> <extensions>true/false</extensions> <executions> <execution> <id></id> <phase></phase> <goals></goals> <inherited>true/false</inherited> <configuration></configuration> </execution> </executions> <dependencies> <dependency> </dependency> </dependencies> <goals></goals> <inherited>true/false</inherited> <configuration></configuration> </plugin> </plugins> </pluginManagement> <plugins> <plugin> <groupId></groupId> <artifactId></artifactId> <version></version> <extensions>true/false</extensions>
Web 开发的安全之旅 —— 攻击篇 - XSS - CSRF - Injection - Dos - 中间人攻击
Web 开发的安全之旅 —— 攻击篇 - XSS - CSRF - Injection - Dos - 中间人攻击生活中经常遇到诈骗的信息，Web开发中也会遇到很多安全的问题，这会危害到用户、公司、还有我们程序员自己（~要被送去祭天~）！！！下面分别从黑客与开发者的角度来看看网络安全的攻击与防御今天先来探索探索Web安全之攻击篇XSS 跨站脚本攻击 Cross-Site ScriptingXSS就是 攻击者往页面中插入攻击脚本，对页面进行攻击攻击者使用XSS，主要是利用了开发者盲目信任用户提交的内容（比如带有恶意的字符串）开发者直接把字符串生成DOM这些恶意的代码可能是document.writeelement.innerHTML = anyStringSSR(user_data) // 伪码XSS的一些特点通常难以从UI上感知（暗地执行脚本）窃取用户的敏感信息（cookie/token）绘制UI（比如弹窗），诱骗用户点击/填写表单举一个例子服务端的两个接口：submit会接收请求，将请求中的参数存入数据库中render会从数据库中读取内容，写在HTML里，然后返回给用户这里没有对用户提交的内容做任何过滤，如果我们是攻击者，可以这样进行攻击：数据使用一个script标签包裹，然后在里面写一些恶意脚本提交给服务器，之后服务器就会返回到页面，脚本就会被执行常见XSS攻击方式下面我们来介绍几种常见的XSS攻击方式存储型 Stored XSS恶意脚本被存在数据库中访问页面 -> 读数据 === 被攻击危害最大，对全部用户可见反射型 Reflected XSS不涉及数据库从URL上攻击在URL参数上加入恶意脚本，服务端解析参数放入响应体中，导致恶意脚本注入成功DOM型 Dom-based XSS不需要服务器的参与恶意攻击的发起 + 执行，都是在浏览器完成的注意反射型与DOM型的区别Mutation-based XSS利用了浏览器渲染DOM的特性（独特优化）不同浏览器，会有区别（按浏览器进行攻击）嵌入上面这样一段文本内容，导致浏览器解析出来的HTML是下面这样的img标签的src属性出错，导致执行onerror里的内容，这里可以注册恶意脚本，进行攻击CSRF 跨站请求伪造我们再来说说另一个攻击方式 Cross-site request forgery(CSRF) 跨站请求伪造它又哪些特点呢？在用户不知情的前提下利用用户的权限（cookie）构造指定HTTP请求，窃取或修改用户敏感信息看一个小demo示例 用户收到一封标题特别吸引人的邮件，他回点击进行查看，邮件是一个恶意的页面B，在访问这个B页面的时候，拿到了一些用户信息，然后他偷偷的将这些信息发送到 A服务上，这里用户是没有自己主动访问A的，此时A就拿到了用户的敏感信息，可以进行他想进行的操作了！可以发一个GET请求 可以把链接放在a标签或者img标签中，a标签需要用户主动点击触发，而img标签进入页面自动就会触发也可以是其他的请求类型利用表单，提交一个POST请求 注入 InjectionSQL注入我们来看看什么是SQL注入SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严，攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句，在管理员不知情的情况下实现非法操作，以此来实现欺骗数据库服务器执行非授权的任意查询，从而进一步得到相应的数据信息。我们来看一些例子① 服务端读取一些请求字段 ② 直接将这些字段以字符串的形式拼接 SQL 语句 如果这些字符串是恶意的，SQL语句随便删点东西，那就对我们的数据库进行了很大的损害了~其他注入不仅仅是SQL的注入，还可以是 ① cli ② OS command ③ SSRFcli调用虚拟视频格式转换脚手架，脚手架接收一些参数，这些参数允许用户自定义options 攻击者可以传入这样的options，直接删库，让他们程序员赶紧跑路OS command你的服务端暴露了一些敏感的重要文件，导致被攻击者读取和修改比如，通过nginx的配置，将访问流量转发到第三方网站，让他们的服务器不堪重负，直接下线Server-Side Request Forgery（SSRF）服务端伪造请求（严格⽽⾔，SSRF 不是 injection，但是原理类似）这样可能回将内网的信息暴露给外部，导致外部可能会对内网的一些配置进行攻击 DoS通过某种⽅式（构造特定请求），导致服务器资源被显著消耗， 来不及响应更多请求，导致请求挤压，进⽽雪崩效应。回顾一下：正则表达式——贪婪模式重复匹配时「?」 vs 「no ?」：满⾜“⼀个” 即可 vs 尽量多ReDoS 基于正则表达式的Dos贪婪：n 次不⾏？n - 1 次再试试？——回溯暴力回溯，会导致系统的响应时间边长，接口的吞吐量下降Distributed DoS DDoS 分布式DoS短时间内，来⾃⼤量僵⼫设备的请求流量，服务器不能及时完成 全部请求，导致请求堆积，进⽽雪崩效应，⽆法响应新请求「不搞复杂的，量⼤就完事⼉了」攻击的特点直接访问IP任意API消耗大量带宽（耗尽）举一个例子，我们知道TCP连接需要三次握手，如果攻击者发很多次一个次的SYN不完成第三次的握手，导致大量连接未得到释放，当达到最大连接数的时候，新请求就无法进来了！！！中间人攻击最后，我们再介绍一种中间人攻击当双方在进行通信的时候，可能以为对方是方，但是如果有一个中间人进行的拦截，中间加了一层，双方可能无法意识到中间人的存在，他可能会进行一些攻击中间人攻击的前提是什么呢？明文传输信息篡改不可知对方身份未验证总结今天我们最为攻击者，学习了五种攻击方式，其实通过文章中的一些描述，你应该可以想到很多方式可以避免掉这些攻击，那么YK菌会在下一篇博文中带大家以防御者的身份一起探索Web开发的安全之旅的防御篇！转发自掘金社区！如有侵权，请联系删除。原文地址https://juejin.cn/post/7009536350290444324？share_token=5af9029d-d898-4f7b-b543-b50f3b50b5a9
让数据库不再成为业务发展瓶颈——分布式数据库架构设计
让数据库不再成为业务发展瓶颈——分布式数据库架构设计摘要企业如何实现高容量大并发数据库服务？公司业务高速发展，单实例数据库到达瓶颈的情况下，如何做好分布式设计，提供高并发高性能的数据库服务以支撑业务增长？本次分享主要内容包括数据库分布式架构设计思路，拆分原理，改造难点，解决方案等，让数据库不再成为业务发展瓶颈。内容来源：2017年6月4日，袋鼠云首席数据库架构师宏翊在“企业互联网架构优化升级之路”进行《让数据库不再成为业务发展瓶颈——分布式数据库架构设计》演讲分享。IT 大咖说作为独家视频合作方，经主办方和讲者审阅授权发布。阅读字数：1705 | 3分钟阅读嘉宾演讲视频回放：http://t.cn/RQCVFyS为什么要做分布式？高并发：分布式应用带来更大量的数据库请求。高容量：业务增长，产生大量在线数据。资源向上扩展存在天花板。支撑业务高速发展，平滑扩容。拆分原则：循序渐进在业务初期，客户量比较少，可以把所有服务和数据都存在一个实例上，都能支持业务的发展。发展之后的客户量、数据量和并发都上来了，这时数据库很容易出现瓶颈。我们建议大家首先进行服务化的改造，将不同的业务模块做垂直梳理，把不同服务的数据库相互隔离，中间的交互由业务上去实现。这样数据库就可以分布在不同的实例上，能够支持相对较高的并发和容量。继续发展的话，实例依然是一个瓶颈，这时我们就要考虑做水平的拆分。把一个服务的数据分布到不同的实例上，以支持扩展、高并发、大容量的数据库服务。拆分需要循序渐进，然后做服务的梳理，最后再做水平拆分。水平拆分会引入一些复杂性，研发方面需要考虑的东西就比较多，所以需要谨慎地做拆分。数据库的拆分和业务架构紧密结合，有时在业务上的一个小改动完全可以把压力挡在数据库之外。水平拆分的难点水平拆分的一个服务数据会分布到不同的底层数据库上，所以会带来一些复杂性。系统架构需要适应数据库的分布式，就需要做一些改造。面临的技术挑战就是应用需要处理复杂的分布式逻辑，比如分布式的事务、跨库查询。在稳定性方面也会有一些挑战，但不是最主要的。主要是分布式的局限性，分布式数据分布在不同的数据库上，它不支持跨库的join、分布式事务、以及全局sequence等。解决方案：客户端实现数据路由在客户端直接做一个配置，去实现路由的功能。它的好处就是不需要引入额外模块，整体架构不变；程序的把控力强，场景简单方便使用；对代码的侵入性强；配置管理复杂。此方案不会引入额外的组建，架构上比较轻量，简单场景使用尚可，比如配置管理复杂等，不建议使用。解决方案：数据库中间件实现自动分库分表，对应用透明；使用门槛极低，应用改造量小；方便的动态水平扩容；针对分布式的各种定制功能，如异构索引、小表广播等；最重要的是，有了数据库中间件，应用看到还是单一的数据库。中间件的使用最大限度的屏蔽了分布式数据库所引入的复杂性，极大降低了研发的门槛。DRDS功能简介分库分表是DRDS的核心功能，支持数据的多维度切分和路由访问；内建读写分离功能，可以灵活配置访问权重；自带全局唯一ID组件；查询引擎识别和下推复杂查询，兼容98% MySQL语法；弹性扩容组件实现自动化在线水平扩容。DRDS物理框架数据拆分，能够组合1K个MySQL；分布式SQL查询引擎与高度的SQL兼容性；数据存储的平滑扩容；处理性能的弹性伸缩；读写分离（应用透明）；小表广播、跨库join、全局sequence。主库和读库通过数据库的原生复制实现，数据是强一致的。DRDS会自动判断请求，然后做分发。事务性的操作全部路由到主库上去，读库则承担一些读的操作。把join从DRDS层往下推，在MySQL层实现它的join，业务设计上要避免跨库join。分布式SQL规范设计：最佳实践查询尽可能带上分库条件。如果把一个表拆分到底层的十个库，查询的时候每次都带上一个拆分条件，DRDS能够很清楚地把请求路由到底层的库上。Join的时候有几种解决方案。一种是两个表的分库键都相等去做join，这样就能限定在一个库上。还有一种是广播表，join的字段不一样，但是每个表都带上分库的条件，这样还是会限定在同一个库里面。EasyDB：数据库自动化管理平台资源：实时监控数据库和服务器空间的使用状态。高可用：云上高可用架构设计，故障自动切换。备份：定期的数据库全量，增量备份，可灵活配置。监控：异常情况下自动捕获和告警，支持短信，邮件和微信通知。性能：超过50个指标性能趋势和SQL采集，实时监控数据库的运行状态。日志：数据库错误日志采集。安全：数据库账号和操作的审计，基于服务器的安全设计。我今天的分享就到这里，谢谢大家！https://juejin.cn/post/6844903552662552584?share_token=2e4ab195-e3fc-435f-abdc-eaa9d95231ec如有侵权请联系我删除。
【学习笔记】计算机网络 谢希仁版（五）运输层（重点）教材：计算机网络(第七版)谢希仁版运输层1. 网络进程间的通信，端口号，套接字，在网络上唯一标识一个进程从通信和信息处理的角度看，运输层向它上面的应用层提供通信服务，它属于面向通信部分的最高层，同时也是用户功能中的最底层。这里要注意一点： 从运输层的角度看，通信的真正端点并不是主机而是主机中的进程，也就是说，端到端的通信应用进程之间的通信。运输层提供应用进程间的逻辑通信。好像这种通信就是沿水平方向直接传送数据。但事实上这两个运输层之间并没有一条水平方向的物理连接。 从上图可以看出，网络层为主机之间提供逻辑通信，而运输层为应用进程之间提供端到端的逻辑通信。此外，运输层还要对收到的报文进行差错检测。2. UDP 与 TCP运输层需要有两种不同的运输协议，面向连接的TCP和无连接的UDP。用户数据报协议UDP传输控制协议TCP运输协议数据单元TPDU：两个对等运输实体在通信时传送的数据单元。运输层向高层用户屏蔽了下面网络核心的细节，他使应用进程看见的就是好像在两个运输层实体之间有一条端到端的逻辑通路，但这条逻辑通信信道对上层的表现却因运输层使用的不同协议而有很大的差别。当这种逻辑通信信道就相当于一条全双工的可靠信道。但当运输层采用无连接的UDP协议时，这种逻辑通信信道仍然是一条不可靠信道。复用：应用层所有的应用进程都可以通过运输层再传送到IP层。分用：运输层从IP层收到发送给各应用进程的数据后，必须分别交付执明的各应用进程。2.1 端口服务器端使用的端口号这里分两类，最重要的一类叫熟知端口号或系统端口号。 值为0-1024客户端使用的端口号值为49152-65535 这类端口号仅在客户进程运行时才动态选择。因此又叫短暂端口号。2.2 UDP2.2.1 概述UDP是无连接的发送数据之前不需要建立连接，因此减少了开销和发送数据之前的时延。尽最大努力交付及不保证可靠交付，因此主机不需要维持复杂的连接状态表。面向报文发送方的UDP对应用程序交下来的报文，在添加首部后就向下交付IP层。UDP对应用层交下来的报文，既不合并，也不拆分。而是保留这些报文的边界。 4. UDP是没有控制拥塞的。 5. UDP支持一对一、一对多、多对一、多对多的交互通信。 6. 首部开销小，只有8字节，比TCP的20字节小。2.2.2 首部格式源端口源端口号。在需要对方回信时选用。不需要的时候可用全0。目的端口目的端口号。这在终点交付报文时必须使用。长度UDP用户的数据报长度。其最小值时8(仅有首部)。检验和检测UDP用户数据报在传输中是否有错。有错就丢弃。 注意：UDP用户数据报首部中检验和的计算方法有些特殊。在计算检验和时，要在UDP用户数据报之前增加12个字节的伪首部。和IP数据报的检验和只检验IP数据报的首部不同，UDP的检验和是把首部和数据部分一起都检验。2.3 TCP2.3.1 特点面向连接的运输层协议。在应用程序在使用TCP协议之前，必须先建立TCP连接。在传送数据完毕后，必须释放已经建立的TCP连接。每一条TCP连接只能有两个端点，每一条TCP连接只能是点对点的。TCP提供可靠交付的服务。通过TCP连接传送的数据，无差错，不丢失，不重复，并且按序到达。TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。面向字节流。TCP的流是指流入到进程或从进程流出的字节序列。虽然应用程序和TCP的交互式一次一个数据块，但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。 TCP报文段先要传送到IP层，加上IP层首部后，再传送到数据链路层。再加上数据链路层的首部和尾部后，才离开主机发送到物理链路。3. TCP 报文段首部TCP虽然是面向字节流的，但TCP传送的数据单元却是报文段。源端口和目的端口：各占2个字节，分别写入源端口号和目的端口号。序号：占4字节。序号范围是[0,2e32-1]个序号。序号增加到2e32-1后，下一个序号就又回到0。也就是说，序号使用mod 2^32运算。TCP是面向字节流的。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。首部中的序号字段值则是指的是本报文段所发送的数据的第一个字节的序号。例如，一报文段的序号是301，而接待的数据共有100字节。这就表明：本报文段的数据的第一个字节的序号是301，最后一个字节的序号是400。显然，下一个报文段（如果还有的话）的数据序号应当从401开始，即下一个报文段的序号字段值应为401。这个字段的序号也叫“报文段序号”。确认号：占4字节。是期望收到对方下一个报文段的第一个数据字节的序号。例如，B正确收到了A发送过来的一个报文段，其序号字段值是501，而数据长度是200字节（序号501~700），这表明B正确收到了A发送的到序号700为止的数据。因此，B期望收到A的下一个数据序号是701，于是B在发送给A的确认报文段中把确认号置是701。注意，现在确认号不是501，也不是700，而是701。若确认号为= N，则表明：到序号N-1为止的所有数据都已正确收到。数据偏移：占4位，它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。这个字段实际上是指出TCP报文段的首部长度。由于首部中还有长度不确定的选项字段，因此数据偏移字段是必要的，但应注意，“数据偏移”的单位是32位字（即以4字节的字为计算单位）。由于4位二进制数能表示的最大十进制数字是15，因此数据偏移的最大值是60字节，这也是TCP首部的最大字节（即选项长度不能超过40字节）。保留：占6位，保留为今后使用，但目前应置为0 。下面有6个控制位，用来说明本报文段的性质。紧急URG（URGent）：当URG=1时，表明紧急指针字段有效。它告诉系统此报文段中有紧急数据，应尽快发送（相当于高优先级的数据），而不要按原来的排队顺序来传送。例如，已经发送了很长的一个程序要在远地的主机上运行。但后来发现了一些问题，需要取消该程序的运行，因此用户从键盘发出中断命令。如果不使用紧急数据，那么这两个字符将存储在接收TCP的缓存末尾。只有在所有的数据被处理完毕后这两个字符才被交付接收方的应用进程。这样做就浪费了很多时间。当URG置为1时，发送应用进程就告诉发送方的TCP有紧急数据要传送。于是发送方TCP就把紧急数据插入到本报文段数据的最前面，而在紧急数据后面的数据仍然是普通数据。这时要与首部中紧急指针（Urgent Pointer）字段配合使用。确认ACK（ACKnowledgment）：仅当ACK = 1时确认号字段才有效，当ACK = 0时确认号无效。TCP规定，在连接建立后所有的传送的报文段都必须把ACK置为1。推送 PSH（PuSH）： 当两个应用进程进行交互式的通信时，有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应。在这种情况下，TCP就可以使用推送（push）操作。这时，发送方TCP把PSH置为1，并立即创建一个报文段发送出去。接收方TCP收到PSH=1的报文段，就尽快地（即“推送”向前）交付接收应用进程。而不用再等到整个缓存都填满了后再向上交付。复位RST（ReSeT）：当RST=1时，表名TCP连接中出现了严重错误（如由于主机崩溃或其他原因），必须释放连接，然后再重新建立传输连接。RST置为1还用来拒绝一个非法的报文段或拒绝打开一个连接。同步SYN（SYNchronization）：在连接建立时用来同步序号。当SYN=1而ACK=0时，表明这是一个连接请求报文段。对方若同意建立连接，则应在响应的报文段中使SYN=1和ACK=1，因此SYN置为1就表示这是一个连接请求或连接接受报文。终止FIN（FINis，意思是“完”“终”）：用来释放一个连接。当FIN=1时，表明此报文段的发送发的数据已发送完毕，并要求释放运输连接。窗口：占2字节。窗口值是[ 0，2^16-1]之间的整数。窗口指的是发送本报文段的一方的接受窗口（而不是自己的发送窗口）。窗口值告诉对方：从本报文段首部中的确认号算起，接收方目前允许对方发送的数据量（以字节为单位）。之所以要有这个限制，是因为接收方的数据缓存空间是有限的。总之，窗口值作为接收方让发送方设置其发送窗口的依据。例如，发送了一个报文段，其确认号是701，窗口字段是1000.这就是告诉对方：“从701算起，我（即发送方报文段的一方）的接收缓存空间还可接受1000个字节数据（字节序号是701~1700），你在给我发数据时，必须考虑到这一点。”总之：窗口字段明确指出了现在允许对方发送的数据量。窗口值经常在动态变化。检验和：占2字节。检验和字段检验的范围包括首部和数据这两部分。和UDP用户数据报一样，在计算检验和时，要在TCP报文段的前面加上12字节的伪首部。 伪首部的格式和UDP用户数据报的伪首部一样。但应把伪首部第4个字段中的17改为6（TCP的协议号是6）； 把第5字段中的UDP中的长度改为TCP长度。接收方收到此报文段后，仍要加上这个伪首部来计算检验和。若使用TPv6,则相应的伪首部也要改变。紧急指针：占2字节。紧急指针仅在URG=1时才有意义，它指出本报文段中的紧急数据的字节数（紧急数据结束后就是普通数据） 。因此，在紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急数据都处理完时，TCP就告诉应用程序恢复到正常操作。值得注意的是，即使窗口为0时也可以发送紧急数据。选项：长度可变，最长可达4字节。当没有使用“选项”时，TCP的首部长度是20字节。TCP最初只规定了一种选项，即最大报文段长度MSS（Maximum Segment Szie）。注意MSS这个名词含义。MSS是每一个TCP报文段中的数据字段的最大长度。数据字段加上TCP首部才等于整个的TCP报文段。所以MSS并不是整个TCP报文段的最大长度，而是TCP报文段长度减去TCP首部长度。4. TCP 连接建立，连接释放4.1 TCP 连接建立，三次握手传输控制块TCB：存储了每一个连接中的一些重要信息。比如TCP连接表，指向发送和接收缓冲的指针，指向重传队列的指针，当前的发送和接收序列等等。假设主机A是TCP客户程序，B是TCP服务器程序。最初两端的TCP进程都是处于CLOSED关闭状态，客户端A打开链接，服务器端被打开链接。一开始B的TCP服务器进程先创建传输控制块TCB，准备接受客户进程的链接请求，然后服务器进程就处于LISTEN收听状态，等待A的连接请求。然后A的进程首先创建传输控制模块TCB。向B发出连接请求报文段，这是首部当中的同步位SYN=1，同时选择一个初始序号seq=x。TCP规定，SYN报文段(即SYN=1的报文段)不能写数据，但要消耗掉一个序号。这时候A就进入了同步已发送的状态。B收到连接请求报文段后，如果同意建立连接，则向A发送确认，在确认报文段中把SYN位和AVK位置都置为1，确认号为ack+1，同时也为自己选择一个初始序号y。同样的这个报文段也是不能写数据的，但同时要消耗掉一个序号。这时B进入了同步收到状态。A收到B的确认之后，还要向B给出确认。确认报文段的ACK置1，确认号ack=y+1，而自己的seq=x+1。ACK报文段是可以携带数据的，但如果不携带数据则不消耗序号，在这种情况下，下一个数据报文段的序号仍为seq=x+1。这时候TCP已经建立了。A进行入了已经建立连接的阶段状态。B收到确认后也进入了连接状态。为什么A最后还要发送一次确认呢？ 这主要为了防止已失效的连接请求报文段突然又传送到了B，因而产生错误。已失效的连接请求报文段是什么？首先是正常情况，A发出连接请求，但因连接请求报文丢失而未收到确认。于是A再重传一次连接请求。后来收到了确认，建立了连接。数据传输完毕后，就释放了连接。A共发送了两次连接报文请求，其中第一个丢失，第二个到达了B，没有已失效的连接请求报文段。接下来是坏的情况，A发出的第一个连接请求报文段并没有丢失，而是在某些网络结点长时间滞留了，以致于到连接释放以后的某个时间才到达B。本来这是一个早已失效的报文段，但B收到此失效的连接请求报文段后，就误认为是A有发出一次新的连接请求。于是就向A发出确认报文段。同意报文连接。但是由于现在A并没有发出建立连接的请求，因此不会理睬B的确认，也不会向B发送数据。但B以为新的运输连接已经建立了，并一直等待A发送数据来，B的许多资源就这样白白浪费了！采用三次握手的方法就可以防止上述现象的发生，例如刚才的异常情况，A不会向B发出确认。B由于收不到确认，就知道A并没有要求建立连接。这也是为什么要三次进行握手。三次握手无敌了？？ 你放屁！。SYN- Flood攻击是当前网络上最为常见的DDoS攻击，也是最为经典的拒绝服务攻击。 攻击者首先伪造地址对 服务器发起SYN请求，服务器回应(SYN+ACK)包，而真实的IP会认为，我没有发送请求，不作回应。服务器没有收到回应，这样的话，服务器不知 道(SYN+ACK)是否发送成功，默认情况下会重试5次（tcp_syn_retries）。这样的话，对于服务器的内存，带宽都有很大的消耗。攻击者如果处于公网，可以伪造IP的话，对于服务器就很难根据IP来判断攻击者，给防护带来很大的困难。那改进成四次握手就无敌啦？？ 你放屁！。三次握手有的缺陷，就算N此握手的确保，也一样会有相关的问题出现！三次握手是在连接顺利的基础上最大地合理利用网络资源。4.2 TCP 连接释放，四次挥手数据传输完毕之后，通信的双方都可释放连接。现在A和B都处于ESTABLISHED状态。A的应用进程先向TCP发出连接释放报文段，并停止再发送数据，主动关闭TCP连接。A把链接释放报文段首部的终止控制位FIN置为1，其序号为seq=u，它等于前面以传送过的数据的最后一个字节的序号加1.这时候A进入了FIN-WAIT-1(终止等待1)状态，等待B的确认。注意：TCP规定，FIN报文段即使不携带数据，他也消耗掉一个序号！！B 收到链接释放报文段后即发出确认，确认号是ack = u + 1，而这个报文段自己的序号是v，等于B前面已传送过的数据的最后一个字节的序号加1.然后B就进入CLOSE-WAIT(关闭等待)状态。TCP服务器进程这时应通知高层应用进程，因而从A到B这个方向的链接就释放了，这时的TCP链接处于半关闭状态，即A已经没有数据要发送了，但B若发送数据，A仍要接收，也就是说，从B到A这个方向的连接并未关闭。这个状态可能要维持一段时间。A收到来自B的确认后，就进入了FIN-WAIT-2(终止等待2)状态满等待B发出的连接释放报文段。若B已经没有要向A发送的数据，其应用进程就通知TCP释放连接，这时B发出的连接释放报文段必须使FIN = 1，现假定B的序号为w(在半关闭状态B可能又发送了一些数据)。B还必须重复上次已发送过的确认号ack = u + 1.这时B就进入LAST-ACK(最后确认)状态，等待A的确认。A在收到了B的链接释放报文段后，必须对此发出确认。在确认报文段中把ACK置1，确认号ack=w+1，而自己的序号是seq=u+1(根据TCP标准，前面发送过的FIN报文段要消耗一个序号)。然后进入到TIME-WAIT(时间等待)状态。注意： 现在TCP连接还没有还没有释放掉。必须经过时间等待计时器设置的时间2MSL后，A才能进入CLOSED状态。时间MSL叫做最长报文段寿命，RFC793建议设在两分钟。但是在现在工程来看两分钟太长了，所以TCP允许不同的实现可以根据具体情况使用更小的MSL值。为啥要2MSL时间啊？？？ 原因如下为了保证A发送的最后一个ACK报文段能够到达B。这个ACK报文段有可能丢失，因而使处于在LAST-ASK状态的B收不到对己发送的FIN-ACK报文段的确认。B会超时重传这个FIN+ACK报文段，而A就能在2MSL时间内收到这个重传的FIN+ACK报文段。而A就能在2MSL时间内收到这个重传的FIN+ACK报文段。接着A重传一次确认，重新启动2MSL计时器。最后的A和B都正常进入CLOSED状态。如果A在TIME-WAIT状态不等待一段时间，而实发送完ACK报文段后立即释放连接，那么就无法收到B重传的FIN+ACK报文段，因而也不会再发送一次确认报文段。防止了“已失效的连接请求报文段”。A在发送完最后一个ACK报文段后，在经过时间2MSL，就可以使本连接持续的时间内所产生的所有报文段都从网络中消失，这样就可以使下一个连接中不会出现这种旧的连接请求报文段。B只要收到了A发出的确认，就进入CLOSED状态。同样，B在撤销相应的传输控制块TCB后，就结束了这次的TCP连接。所以B结束TCP连接的时间要比A早一些的。5. 可靠传输CRC 检错、帧编号、确认和重传机制 ARQ, 连续 ARQ5.1 工作原理TCP发送的报文段使交给IP层传送的。但IP层只能提供尽最大努力服务。也就是说，TCP下面的网络所提供的是不可靠的传输。因此TCP必须采用适当的措施才能使得两个运输层之间的通信变得可靠。理想的传输条件有下面两个特点传输信道不产生差错不管发送方以多快的速度发送数据，接收方总是来得及处理收到的数据。5.1.1 停止等待协议可靠传输中这个协议是最简单的，但是运输层并不是使用这个协议的。这里只是为了引出可靠传输的问题而已。 以下是假定数据传送只在一个方向进行。无差错情况A发送分组M1，发完就暂停发送，等待B的确认。收到M1就向A发送确认。A在收到了对M1的确认后，就再发送下一个分组M2。 出现差错当B接收到M1时检测出了差错，就丢弃M1了，也不会通知A收到有差错的分组。也可能是M1在传输过程中丢失了，A也不会知道。所以在可靠传输中，只要A超过一定时间仍然没有收到确认，就认为刚才发送的分组丢失了，因而重传前面发送过的分组，这就叫超时重传。所以就会有一个超时计时器。如果超时计时器到期之前收到了对方的确认，就撤销该超时计时器。 注意以下几点： 1. A在发送完一个分组后，必须暂时保留已发送的分组的副本。只有在收到相应的确认后才能清楚暂时保留的分组副本。 2. 分组和确认分组都必须进行编号。这样才能明确是哪一个发送出去的分组收到了确认，而哪一个分组还没有收到确认收到。 3. 超时计时器的设置的重传时间应当比数据在分组传输的平均往返时间更长一些。但是不能过长，过长会导致传输效率低下，过短会导致不必要的重传。对于运输层的重传时间非常复杂，因为已经发出的分组还不知道经过哪些网络，以及这些网络将会产生多大的时延，这些都是不确定因素。确认丢失和确认迟到左图aB所发送的对M1的确认丢失了。A在设定的超时重传时间内没有收到确认，并无法知道是自己发送的分组出错，丢失，或者是B发送的确认丢失了。因此A在超时计时器到期后就要重传M1。现在应注意B的动作，假定B又收到了重传的分组M1。这时应该采取两个行动。 - 丢弃这个重复的帧，不向上层交付。 - 向A发送确认。不能认为已经发送过确认就不再发送，因此A之所以重传M1就标识A没有收到对M1的确认。 2. 右图b 传输过程中没有出现差错，当B对分组M1的确认迟到了。A会收到重复的确认。对重复的确认的处理很简单：收到后就丢弃。B仍然会收到重复的M1，并且同样要丢弃重复的M1，并重复确认分组。像上述的确认和重传机制，我们就可以在不可靠的传输网络上实现可靠的通信。所以像上述这种可靠传输协议常称为自动重传请求ARQ。意思是重传的请求是自动进行的。接收方不需要请求发送方重传某个出错的分组。信道利用率TD：A发送分组需要的时间 RTT：往返时延 TA：发送确认分组需要时间TA 但是这个效率太低了！ 所以有了流水线传输！ 5.1.2 连续ARQ协议发送方维持发送窗口，位于发送窗口的5个分组都可连续发送出去，而不需要等待对方的确认。这样信道利用率就高了。而发送方每收到一个确认，就把发送窗口向前滑动一个分组的位置。 接收方一般都是蚕蛹累计确认的方式，也就是说，接收方不必对收到的分组逐个发送确认。而是收到几个分组后，对按需到达的最后一个分组发送确认，如果发送方发了前5个分组，而中间第3个分组丢失了。这时接收方只能对前两个分组发出确认。发送方无法知道后面三个分组的下落，而只好把后面的三个分组都再重传一次。这就叫Go-back-N(回退N)，表示需要再退回去重传已发送过的N个分组。可见当通信线路信号不好的时候，连续ARQ协议会带来负面的影响。5.2 具体实现5.2.1 以字节为单位的滑动窗口建议看这位博主的介绍，很详细了以字节未单位的滑动窗口现假定A收到了B发来的确认报文段，其中窗口是20字节，而确认号是31(这表明B期望收到的下一个序号是31，而序号30为止的数据已经收到了)。根据这两个数据，A就构造出自己的发送窗口。 发送窗口表示：在没有收到B的确认的情况下，A可以连续把窗口内的数据都发送出去。在未收到确认之前都必须展示保留，以便在超时重传是使用。 从以上可知道A窗口：小于P1的是已发送并已收到确认的部分，而大于P3的是不允许发送的部分。 P3-P1 = A的发送窗口 P2-P1 = 已发送但尚未收到确认的字节数 P3-P2 = 允许发送当前尚未发送的字节数(又称可用窗口或有效窗口数)B窗口：B的接收窗口大小是20，在接收窗口外面，到30号为止的数据是已经发送过确认，并且已经交付主机了。因此在B可以不再保留这些数据。 A在据徐发送完序号42-53的数据后，指针P2向前移动和P3重合。发送窗口内的序号都已用完，但还没有在收到确认。由于A的发送窗口已满，可用窗口已经减少到0，因此必须停止发送。如果发送窗口内所有的数据都已正确到达B，B也早已发出了确认，但这些确认滞留在网络中，在没有收到确认时吗，A只能认为B还没有收到这些确认的数据。于是A经过由超时计算器控制时间后，就重传这部分数据。重新设置超时计时器，直到B的确认为止。下面这是接受缓存和接受窗口的关系。 发送缓存用来暂时存放：发送应用程序传送给发送方TCP准备发送的数据。TCP以发送出单尚未收到确认的数据。发送窗口通常只是发送缓存的一部分。已被确认的数据应当从发送缓存中删除，因此发送缓存和发送窗口的后沿是重合的。发送应用程序最后写入发送缓存的字节减去最后被确认的字节，就是还保留在发送缓存中的被写入的字节数。发送应用程序必须控制写入缓存的速率，不能太快，否则发送缓存就没有存放数据的空间了。接收缓存用来暂时存放：按序到达、但尚未被接收应用程序读取的数据。未按序到达的数据。5.2.2 超时重传时间的选择参考博主 超时重传时间的选择 TCP 超时重传时间设置，如果把超时重传时间设置得太短，就会引起很多报文段的不必要的重传，使网络负荷增大。但若把超时重传时间设置得过长，则又使网络的空闲时间增大，降低了传输效率。TCP采用了一种自适应算法，它记录一个报文段发出的时间，以及收到相应的确认的时间。这两个时间之差就是报文段的往返时间RTT。 加权平均往返时间 TCP保留了RTT 的一个加权平均往返时间RTTS（这又称为 平滑的往返时间）。第一次测量到RTT 样本时，RTTS值就取为所测量到的RTT样本值。以后每测量到一个新的RTT 样本，就按下式重新计算一次RTTS： 超时重传时间RTO RTO (Retransmission Time-Out) 应略大于上面得出的加权平均往返时间RTTS。RFC 2988建议使用下式计算RTO。 RTTD是RTT的偏差的加权平均值。RFC 2988建议这样计算RTTD。第一次测量时，RTTD值取为测量到的RTT样本值的一半。在以后的测量中，则使用下式计算加权平均的RTTD： 是个小于1 的系数，其推荐值是1/4，即0.25。TCP报文段1没有收到确认。重传（即报文段 2） 后，收到了确认报文段ACK。如何判定此确认报文段是对原来的报文段1的确认， 还是对重传的报文段2的确认？ Karn 算法在计算平均往返时间RTT时，只要报文段重传了， 就不采用其往返时间样本。 这样得出的加权平均平均往返时间 RTTS和超时重传时间RTO就较准确。 但是，这又引起新的问题。当报文段的时延突然增大了很多时，在原来得出的重传时间内，不会收到确认报文段。于是就重传报文段。但根据 Karn算法，不考虑重传的报文段的往返时间样本。这样， 超时重传时间就无法更新。 报文段每重传一次，就把 RTO增大一些： 系数γ的典型值是2 。当不再发生报文段的重传时，才根据报文段的往返时延更新平均往返时延RTT和超时重传时间RTO的数值。5.2.3 选择确认SACK参考博主 选择确认SACK TCP的接收方在接收方在接收对方发送过来的数据字节流的序号不连续，结果序号1001-1500没有收到。接下来的字节流又收到了，可是缺少了3001-3500。再后面从序号4501起又没有收到。也就是说，接收方收到了和前面的不连续的两个字节块。但要把这些信息准确高速发送方，使得发送方不要再发送这些已经收到的数据。 6. TCP 窗口机制一般来说，我们总是希望数据传的更快一些。但如果发送方把数据发送得过快，接收方就可能来不及接收，这就会造成数据得丢失。所谓流量控制就是让发送方的发送速率不要太快，要让接收方来的及接收。 下面是利用滑动窗口机制进行流量控制。 设A向B发送数据。在连接建立时，B告诉了A接收窗口rwnd = 400。因此发送方的发送窗口是不能超过接收方给出的接收窗口的数值。注意一点是TCP的窗口单位是字节，不是报文段。假设报文段为100字节长，而数据报文段序号seq的初始值设为1，上面大写的ACK表示首部中的确认位ACK，小写ack表示确认字段的值。我们应该注意到接收方主机B进行了三次流量控制。第一次把窗口减少到rwnd=300。第二次又减少到rwnd=100。最后是减小到0，即不允许发送方再发送数据了。为了防止A一直等待B发送的非零窗口的情况(报文段在传输的时候丢失了！)，而B也一直等到A发送的数据的问题，TCP为每一个连接都设置了一个持续计时器，只要TCP连接的以方收到了对方的零窗口通知。就启动持续计时器，若持续计时器设置的时间到期，就发送一个零窗口探测报文段，而对方就在确认这个探测报文段时给出了现在的窗口值。那么会有下面两种结果如果窗口仍是0的话，那么收到的这个报文段的一方就重新设置持续计时器。如果窗口不是0的话，那么就会打破等待。7. TCP 的超时重传时间计算看例题！8. TCP 的选择确认 SACK看上面！ 5.2.39. TCP 的流量控制 (零窗口问题、糊涂窗口综合症)9.1 零窗口问题上面有！ 第6点9.2 糊涂窗口综合症假设TCP接收方的缓存已经满了，而交互式的应用进程一次只从接收缓存中读取1字节，然后向发送方发送确认，并把窗口设置为1个字节(但发送的数据报时40字节长)，接着发送方又发来了1个字节的数据（请注意，发送方发送的IP数据报是41字节长）。接收方发回确认，仍然为1个字节。这样下去会使得网络的效率很低。要解决这个问题，可以让接收方等待一段时间，使得或是接收混村以有足够空间容纳一个最长的报文段，或等待接收缓存已有一定空闲的空间。10. TCP 的拥塞控制这里水很深，我把握不住(~太多内容了不想打了~ ) 看这位博主的吧 TCP 的拥塞控制11. 课后习题第一题(5-13) 一个 UDP 用户数据报的数据字段为 8192 字节。在链路层要使用以太网来传送。试问应当划分为几个 IP 数据报片？说明每一个 IP 数据报片的数据字段长度和片偏移字段的值。第二题(5-14) 一个UDP用户数据报的首部的十六进制表示是06 32 00 45 00 1C E2 17。求源端口、目的端口、用户数据报总长度、数据部分长度。这个用户数据报是从客户发送给服务器的还是从服务器发送给客户的？使用UDP的这个服务器程序是什么？第三题(5-21) 假设使用连续ARQ协议，发送窗口大小是3，而序列范围[0,15],而传输媒体保证在接收方能够按序收到分组。在某时刻，在接收方，下一个期望收到序号是5。 试问： ①在发送方的发送窗口中可能有出现的序号组合有哪几种？ ②接收方已经发送出去的、但在网络中（即还未到达发送方）的确认分组可能有哪些？说明这些确认分组是用来确认哪些序号的分组。第四题(5-23) 主机A向主机B连续发送了两个TCP报文段，其序号分别为70和100。试问： （1）第一个报文段携带了多少个字节的数据？ （2）主机B收到第一个报文段后发回的确认中的确认号应当是多少？ （3）如果主机B收到第二个报文段后发回的确认中的确认号是180，试问A发送的第二个报文段中的数据有多少字节？ （4）如果A发送的第一个报文段丢失了，但第二个报文段到达了B。B在第二个报文段到达后向A发送确认。试问这个确认号应为多少？第五题(5-27) 一个TCP报文段的数据部分最多为多少个字节？为什么？如果用户要传送的数据的字节长度超过TCP报文字段中的序号字段可能编出的最大序号，问还能否用TCP来传送？ 第六题(5-31) 通信信道带宽为1Gbit/s，端到端时延为10ms，TCP的发送窗口为65535B，则可能达到的最大吞吐量是?信道利用率是多少？ 第七题(5-34) 已知第一次测得TCP的往返时间RTT是30 ms。接着收到了三个确认报文段，用它们测量出的往返时间样本RTT分别是：26 ms，32 ms和24 ms。设α=0．1。试计算每一次的新的加权平均往返时间值RTT。讨论所得出的结果。 第八题(5-38) 设Tcp的ssthresh的初始值为8（单位为报文段），当拥塞窗口上升到12时网络发生了超时，Tcp使用慢开始和拥塞避免，试分别求出第1次到第15次传输的各拥塞窗口大小。| 轮次 | 拥塞窗口 | 拥塞窗口变化的原因 || - | - | - || 1 | 1 | 网络发生了超时，TCP使用慢开始算法 || 2 | 2 | 拥塞窗口值加倍 || 3 | 4 | 拥塞窗口值加倍 || 4 | 8 | 拥塞窗口值加倍,这是ssthresh的初始值 || 5 | 9 | TCP使用拥塞避免算法，拥塞窗口值加1 || 6 | 10 | TCP使用拥塞避免算法，拥塞窗口值加1 || 7 | 11 | TCP使用拥塞避免算法，拥塞窗口值加1 || 8 | 12 | TCP使用拥塞避免算法，拥塞窗口值加1 || 9 | 1 | 网络发生了超时，TCP使用满开始算法 || 10 | 2 | 拥塞窗口值加倍 || 11 | 4 | 拥塞窗口值加倍 || 12 | 6 | 拥塞窗口值加倍，但到达了12的一半时，改为了拥塞避免算法 || 13 | 7 | TCP使用拥塞避免算法，拥塞窗口值加1 || 14 | 8 | TCP使用拥塞避免算法，拥塞窗口值加1 || 15 | 9 | TCP使用拥塞避免算法，拥塞窗口值加1 |第九题(5-39)TCP 的拥塞窗口cwnd大小与传输轮次n的关系如下所示： （1）试画出如图5-25所示的拥塞窗口与传输轮次的关系曲线。 （2）指明TCP工作在慢开始阶段的时间间隔。 （3）指明TCP工作在拥塞避免阶段的时间间隔。 （4）在第16轮次和第22轮次之后发送方是通过收到三个重复的确认还是通过超市检测到丢失了报文段？ （5）在第1轮次，第18轮次和第24轮次发送时，门限ssthresh分别被设置为多大？ （6）在第几轮次发送出第70个报文段？ （7）假定在第26轮次之后收到了三个重复的确认，因而检测出了报文段的丢失，那么拥塞窗口cwnd和门限ssthresh应设置为多大？(1) （2）慢开始时间间隔：[ 1 , 6 ] 和 [ 23, 26 ]（3）拥塞避免阶段的时间间隔：[ 6, 16 ] 和 [ 17, 22 ]（4）在第16轮次和第22轮次之后发送方是通过收到三个重复的确认还是通过超时检测到丢失了报文段？第16轮次之后发送方通过收到三个重复的确认，检测到丢失了报文段，下一个了轮次的拥塞窗口减半了。在22轮次之后发送方是通过超时检测到丢失了报文段，下一个轮次的拥塞窗口下降到1了。（5）在第1轮次，第18轮次和第24轮次发送时，门限ssthresh分别被设置为多大？在第1轮次发送时，门限ssthresh被设置为32，因为从第6轮次起就进入了拥塞避免状态，拥塞窗口每个轮次加1。 在第18轮次发送时，门限ssthresh被设置为发生拥塞时拥塞窗口42的一半，即21. 在第24轮次发送时，门限sshresh被设置为拥塞时拥塞窗口26的一半即13。（6）在第几轮次发送出第70个报文段？在表上累加可知当第7轮的时候才>70。所以是第七轮。（7）假定在第26轮次之后收到了三个重复的确认，因而检测出了报文段的丢失，那么拥塞窗口cwnd和门限ssthresh应设置为多大？检测出了报文段的丢失时拥塞窗口cwnd是8，因此拥塞窗口cwnd的数值应当减半等于4，而门限ssthresh应设置为检测出报文段丢失时拥塞窗口8的一半，就是4。第十题(5-41) 用TCP传送512字节的数据，设窗口为100字节，而TCP报文段每次也是传送100字节的数据。再设发送端和接收端的起始序号分别选为100和200。试画出类似于书中图5-31的工作示意图，从连接建立... 用TCP传送512字节的数据，设窗口为100字节，而TCP报文段每次也是传送100字节的数据。再设发送端和接收端的起始序号分别选为100和200。试画出类似于书中图5-31的工作示意图，从连接建立阶段到连接释放都要画上。第十一题(5-61) 在本题中列出的⑧种情况下，画出发送窗口的变化。并标明可用窗口的位置。已知主机A要向主机B发送3KB的数据。在TCP连接建立后，A的发送窗口大小是2KB。A的初始序号是0。 (1)一开始A发送1 KB的数据。 (2)接着A就一 直发送数据，直到把发送窗口用完。 (3)发送方A收到对第1000号字节的确认报文段。 (4) 发送方A再发送850 B的数据。 (5) 发送方A收到ack= 900的确认报文段。 (6) 发送方A收到对第2047号字节的确认报文段。 (7) 发送方A把剩下的数据全部都发送完。 (8) 发送方A收到ack= 3072的确认报文段。我们应当注意到，发送窗口 = 2KB 就是2*1024=2048个字节。因此发送窗口就是第0个到第2047字节为止，长度是2048字节。A开始就发送了1024个字节，因此发送窗口中左边的1024个字节已经用掉了(窗口的左边)，而右边的蓝色部分的是可用的，从1024字节到2047字节为止。发送方A一直发送数据，直到把窗口发送用完。这时整个窗口都用掉了。可用窗口的大小是零了，一个字节也发不出去了。发送方A收到对第1000号字节的确认报文段，表明A收到确认好ack=1001的确认报。这时，发送串口的后沿向前移动，发送串口从第1001字节到第3048字节为止，可用窗口从第2048到3018为止。发送方A再发送850字节，使得可用窗口的后沿向前移动850字节，即移动到2898字节。现在的可用串口从第2898字节到第3048字节。发送方A收到ack=900的确认报文段，不会对其窗口状态有任何影响，这个是个迟到确定。发送方A收到对第2047号字节的确认报文段。A的发送窗口再向前移动。现在的发送窗口从第2014字节开始到第4095字节。可用窗口增大了，从第2898字节到4094字节。发送方A把剩下的数据全部都发送完，发送方A共有3KB的数据，编号从0到3071.因此现在的可用窗口变小了，因此新的发送窗口位置又向前移动，从3072号到第5119号。发送方A收到ack=3072的确认报文段，表明序号在3071和这以前的报文段都受到了，后面期望收到的报文段序号从3072开始。因此，新的发送窗口的位置又向前移动，从3072号到5119号。整个发送窗口也就是可用窗口。最后转载自互联网！！！
百度新闻爬虫搜索引擎实战---爬虫篇（3）
爬虫部分书接上回，我们讲到，要用elasticsearch来存储信息，那么我们首先就得安装elasticsearch。这里就不介绍了，默认已经装好elasticsearch，那我们就正式开始写爬虫了。1. Scrapy创建爬虫项目(baidunewsspider) C:\Users\LiTangMM\PycharmProjects>scrapy startproject baiduNewsSpider (baidunewsspider) C:\Users\LiTangMM\PycharmProjects\baiduNewsSpider>scrapy genspider newsbaidu http://ne ws.baidu.com/终端显示如上就说明爬虫已经创建好了。项目长这样。2. 爬取新闻链接2.1 定义字段我们首先得告诉scrapy，我们要哪些数据，编辑baiduNewsSpider/items.py 文件：# -*- coding: utf-8 -*- # Define here the models for your scraped items # # See documentation in: # https://doc.scrapy.org/en/latest/topics/items.html import scrapy class BaidunewsspiderItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() news_url = scrapy.Fileld() # 新闻链接 passpass 可以只是为了代码块完整性才加的，可以删除。2.2 实现newsbaidu.pyOK！下面就是爬取了，修改baiduNewsSpider/spiders/newsbaidu.py文件# -*- coding: utf-8 -*- import scrapy import json import re from baiduNewsSpider.items import BaidunewsspiderItem class NewsbaiduSpider(scrapy.Spider): name = 'newsbaidu' allowed_domains = ['http://news.baidu.com/'] start_urls = [] def start_requests(self): # 重写请求构造函数 baseurl = 'http://news.baidu.com/widget?id={}&ajax=json&t=1565919256596' widget_ids = ['civilnews', 'InternationalNews', 'EnterNews', 'SportNews', 'FinanceNews', 'TechNews', 'MilitaryNews', 'InternetNews', 'DiscoveryNews', 'LadyNews', 'HealthNews', 'PicWall'] return [scrapy.FormRequest(baseurl.format(_)) for _ in widget_ids] def parse(self, response): # 解析函数 widgetid = re.match(r'.*?id=(.*?)&', response.url).group(1) # 从response中提取url，使用正则匹配提取id值 jsondate = json.loads(response.text) # 将response的内容使用json解析 news_list = jsondate.get('data').get(widgetid).get('focusNews') # 提取内容 for news in news_list: yield BaidunewsspiderItem(news_url=news['m_url']) # 返回一个迭代器2.3 爬取并保存打开shell，输入scrapy crawl newsbaidu -o urls.csv 启动爬虫。我们使用命令将数据爬取并保存下来。3. 爬取新闻内容3.1 创建另一个爬虫scrapy genspider newsspider3.2 定义itemclass NewsItem(scrapy.Item): url = scrapy.Field() # 新闻链接 title = scrapy.Field() # 新闻标题 content = scrapy.Field() # 新闻内容3.3 实现newsspider.py首先，得从文件中读取到新闻的url，所以我们得重写 start_requests 方法3.3 定义爬虫# -*- coding: utf-8 -*- import scrapy from baiduNewsSpider.items import NewsItem class NewsspiderSpider(scrapy.Spider): name = 'newsspider' allowed_domains = [''] start_urls = [''] def start_requests(self): with open('url.csv') as urlfile: urllist = urlfile.readlines()[1:] return [scrapy.FormRequest(_) for _ in urllist] def parse(self, response): url = response.url urlname = url.split('/')[2] # 使用split切割url，判断url属于那个网站 if urlname == '3w.huanqiu.com': # 环球网 title = response.xpath('//h1[@class="a-title"]/strong/text()').extract()[0] #使用 response的selector解析 网页 content = ''.join(response.xpath('//div[@class="a-con"]/p/text()').extract()) elif urlname == 'baijiahao.baidu.com': # 百家号 title = response.xpath('//div[@class="article-title"][1]/h2/text()').extract()[0] content = ''.join(response.xpath('//div[@id="article"]//text()').extract()) elif urlname == 'news.cctv.com': # 央视新闻 title = response.xpath('//div[@class="cnt_bd"][1]/h1/text()').extract()[0] content = ''.join(response.xpath('//div[@class="cnt_bd"][1]/p/text()').extract()) else: # 其他 title = response.xpath('//h/text()').extract()[0] content = ''.join(response.xpath('//p/text(').extract()) yield NewsItem(title=title, url=url, content=content)3.4 自定义管道要把数据存到elasticsearch中，首先，我们得安装好elasticsearch-dsl。pip install elasticsearch-dsl接着在根目录新建一个models.py 文件，它将负责映射：from elasticsearch_dsl import DocType, Keyword, Text from elasticsearch_dsl.connections import connections connections.create_connection(hosts=['localhost']) class NewsType(DocType): title = Keyword # title不作分词 content = Text(analyzer='ik_max_word') #内容使用ik最大分词 class Meta: index = 'baidunews' doc_type = 'news' if __name__=='main': NewsType.init()最后实现一个 pipline类：# -*- coding: utf-8 -*- # Define your item pipelines here # # Don't forget to add your pipeline to the ITEM_PIPELINES setting # See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html from baiduNewsSpider.models import NewsType class ElastisearchPipeline(object): def process_item(self, item, spider): if spider.name == 'newsspider': # 如果是新闻爬虫，存到elasticsearch中 news = NewsType() news.title = item['title'] news.content = item['content'] news.save() return item我们还要记得在配置中将这个管道加上。为保证正确运行，请确认elasticsearch已打开，ik分词器以安装。注意elasticsearch版本号一定要和ik分词器版本号一样，否则elasticsearch会启动不了。运行 model.py 文件创建索引。运行爬虫。OK！到这里，我们的爬虫部分完成了，接下来，我们将使用django搭建一个rest服务。转载至CSDN博主：[李唐敏民]
百度新闻爬虫搜索引擎实战---爬虫篇（2）
爬虫部分新闻链接爬取（2）书接上回，我们获取到了使用动态加载技术加载的新闻链接，但是，有些不是动态加载的新闻链接，我们还没有处理。我们将doc类型文档拷贝下来，放入HBuilder X编辑器中，然后打开内置浏览器，打开开发者工具。这里不直接使用chrome定位元素，因为chrome看到的html实际上不是我们这个请求获取到的代码。我们定位到了一个 div 它子元素 是一个 div 和5个无序列表，显然，这就是我们要找的。仔细观察，我们发现新闻链接 a 标签都在 li 标签中。很好，那我们就有思路了。模拟请求，获取相应。取出 所有的 li 标签下的 a 标签。a 标签的href 属性就是我们要的新闻链接“Talk is cheap,give me code.”import requests import lxml.html url = 'http://news.baidu.com/' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3', 'Referer': 'http://news.baidu.com/guoji', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Cookie': 'BAIDUID=BB2DCB09D0BCEF14D99F6A6A6CE5A1DB:FG=1; BIDUPSID=BB2DCB09D0BCEF14D99F6A6A6CE5A1DB; PSTM=1549988189; BDUSS=H40YlBUdE5FaklweFFvc2szYmpILWRTdGlGeTlPRUxYZ3hPdVctQXVDYWVmelZkSVFBQUFBJCQAAAAAAAAAAAEAAAAVmE-ksKLA78K3ybXJtQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ7yDV2e8g1dd; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; H_PS_PSSID=1450_21092_29522_29518_29098_29568_28831_29221_22159; BDSFRCVID=M_0sJeCCxG3jeU3w_mtxLaFULTy8O-bEthyW3J; H_BDCLCKID_SF=tbkD_C-MfIvjHn8z2KT8bKCShUFsK6jW-2Q-5hOy3KO8eqRv5pnGX4P-KHrf3x6dtNLqL-L2MPOvhpFuDTtajj3QeaRt2tcyatj2WnTJ25r8e5rnhPF3yftTKP6-3MJO3b7B0l7FbM7G8h6bMf8By58dyajCQlkHaI5mohFLtDKhbKKCj5RMK4_SMUoHetrK-D5XQbC8Kb7VbpTEDMnkbfJBDGJR5-Pq-jvdblRhBCQIjMnTyURdXlD7yajKBlvWWmbx2Ron3RQTjnOqKPTpQT8r5b_OK5Oib4j-KbONab3vOpRzXpO1KMPzBN5thURB2DkO-4bCWJ5TMl5jDh05y6TXDN0qtTteJb3fL-08MJnEqbTkq4bohjPyX-jeBtQm05bxobLyJD5b_n6Ljn8MMpkS-P5n0jcqbHrDs4PbWDFKMC_GjjthDjPVMmTt2tc2K6r-04_8Kb7VbIJCXMnkbftWXfvmQ-oI-jvdWx5n2t5ZSfnueMri5bK7yajK2hTJbD3MVlrh3bvsVCbPQJ7pQT8ryhAOK5OibCrk2b5oab3vOpRzXpO1KMPzBN5thURB2DkO-4bCWJ5TMl5jDh05y6TLeHLDtTkqtR3tWJTOaj6jDbTnMIT8bKCShUFsy5cJB2Q-5KL--qoZeJ4G5pnVMMtq5JrPXPnpJCczafbdJJjoh4Pl-to2-fD7jnQHKTQdBgTxoUJh5DnJhhvG-xAb54LebPRiWPr9QgbjahQ7tt5W8ncFbT7l5hKpbt-q0x-jLn7ZVDD5fCtMMItr5b5H-PQHjHQB2-DXKKOLVh67tPOkeqOJ2Mt5M4LADpJd2R3OBI6l-lRmMCncKJoH5-7B3TtpexbH55uqJR4JVU5; Hm_lvt_e9e114d958ea263de46e080563e254c4=1565684960; LOCALGX=%u957F%u6C99%7C%35%31%36%32%7C%u957F%u6C99%7C%35%31%36%32; delPer=0; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; PSINO=3; Hm_lpvt_e9e114d958ea263de46e080563e254c4=1565742579', } response = requests.get(url=url,headers=headers) html_tree = lxml.html.etree.HTML(response.text) # 生成xpath解析对象 items = html_tree.xpath('//div[@id="body"]//li//a/@href') # //选取所有元素 /选取子元素或属性输出看看：['javascript:void(0);', 'http://m.news.cctv.com/2019/08/14/ARTIgmYd33BmyNsrPXVRKRg1190814.shtml', 'http://opinion.cctv.com/2019/08/14/ARTI36SgnScAujW6lbntQdGs190814.shtml', 'http://opinion.people.com.cn/n1/2019/0813/c1003-31292590.html', 'http://world.people.com.cn/n1/2019/0814/c1002-31293368.html', 'http://www.xinhuanet.com/politics/2019-08/13/c_1124871587.htm', 'http://www.xinhuanet.com/fortune/2019-08/13/c_1124871897.htm', 'http://china.cnr.cn/news/20190813/t20190813_524728803.shtml', 'http://www.xinhuanet.com/fortune/2019-08/13/c_1124870637.htm', 'https://www.thepaper.cn/newsDetail_forward_4151939', 'http://jingji.cctv.com/2019/08/14/ARTIcLXLCXdEl98Bzp4dP9og190814.shtml', 'http://www.xinhuanet.com/comments/2019-08/13/c_1124871201.htm', 'http://china.cnr.cn/NewsFeeds/20190812/t20190812_524728626.shtml', 'https://3w.huanqiu.com/a/564394/7P7MuFVkGt2?agt=8', 'https://3w.huanqiu.com/a/94d2e8/7P86kVZnYWc?agt=8', 'https://3w.huanqiu.com/a/86df83/7P87mvVZJew?agt=8', 'https://3w.huanqiu.com/a/9e85a6/7P8fZIooI9y?agt=8', 'https://3w.huanqiu.com/a/c36dc8/7P8b1UHRFYc?agt=8', 'https://3w.huanqiu.com/a/0c789f/7P7Z4ctSdji?agt=8', 'https://3w.huanqiu.com/a/a6b8af/7P8gKAKd5XG?agt=8', 'http://baijiahao.baidu.com/s?id=1641814751754264937', 'https://3w.huanqiu.com/a/a4d1ef/7P8kMc4M6zK?agt=8', 'https://3w.huanqiu.com/a/a4d1ef/7P7Rlc286w8?agt=8', 'https://3w.huanqiu.com/a/21eee3/7P7VvNLF1pC?agt=8', 'https://3w.huanqiu.com/a/c36dc8/7P86phvKNHO?agt=8', 'https://3w.huanqiu.com/a/c36dc8/7P7ZioA8SK4?agt=8', 'https://3w.huanqiu.com/a/4e1ccd/7P8jklw8Ffq?agt=8', 'https://3w.huanqiu.com/a/a4d1ef/7P7MT8a7jLG?agt=8', 'https://3w.huanqiu.com/a/a4d1ef/7P82aNn6Nvq?agt=8', 'https://3w.huanqiu.com/a/3458fa/7P885yABln2?agt=8', 'http://baijiahao.baidu.com/s?id=1641819009062212746', 'http://baijiahao.baidu.com/s?id=1641808311082531117', 'https://3w.huanqiu.com/a/0c789f/7P8dUnucNO0?agt=', 'https://3w.huanqiu.com/a/c4b13d/7P7LZd6Ak5q?agt=8', 'http://baijiahao.baidu.com/s?id=1641813846398704393', 'http://baijiahao.baidu.com/s?id=1641820893074131143', 'https://3w.huanqiu.com/a/c4b13d/7P7St8kvInS?agt=8', 'https://3w.huanqiu.com/a/4d0bf0/7P7Q7eIGCJi?agt=8', 'https://3w.huanqiu.com/a/8737f0/7P8f5hFsmXe?agt=8', 'https://3w.huanqiu.com/a/9029b5/7P8hdSTgYpi?agt=8', 'https://www.baidu.com/s?wd=%E4%B9%A0%E8%BF%91%E5%B9%B3%E6%80%BB%E4%B9%A6%E8%AE%B0%E7%89%B5%E6%8C%82%E7%9A%84%E6%B0%91%E7%94%9F%E4%BA%8B', 'https://www.baidu.com/s?wd=%E6%B7%B1%E5%9C%B3600%E6%9E%B6%E6%97%A0%E4%BA%BA%E6%9C%BA%E5%BA%94%E6%8F%B4%E9%A6%99%E6%B8%AF', 'https://www.baidu.com/s?wd=5G%E6%96%B0%E5%8F%B7%E6%AE%B5%E4%B8%8B%E6%9C%88%E6%94%BE%E5%8F%B7', 'https://www.baidu.com/s?wd=%E6%B8%AF%E8%AD%A6%E8%B0%B4%E8%B4%A3%E6%9A%B4%E5%BE%92', 'https://www.baidu.com/s?wd=%E5%9B%BD%E6%B3%B0%E8%88%AA%E7%A9%BA%E8%82%A1%E4%BB%B7%E5%A4%A7%E8%B7%8C', 'https://www.baidu.com/s?wd=%E5%93%AA%E5%90%92%E7%A5%A8%E6%88%BF%E8%B6%85%E7%BA%A2%E6%B5%B7%E8%A1%8C%E5%8A%A8', 'https://www.baidu.com/s?wd=%E6%97%A5%E6%9C%AC%E7%A7%BB%E5%87%BA%E7%99%BD%E5%90%8D%E5%8D%95', 'https://www.baidu.com/s?wd=%E6%BB%B4%E6%BB%B4%E8%A2%AB%E7%BD%9A550%E4%B8%87%E5%85%83', 'https://www.baidu.com/s?wd=%E9%A6%99%E6%B8%AF%E8%AD%A6%E9%98%9F%E7%94%B7%E8%B6%B3%E5%A4%BA%E5%86%A0', 'https://www.baidu.com/s?wd=%E9%9D%92%E5%B2%9B%E5%B8%82%E6%B0%91%E6%8D%A1%E6%B5%B7%E9%B2%9C', 'http://baijiahao.baidu.com/s?id=1641806920856311184', 'http://baijiahao.baidu.com/s?id=1641801134242707690', 'http://baijiahao.baidu.com/s?id=1641804985134705772', 'http://baijiahao.baidu.com/s?id=1641795161667151424', 'http://baijiahao.baidu.com/s?id=1641759706552362036', 'http://baijiahao.baidu.com/s?id=1641770098855674130', 'http://baijiahao.baidu.com/s?id=1641792566833082373', 'http://baijiahao.baidu.com/s?id=1641794233672307058', 'https://baijiahao.baidu.com/s?id=1641800725680668397&wfr=content', 'http://baijiahao.baidu.com/s?id=1641808179460287460', 'http://baijiahao.baidu.com/s?id=1641811388867477686', 'http://baijiahao.baidu.com/s?id=1641811286045373068', 'http://baijiahao.baidu.com/s?id=1641805465118766336', 'http://baijiahao.baidu.com/s?id=1641809855939168928', 'http://baijiahao.baidu.com/s?id=1641824412404067709', 'http://baijiahao.baidu.com/s?id=1641673081149173815', 'http://report.12377.cn:13225/toreportinputNormal_anis.do', 'javascript:void(0);', 'javascript:void(0);', 'javascript:void(0);', 'javascript:void(0);', 'javascript:void(0);']嗯，结果不错，我们只要将不是网址的和百度搜索的数据剔除掉就可以了。新闻内容爬取经过整理，我们发现百度新闻主要有百家号、央视网和环球新闻三个媒体的新闻，百家号占比较多，所以，我们先对百家号入手。百家号我们选取这条新闻，和上面一样，打开开发者工具，刷新一下。很好，看来新闻就是一个doc了，我们使用inspect工具我们很快定位到了新闻的标题和正文。上代码：import requests import lxml.html url = 'http://baijiahao.baidu.com/s?id=1641674895594803957' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3', 'Referer': 'http://news.baidu.com/guoji', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Cookie': 'BAIDUID=BB2DCB09D0BCEF14D99F6A6A6CE5A1DB:FG=1; BIDUPSID=BB2DCB09D0BCEF14D99F6A6A6CE5A1DB; PSTM=1549988189; BDUSS=H40YlBUdE5FaklweFFvc2szYmpILWRTdGlGeTlPRUxYZ3hPdVctQXVDYWVmelZkSVFBQUFBJCQAAAAAAAAAAAEAAAAVmE-ksKLA78K3ybXJtQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ7yDV2e8g1dd; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; H_PS_PSSID=1450_21092_29522_29518_29098_29568_28831_29221_22159; BDSFRCVID=M_0sJeCCxG3jeU3w_mtxLaFULTy8O-bEthyW3J; H_BDCLCKID_SF=tbkD_C-MfIvjHn8z2KT8bKCShUFsK6jW-2Q-5hOy3KO8eqRv5pnGX4P-KHrf3x6dtNLqL-L2MPOvhpFuDTtajj3QeaRt2tcyatj2WnTJ25r8e5rnhPF3yftTKP6-3MJO3b7B0l7FbM7G8h6bMf8By58dyajCQlkHaI5mohFLtDKhbKKCj5RMK4_SMUoHetrK-D5XQbC8Kb7VbpTEDMnkbfJBDGJR5-Pq-jvdblRhBCQIjMnTyURdXlD7yajKBlvWWmbx2Ron3RQTjnOqKPTpQT8r5b_OK5Oib4j-KbONab3vOpRzXpO1KMPzBN5thURB2DkO-4bCWJ5TMl5jDh05y6TXDN0qtTteJb3fL-08MJnEqbTkq4bohjPyX-jeBtQm05bxobLyJD5b_n6Ljn8MMpkS-P5n0jcqbHrDs4PbWDFKMC_GjjthDjPVMmTt2tc2K6r-04_8Kb7VbIJCXMnkbftWXfvmQ-oI-jvdWx5n2t5ZSfnueMri5bK7yajK2hTJbD3MVlrh3bvsVCbPQJ7pQT8ryhAOK5OibCrk2b5oab3vOpRzXpO1KMPzBN5thURB2DkO-4bCWJ5TMl5jDh05y6TLeHLDtTkqtR3tWJTOaj6jDbTnMIT8bKCShUFsy5cJB2Q-5KL--qoZeJ4G5pnVMMtq5JrPXPnpJCczafbdJJjoh4Pl-to2-fD7jnQHKTQdBgTxoUJh5DnJhhvG-xAb54LebPRiWPr9QgbjahQ7tt5W8ncFbT7l5hKpbt-q0x-jLn7ZVDD5fCtMMItr5b5H-PQHjHQB2-DXKKOLVh67tPOkeqOJ2Mt5M4LADpJd2R3OBI6l-lRmMCncKJoH5-7B3TtpexbH55uqJR4JVU5; Hm_lvt_e9e114d958ea263de46e080563e254c4=1565684960; LOCALGX=%u957F%u6C99%7C%35%31%36%32%7C%u957F%u6C99%7C%35%31%36%32; delPer=0; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; PSINO=3; Hm_lpvt_e9e114d958ea263de46e080563e254c4=1565742579', } response = requests.get(url=url,headers=headers) html_tree = lxml.html.etree.HTML(response.text) # 生成xpath解析对象 news_info = {} news_info['title'] = html_tree.xpath('//div[@class="article-title"][1]/h2/text()') [0] # //选取所有元素 /选取子元素或属性 news_info['content'] = html_tree.xpath('//div[@id="article"]//text()')我创建了一个字典来存储新闻内容，打印看看：{'title': ['受召回计划影响 蔚来ES8 7月交付量同比下滑67%'], 'content': '8月12日晚间，蔚来汽车公布今年7月的汽车交付数据，其向美国证券交易委员会递交的文件显示，7月期间蔚来ES8交付量同比下滑67%。受此影响，蔚来开盘后一度跌超5%，其后股价企稳回升。截至发稿时止，蔚来股价报3.06美元/ADS，下跌2.08%。蔚来公布的数据显示，7月份共交付837辆新车，环比跌约37.5%。其中，ES8交付数量为164辆，同比下滑67%；ES6已交付673辆。蔚来创始人李斌在公告中表示，7月份交付数量低迷的主要原因是公司主动召回4803辆ES8，导致电池供应紧张，影响了7月的生产和交付。'}央视网央视网，同样的步骤：定位到标题。定位到内容。上代码：import requests import lxml.html url = 'http://news.cctv.com/2019/07/31/ARTIDo8zXI4hAW3U7FflP1vD190731.shtml?spm=C94212.PxBacxQyDqwK.S95581.14' headers = { 'User-Agent': 'Mozillaa/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3', 'Referer': 'http://news.baidu.com/guoji', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Cookie': 'BAIDUID=BB2DCB09D0BCEF14D99F6A6A6CE5A1DB:FG=1; BIDUPSID=BB2DCB09D0BCEF14D99F6A6A6CE5A1DB; PSTM=1549988189; BDUSS=H40YlBUdE5FaklweFFvc2szYmpILWRTdGlGeTlPRUxYZ3hPdVctQXVDYWVmelZkSVFBQUFBJCQAAAAAAAAAAAEAAAAVmE-ksKLA78K3ybXJtQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ7yDV2e8g1dd; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; H_PS_PSSID=1450_21092_29522_29518_29098_29568_28831_29221_22159; BDSFRCVID=M_0sJeCCxG3jeU3w_mtxLaFULTy8O-bEthyW3J; H_BDCLCKID_SF=tbkD_C-MfIvjHn8z2KT8bKCShUFsK6jW-2Q-5hOy3KO8eqRv5pnGX4P-KHrf3x6dtNLqL-L2MPOvhpFuDTtajj3QeaRt2tcyatj2WnTJ25r8e5rnhPF3yftTKP6-3MJO3b7B0l7FbM7G8h6bMf8By58dyajCQlkHaI5mohFLtDKhbKKCj5RMK4_SMUoHetrK-D5XQbC8Kb7VbpTEDMnkbfJBDGJR5-Pq-jvdblRhBCQIjMnTyURdXlD7yajKBlvWWmbx2Ron3RQTjnOqKPTpQT8r5b_OK5Oib4j-KbONab3vOpRzXpO1KMPzBN5thURB2DkO-4bCWJ5TMl5jDh05y6TXDN0qtTteJb3fL-08MJnEqbTkq4bohjPyX-jeBtQm05bxobLyJD5b_n6Ljn8MMpkS-P5n0jcqbHrDs4PbWDFKMC_GjjthDjPVMmTt2tc2K6r-04_8Kb7VbIJCXMnkbftWXfvmQ-oI-jvdWx5n2t5ZSfnueMri5bK7yajK2hTJbD3MVlrh3bvsVCbPQJ7pQT8ryhAOK5OibCrk2b5oab3vOpRzXpO1KMPzBN5thURB2DkO-4bCWJ5TMl5jDh05y6TLeHLDtTkqtR3tWJTOaj6jDbTnMIT8bKCShUFsy5cJB2Q-5KL--qoZeJ4G5pnVMMtq5JrPXPnpJCczafbdJJjoh4Pl-to2-fD7jnQHKTQdBgTxoUJh5DnJhhvG-xAb54LebPRiWPr9QgbjahQ7tt5W8ncFbT7l5hKpbt-q0x-jLn7ZVDD5fCtMMItr5b5H-PQHjHQB2-DXKKOLVh67tPOkeqOJ2Mt5M4LADpJd2R3OBI6l-lRmMCncKJoH5-7B3TtpexbH55uqJR4JVU5; Hm_lvt_e9e114d958ea263de46e080563e254c4=1565684960; LOCALGX=%u957F%u6C99%7C%35%31%36%32%7C%u957F%u6C99%7C%35%31%36%32; delPer=0; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; PSINO=3; Hm_lpvt_e9e114d958ea263de46e080563e254c4=1565742579', } response = requests.get(url=url,headers=headers) response.encoding = 'utf-8' # 解决乱码 html_tree = lxml.html.etree.HTML(response.text) # 生成xpath解析对象 news_info = {} news_info['title'] = html_tree.xpath('//div[@class="cnt_bd"][1]/h1/text()')[0] # //选取所有元素 /选取子元素或属性 news_info['content'] = ''.join(html_tree.xpath('//div[@class="cnt_bd"][1]/p/text()'))输出看看：{'title': '国内油价调整搁浅与上调预期并存', 'content': '\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\u3000\u3000记者从多家社会监测机构了解到，近期多空因素交织，国际原油市场呈现震荡回暖，8月6日国内油价新一轮调整窗口将开启，从当前的原油变化率来看，届时搁浅与小幅上调预期并存。\u3000\u3000过去的一周，中东地区紧张局势再度升温，市场担忧原油供应安全恐将受到威胁，提振原油回涨。与此同时，目前美国处于夏季用油高峰期，原油库存大幅下降，但经济疲软的担忧仍存，这些因素相互交织冲抵，国际油价延续宽幅震荡走势，期间出现小幅上涨行情。\u3000\u3000截至7月29日收盘，纽约商品交易所9月交货的轻质原油期货价格上涨0.67美元，收于每桶56.87美元，涨幅为1.19%。9月交货的伦敦布伦特原油期货价格上涨0.25美元，收于每桶63.71美元，涨幅为0.39%。\u3000\u3000受此影响，国内参考的原油变化率仍稳居负值范围，但跌幅不断收窄。据卓创资讯测算，截至7月29日收盘，国内第5个工作日参考原油变化率为-1.31%，对应汽柴油下调49元/吨。而金联创测算的原油变化率在-1.88%，对应的汽柴油应下调50元/吨。\u3000\u3000卓创资讯分析师杨霞指出，虽然目前来看国内成品油零售限价调整幅度不足50元/吨的调整红线，不过因距离调价窗口尚有五个工作日，后期来看，国际原油方面，伊朗形势错综复杂，但各方均保持忍让，事态并未进一步发展但风险犹存；一系列经济数据疲软，多国央行先于美联储降息支撑经济继续扩张。市场缺乏主流影响力，国际油价宽幅震荡区间整理，期间不排除出现上行情况的突破。故原油变化率有望由负转正，本轮成品油零售限价调整搁浅与上调预期并存。当前国内部分地区加油站优惠幅度仍较大，对于广大车主来说，时刻关注当地的加油站优惠政策，是减少出行成本的重要措施。（记者 王璐）'}可以使用replace函数清洗掉转义字符。环球网[新闻链接](https://3w.huanqiu.com/a/a4d1ef/7P6CmNN6TRe?agt=8)很简单明了。上代码：这里只给xpath匹配的代码news_info = {} news_info['title'] = html_tree.xpath('//h1[@class="a-title"]/strong/text()') # //选取所有元素 /选取子元素或属性 news_info['content'] = ''.join(html_tree.xpath('//div[@class="a-con"]/p/text()'))打印输出：{'title': ['美航管局新任局长就职 称737 MAX复飞没有时间表'], 'content': '中新网8月13日电 据外媒报道，美国联邦航空管理局(FAA)新任局长斯蒂芬•迪克森12日宣誓就任，他表示，FAA没有让737 MAX飞机复飞的时间表。资料图：波音737 MAX 8。7月24日，这位达美航空公司负责航班运营的前高级副总裁在参议院，以52票对40票的投票结果通过担任FAA局长的任命。'}OK！我们完成了爬虫的准备工作，接下来，我们就要将爬虫实现了。我会选用scrapy框架实现爬虫的爬取与存储，存储我会选用elasticsearch。转载至CSDN博主：[李唐敏民]
百度新闻爬虫搜索引擎实战---爬虫篇（1）
爬虫部分首先，我们得爬取百度新闻的信息。爬虫分为两部分：获取新闻链接通过链接爬取新闻信息新闻链接爬取（1）1.获取新闻链接1.1 分析请求打开chrome浏览器，输入百度新闻链接，按F12打开开发者工具，依次点击Network->Doc，再刷新一次网页，效果如下：我们看到了所有返回doc的请求。接着，我们点击Preview选项卡：通过预览，我们可以看到这个请求热点要闻、热搜新闻词和百家号三个模块的信息，这些蓝色的链接就是我们要的新闻链接。点击Headers选项，我们可以看到请求的构造：很好，我们现在就可以通过构造类似请求来获取到热点要闻、热搜新闻词和百家号三个模块的信息了。构造请求，获取相应，解析html。但是，事情并不简单。我们滚动页面：我们发现还有一些模块并不在我们找到的那个请求中。我们判断，这些内容是在我们滚动页面时通过动态加载上去的。点击XHR选项卡，我们找到了一些线索：我们发现这些请求都带着一个 id 属性，而这些属性的中文恰巧对应我们看到的那个模块的名字。我们看看第一个xhr类型请求：它比我们找到的第一个请求多了一个Query String Parameters 属性，id表示模块名，t表示时间，ajax表示返回类型。这个时间如果用 ms 表示49年多，而计算器时间都是从1970年开始算起，所以这个数字表示的是ms。看完了请求的结构，我们可以看看服务器相应的内容了这个请求返回了一个json 结构数据，新闻链接就放在键值对内。除了当地新闻模块，其他模块的请求都返回了一个html，新闻链接放在html中。值得注意的是这些模块的请求的Query String Parameters 属性中没有ajax键。1.2 构造请求我们暂时放下第一个请求。我们首先实现返回json数据的请求：import requests import json url = 'http://news.baidu.com/widget?id=LocalNews&ajax=json&t=1565742671236' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3', 'Referer': 'http://news.baidu.com/guoji', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Cookie': 'BAIDUID=BB2DCB09D0BCEF14D99F6A6A6CE5A1DB:FG=1; BIDUPSID=BB2DCB09D0BCEF14D99F6A6A6CE5A1DB; PSTM=1549988189; BDUSS=H40YlBUdE5FaklweFFvc2szYmpILWRTdGlGeTlPRUxYZ3hPdVctQXVDYWVmelZkSVFBQUFBJCQAAAAAAAAAAAEAAAAVmE-ksKLA78K3ybXJtQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ7yDV2e8g1dd; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; H_PS_PSSID=1450_21092_29522_29518_29098_29568_28831_29221_22159; BDSFRCVID=M_0sJeCCxG3jeU3w_mtxLaFULTy8O-bEthyW3J; H_BDCLCKID_SF=tbkD_C-MfIvjHn8z2KT8bKCShUFsK6jW-2Q-5hOy3KO8eqRv5pnGX4P-KHrf3x6dtNLqL-L2MPOvhpFuDTtajj3QeaRt2tcyatj2WnTJ25r8e5rnhPF3yftTKP6-3MJO3b7B0l7FbM7G8h6bMf8By58dyajCQlkHaI5mohFLtDKhbKKCj5RMK4_SMUoHetrK-D5XQbC8Kb7VbpTEDMnkbfJBDGJR5-Pq-jvdblRhBCQIjMnTyURdXlD7yajKBlvWWmbx2Ron3RQTjnOqKPTpQT8r5b_OK5Oib4j-KbONab3vOpRzXpO1KMPzBN5thURB2DkO-4bCWJ5TMl5jDh05y6TXDN0qtTteJb3fL-08MJnEqbTkq4bohjPyX-jeBtQm05bxobLyJD5b_n6Ljn8MMpkS-P5n0jcqbHrDs4PbWDFKMC_GjjthDjPVMmTt2tc2K6r-04_8Kb7VbIJCXMnkbftWXfvmQ-oI-jvdWx5n2t5ZSfnueMri5bK7yajK2hTJbD3MVlrh3bvsVCbPQJ7pQT8ryhAOK5OibCrk2b5oab3vOpRzXpO1KMPzBN5thURB2DkO-4bCWJ5TMl5jDh05y6TLeHLDtTkqtR3tWJTOaj6jDbTnMIT8bKCShUFsy5cJB2Q-5KL--qoZeJ4G5pnVMMtq5JrPXPnpJCczafbdJJjoh4Pl-to2-fD7jnQHKTQdBgTxoUJh5DnJhhvG-xAb54LebPRiWPr9QgbjahQ7tt5W8ncFbT7l5hKpbt-q0x-jLn7ZVDD5fCtMMItr5b5H-PQHjHQB2-DXKKOLVh67tPOkeqOJ2Mt5M4LADpJd2R3OBI6l-lRmMCncKJoH5-7B3TtpexbH55uqJR4JVU5; Hm_lvt_e9e114d958ea263de46e080563e254c4=1565684960; LOCALGX=%u957F%u6C99%7C%35%31%36%32%7C%u957F%u6C99%7C%35%31%36%32; delPer=0; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; PSINO=3; Hm_lpvt_e9e114d958ea263de46e080563e254c4=1565742579', } response = requests.get(url=url,headers=headers) data = [] if response.status_code == 200: data=json.loads(response.text)输出：{'errno': 0, 'request_id': '0701106945', 'timestamp': 1565748701, 'data': {'LocalNews': {'errno': 0, 'data': {'cityid': 5162, 'name': '长沙', 'rows': {'pic': {'url': 'http://baijiahao.baidu.com/s?id=1641760525400781448', 'title': '两车相撞人员被困，长沙消防成功救援', 'time': '22:00', 'imgUrl': 'https://t11.baidu.com/it/u=1842898135,1137066914&fm=173&app=49&f=JPEG?w=218&h=146&s=5F3290E711C49F435875BCB703007001'}, 'first': [{'url': 'http://baijiahao.baidu.com/s?id=1641804248809095870', 'title': '「夏日长镜头」李小青：一天过手逾2000根滚烫...', 'time': '09:35', 'imgUrl': 'http://t10.baidu.com/it/u=3569769465,3052942297&fm=173&app=49&f=JPEG?w=218&h=146&s=EBB00FC740703D8A7CB04F680300A01B'}, {'url': 'http://baijiahao.baidu.com/s?id=1641803120457332923', 'title': '百日大会战全纪录｜抢抓利好天气 美宜佳（湖南）...', 'time': '09:17', 'imgUrl': 'http://t12.baidu.com/it/u=7268816,847537983&fm=173&app=49&f=JPEG?w=218&h=146&s=9E8A6CC96A2F21071985AC130300C0D2'}, ...... {'url': 'http://baijiahao.baidu.com/s?id=1641723919118977084', 'title': '湖南清晨突降暴雨！终于凉快了！接下来……', 'time': '12:18', 'imgUrl': 'http://t12.baidu.com/it/u=3300258029,584678755&fm=173&app=49&f=JPEG?w=218&h=146&s=2BE6722246848CA289BCF4CA0100A0E1'}, {'url': 'http://baijiahao.baidu.com/s?id=1641750202887330237', 'title': '长沙消防7月处置937个马蜂窝', 'time': '19:16', 'imgUrl': 'http://t10.baidu.com/it/u=754302183,953699378&fm=173&app=49&f=JPEG?w=218&h=146&s=72B11AC120A2411501B5B15A03008090'}, {'url': 'http://baijiahao.baidu.com/s?id=1641722142319250930', 'title': '命运多舛的长沙市042号“双限地”成功“再嫁”...', 'time': '11:50', 'imgUrl': 'http://t12.baidu.com/it/u=107624057,1688297014&fm=173&app=49&f=JPEG?w=218&h=146&s=A454EC36531A6C695AC505CB0300E032'}, {'url': 'http://baijiahao.baidu.com/s?id=1641755644328509610', 'title': '提醒丨体重骤降是减肥成功？原来是患了这种病', 'time': '20:43', 'imgUrl': 'http://t11.baidu.com/it/u=4243350295,2093996368&fm=173&app=49&f=JPEG?w=218&h=146&s=41362D72BBC050C24CC971ED0300A030'}]}}, 'ad': None}}}显然，我们成功了。json信息是最好处理的，所以我们能不能让其他模块的信息的也用json传过来呢？我们想到了ajax键......试试便知：import requests import json url = 'http://news.baidu.com/widget?id=civilnews&ajax=json&t=1565742671236' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3', 'Referer': 'http://news.baidu.com/guoji', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Cookie': 'BAIDUID=BB2DCB09D0BCEF14D99F6A6A6CE5A1DB:FG=1; BIDUPSID=BB2DCB09D0BCEF14D99F6A6A6CE5A1DB; PSTM=1549988189; BDUSS=H40YlBUdE5FaklweFFvc2szYmpILWRTdGlGeTlPRUxYZ3hPdVctQXVDYWVmelZkSVFBQUFBJCQAAAAAAAAAAAEAAAAVmE-ksKLA78K3ybXJtQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ7yDV2e8g1dd; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; H_PS_PSSID=1450_21092_29522_29518_29098_29568_28831_29221_22159; BDSFRCVID=M_0sJeCCxG3jeU3w_mtxLaFULTy8O-bEthyW3J; H_BDCLCKID_SF=tbkD_C-MfIvjHn8z2KT8bKCShUFsK6jW-2Q-5hOy3KO8eqRv5pnGX4P-KHrf3x6dtNLqL-L2MPOvhpFuDTtajj3QeaRt2tcyatj2WnTJ25r8e5rnhPF3yftTKP6-3MJO3b7B0l7FbM7G8h6bMf8By58dyajCQlkHaI5mohFLtDKhbKKCj5RMK4_SMUoHetrK-D5XQbC8Kb7VbpTEDMnkbfJBDGJR5-Pq-jvdblRhBCQIjMnTyURdXlD7yajKBlvWWmbx2Ron3RQTjnOqKPTpQT8r5b_OK5Oib4j-KbONab3vOpRzXpO1KMPzBN5thURB2DkO-4bCWJ5TMl5jDh05y6TXDN0qtTteJb3fL-08MJnEqbTkq4bohjPyX-jeBtQm05bxobLyJD5b_n6Ljn8MMpkS-P5n0jcqbHrDs4PbWDFKMC_GjjthDjPVMmTt2tc2K6r-04_8Kb7VbIJCXMnkbftWXfvmQ-oI-jvdWx5n2t5ZSfnueMri5bK7yajK2hTJbD3MVlrh3bvsVCbPQJ7pQT8ryhAOK5OibCrk2b5oab3vOpRzXpO1KMPzBN5thURB2DkO-4bCWJ5TMl5jDh05y6TLeHLDtTkqtR3tWJTOaj6jDbTnMIT8bKCShUFsy5cJB2Q-5KL--qoZeJ4G5pnVMMtq5JrPXPnpJCczafbdJJjoh4Pl-to2-fD7jnQHKTQdBgTxoUJh5DnJhhvG-xAb54LebPRiWPr9QgbjahQ7tt5W8ncFbT7l5hKpbt-q0x-jLn7ZVDD5fCtMMItr5b5H-PQHjHQB2-DXKKOLVh67tPOkeqOJ2Mt5M4LADpJd2R3OBI6l-lRmMCncKJoH5-7B3TtpexbH55uqJR4JVU5; Hm_lvt_e9e114d958ea263de46e080563e254c4=1565684960; LOCALGX=%u957F%u6C99%7C%35%31%36%32%7C%u957F%u6C99%7C%35%31%36%32; delPer=0; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; PSINO=3; Hm_lpvt_e9e114d958ea263de46e080563e254c4=1565742579', } response = requests.get(url=url,headers=headers) data = [] if response.status_code == 200: data=json.loads(response.text)我们直接修改将id改成civilnews。将data输出：{'errno': 0, 'request_id': '1459275082', 'timestamp': 1565749459, 'data': {'civilnews': {'title': '国内', 'name': 'civilnews', 'subClass': [......] 'focusNews': [{'ID': '11563334', 'TS': '2019-08-13 10:30:08', 'm_class_id': '-1', 'm_local_id': '-1', 'm_url': 'http://xhpfmapi.zhongguowangshi.com/vh512/share/6386641?channel=weixin&from=singlemessage&isappinstalled=0', 'm_title': '人生榜样——追记“良医”冯传汉', 'm_site': '', 'm_editor': '', 'm_news_time': '0', 'm_public_time': '10:30', 'm_text': '', 'm_image_url': '', 'm_is_picnews': '0', 'm_is_vidnews': '0', 'm_is_manualnews': '1', 'm_ext_type': '9', 'm_ext': '', 'm_topic_id': 0, 'm_relate_count': '0', 'm_same_count': '0', 'm_relate_url': '', 'm_v_table': 't_class_focus', 'm_v_class_id': '1', 'm_v_local_id': '-20480000', 'm_v_topic_id': '-20480000', 'm_v_tag': 'class_focustop', 'm_position': '1', 'm_user': 'luoxiao11', 'm_add_time': '1565663408', 'm_time_start': '0', 'm_time_end': '1565756992', '_ext': [], '_url_type': 1, 'm_public_time_seconds': '1565663408'}, ...... {'ID': '11480129', 'TS': '2019-07-31 14:42:39', 'm_class_id': '-1', 'm_local_id': '-1', 'm_url': 'http://news.cctv.com/2019/07/31/ARTIZtwYhlYknpH7KeXK6fBv190731.shtml?spm=C94212.PxBacxQyDqwK.S95581.201', 'm_title': '工伤赔偿遇争议，这几点你要了解', 'm_site': '', 'm_editor': '', 'm_news_time': '0', 'm_public_time': '14:42', 'm_text': '', 'm_image_url': '', 'm_is_picnews': '0', 'm_is_vidnews': '0', 'm_is_manualnews': '1', 'm_ext_type': '9', 'm_ext': '', 'm_topic_id': 0, 'm_relate_count': '0', 'm_same_count': '0', 'm_relate_url': '', 'm_v_table': 't_class_tophit', 'm_v_class_id': '1', 'm_v_local_id': '-20480000', 'm_v_topic_id': '-20480000', 'm_v_tag': 'class_focustop', 'm_position': '5', 'm_user': 'yangliuqianjing', 'm_add_time': '1564555359', 'm_time_start': '0', 'm_time_end': '1567233744', '_ext': [], '_url_type': 1, 'm_public_time_seconds': '1564555359'}]}}}信息比html要多。所以，我们可以通过修改id直接获取模块的json类型的数据。我们将id收集起来，作为一个数组：widget_ids = ['LocalNews', 'civilnews', 'InternationalNews', 'EnterNews', 'SportNews', 'FinanceNews', 'TechNews', 'MilitaryNews', 'InternetNews', 'DiscoveryNews', 'LadyNews', 'HealthNews', 'PicWall']然后遍历数组，便可以构造不同的请求来获取到相应模块的新闻链接了。1.3 解析请求json数据解析很简单，直接get().get()就完事了。上代码：widget_id = widget_ids[5] ...... news_list = data.get('data').get(widget_id).get('focusNews') news_urls = [] for news in news_list: news_urls.append(news['m_url'])输出news_urls看看：['http://baijiahao.baidu.com/s?id=1641789631757983484', 'http://baijiahao.baidu.com/s?id=1641732315026022896', 'http://baijiahao.baidu.com/s?id=1641716074849433290', 'http://baijiahao.baidu.com/s?id=1641717506132624235', 'http://baijiahao.baidu.com/s?id=1641716122873360445', 'http://baijiahao.baidu.com/s?id=1641731396468766645', 'http://baijiahao.baidu.com/s?id=1641716236638480148', 'http://baijiahao.baidu.com/s?id=1641719146849962071', 'http://baijiahao.baidu.com/s?id=1641716249431083379', 'http://baijiahao.baidu.com/s?id=1641721487025992126', 'http://baijiahao.baidu.com/s?id=1641716466864994412', 'http://baijiahao.baidu.com/s?id=1641734821937582002', 'http://baijiahao.baidu.com/s?id=1641716501086635804', 'http://baijiahao.baidu.com/s?id=1641717769458226714', 'http://baijiahao.baidu.com/s?id=1641716504997823224', 'http://baijiahao.baidu.com/s?id=1641732826977878578', 'http://baijiahao.baidu.com/s?id=1641716205623466920', 'http://baijiahao.baidu.com/s?id=1641728094582501670', 'http://baijiahao.baidu.com/s?id=1641716590072086360', 'http://baijiahao.baidu.com/s?id=1641717347541413195', 'http://baijiahao.baidu.com/s?id=1641716086646879984']完美！转载至CSDN博主：[李唐敏民]
1.两种集成测试1.1自顶向下测试特点：是从程序的初始模块开始测试。（1）该方法会在早期发现顶层的错误。（2）早期的程序框架可以进行演示（3）需要开发桩模块辅助测试。有些甚至需要多个桩模块辅助，加大了桩模块本来的错误影响。（4）测试完一个上层模块后，挑选哪个模块作为下一个测试模块，以及测试的顺序没有唯一的界定标准。优点：较早地验证了主要控制和判断点；按深度优先可以首先实现和验证一个完整的软件功能；功能较早证实，带来信心；只需一个驱动，减少驱动器开发的费用；支持故障隔离。缺点：柱的开发量大；底层验证被推迟；底层组件测试不充分。1.2自底向上测试：特点：是从程序的底层模块开始测试。（1）I/O操作可以提前测试，更好提交测试用例。（2）测试后比较容易观察输出。（3）需要开发驱动模块（4）直到最后一个模块提交，程序才能完整的系统测试。优点：对底层组件行为较早验证；工作最初可以并行集成，比自顶向下效率高；减少了桩的工作量；支持故障隔离。缺点：驱动的开发工作量大；对高层的验证被推迟，设计上的错误不能被及时发现。2.逻辑覆盖语句覆盖：（最弱）程序中每条可执行语句都有至少执行一次。判定（分支）覆盖：（较弱）每个判断的真假分支至少执行一次。条件覆盖：（弱）每个判定中的每个条件可能至少满足一次。判定/条件覆盖：（强）每个判断的真假分支至少执行一次。每个判定中的每个条件可能至少满足一次。条件组合覆盖：（较强）每个判定中条件的各种可能组合至少满足一次。路径覆盖：（最强）把所有可能路径至少都走一遍。3. 黑盒测试方法等价类划分法：边界值划分法：决策表法：错误推测法因果图法场景法4. 白盒测试方法代码检查法静态结构分析法逻辑覆盖法（*）基本路径测试法路径覆盖（*）5. 软件测试模型6. 自动化测试工具7.α、β、λ测试软件测试一般分α、β、λ三个阶段，α是第一阶段，一般只供内部测试使用，公司内部用户；β是第二个阶段，已经消除了软件中大部分的不完善之处，但仍有可能还存在缺陷和漏洞，一般只提供给特定的用户群来测试使用；λ是第三个阶段，此时产品已经相当成熟，只需在个别地方再做进一步的优化处理即可上市发行。8. 动态 静态测试静态测试： 静态测试是指不运行被测程序本身，通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性。静态测试主要包括各阶段的评审、代码检查、程序分析、软件质量度量等，用于对被测程序进行特性分析。动态测试： 通过运行被测程序来检查运行结果与预期结果的差异，并分析运行效率和健壮性等指标；这种方法包括三部分：构造测试用例、执行程序、分析程序的输出结果。9. 测试过程按4个步骤进行，即单元测试、集成测试、确认测试和系统测试及发版测试。开始是单元测试，集中对用源代码实现的每一个程序单元进行测试，检查各个程序模块是否正确地实现了规定的功能。集成测试把已测试过的模块组装起来，主要对与设计相关的软件体系结构的构造进行测试。确认测试则是要检查已实现的软件是否满足了需求规格说明中确定了的各种需求，以及软件配置是否完全、正确。系统测试把已经经过确认的软件纳入实际运行环境中，与其它系统成份组合在一起进行测试。10. 冒烟测试（不过，返工或等下一次重建）概念冒烟测试就是在每日build（构建版本）建立后，对系统的基本功能进行简单的测试。这种测试强调程序的主要功能进行的验证，而不会对具体功能进行更深入的测试。题目冒烟测试为一个测试阶段 (×)冒烟测试需要把此次需求的主流程都走一遍 (×)其他研发需要对自己的代码审核， 检查代码的正确性，这个过程我们称为 代码走查在以下测试阶段中，哪些涉及到路径测试 集成测试、单元测试IOS单元测试框架：OCUnit 、XCTest、 GHUnit、 OCMock转载至CSDN博主：[李唐敏民]
考点一：OSI七层参考模型OSI从逻辑上，把一个网络系统分为功能上相对独立的7个有序的子系统，它们由低到高分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。（1）物理层（Physical，PH）传递信息需要利用一些物理传输媒体，如双绞线、同轴电缆、光纤等。物理层的任务就是为上层提供一个物理的连接，以及该物理连接表现出来的机械、电气、功能和过程特性，实现透明的比特流传输。在这一层，数据还没有组织，仅作为原始的比特流提交给上层——数据链路层。（2）数据链路层（Data-link，D）数据链路层负责在2个相邻的结点之间的链路上实现无差错的数据帧传输。每一帧包括一定的数据和必要的控制信息，在接收方接收到数据出错时要通知发送方重发，直到这一帧无差错地到达接收结点，数据链路层就是把一条有可能出错的实际链路变成让网络层看起来像不会出错的数据链路。实现的主要功能有：帧的同步、差错控制、流量控制、寻址、帧内定界、透明比特组合传输等。（3）网络层（Network，N）网络中通信的2个计算机之间可能要经过许多结点和链路，还可能经过几个通信子网。网络层数据传输的单位是分组（Packet）。网络层的主要任务是为要传输的分组选择一条合适的路径，使发送分组能够正确无误地按照给定的目的地址找到目的主机，交付给目的主机的传输层。（4）传输层（Transport，T）传输层的主要任务是通过通信子网的特性，最佳地利用网络资源，并以可靠与经济的方式为2个端系统的会话层之间建立一条连接通道，以透明地传输报文。传输层向上一层提供一个可靠的端到端的服务，使会话层不知道传输层以下的数据通信的细节。传输层只存在端系统中，传输层以上各层就不再考虑信息传输的问题了。（5）会话层（Session，S）在会话层以及以上各层中，数据的传输都以报文为单位，会话层不参与具体的传输，它提供包括访问验证和会话管理在内的建立以及维护应用之间的通信机制。如服务器验证用户登录便是由会话层完成的。（6）表示层（Presentation，P）这一层主要解决用户信息的语法表示问题。它将要交换的数据从适合某一用户的抽象语法，转换为适合OSI内部表示使用的传送语法。即提供格式化的表示和转换数据服务。数据的压缩和解压缩、加密和解密等工作都由表示层负责。（7）应用层（Application，A）这是OSI参考模型的最高层。应用层确定进程之间通信的性质以满足用户的需求，以及提供网络与用户软件之间的接口服务。考点二： TCP/IP 体系结构TCP/IP 是Internet上的标准通信协议集，该协议集由数十个具有层次结构的协议组成，其中TCP和IP是该协议集中的两个最重要的核心协议。TCP/IP协议族按层次可分为以下四层：应用层、传输层、网络层和网络接口层，各层对应的PDU数据单元的名称如下图所示。考点三： IP协议在网络层工作，为了解决MAC地址不能区分两台主机是否属于同一个网络，制定的一套新地址，即IP地址。IPv4表达方式有两种表达方式，十进制和二进制（8bit），分为4组，每组范围是[0~255]。IPv4地址结构（重要）A类：第一组范围为0~127的地址，即第一组二进制首位为0B类：第一组范围为128~191的地址，即第一组二进制首位为10C类：第一组范围为192~223的地址，即第一组二进制首位为110D类：第一组范围为224~239的地址，即第一组二进制首位为1110E类：第一组范围为240~255的地址，即第一组二进制首位为1111子网寻址IP地址分为三级：网络号、子网号、主机ID。子网号：原有主机号借用若干位。网络号：网络信息中心分配。子网掩码(重要)子网掩码中，1对应ip中的网络号和子网号，0对应主机号。将ip地址与子网掩码进行按位与运算，得到的便是子网标识符。例题：已知一个IP地址为10.5.136.5, 子网掩码为255.255.64.0, 他的网络号和主机号分别是？136 为 10001000，64 为 01000000与运算为 0 ，所以 网络号为 10.5.0.0 ，主机号为 5ARP，ICMPARP：地址解析协议，将IP地址映射为MAC地址ICMP：Internet控制报文协议，控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。Ping和tracert原理特殊用途地址127.0.0.1：指电脑本身0.0.0.0 :集合255.255.255.255：广播地址IP数据包考点四：TCP协议TCP报文确认号ack：占4个字节，期待收到对方下一个报文段的第一个数据字节的序号；确认ACK：占1位，仅当ACK=1时，确认号字段才有效。ACK=0时，确认号无效三次握手四次挥手私有地址的范围分别是：A类地址范围：10.0.0.0—10.255.255.255；B类地址范围：172.16.0.0---172.31.255.555；C类地址范围：192.168.0.0---192.168.255.255。经典题在浏览器中输入URL并回车后都发生了什么？DNS解析，将域名翻译成ip1.1 查询浏览器缓存1.2 检查系统Host1.3 检查路由器缓存1.4 查询ISP DNS缓存1.5 递归查询浏览器与网站建立TCP连接2.1 第一次握手2.2 第二次握手2.3 第三次握手请求和传输数据浏览器渲染页面TCP和UDP的区别TCP提供面向连接的、可靠的数据流传输，UDP提供非面向连接的、不可靠的数据流传输TCP传输单位为TCP报文段，UDP为用户数据报TCP注重数据安全性，UDP数据传输快TCP和UDP相关协议TCP对应的协议：（1） FTP：文件传输协议，21端口。（2） Telnet：用于远程登陆，使用23端口。（3） SMTP：邮件传送协议，用于发送邮件，25号端口。（4） POP3：接收邮件，110端口。（5）HTTP：是从Web服务器传输超文本到本地浏览器的传送协议。默认端口：80UDP对应的协议：（1） DNS：用于域名解析服务，将域名地址转换为IP地址。DNS用的是53号端口。（2） SNMP：简单网络管理协议，使用161号端口，是用来管理网络设备的。由于网络设备很多，无连接的服务就体现出其优势。（3） TFTP，简单文件传输协议，该协议在端口69上使用UDP服务。交换机与路由器有什么区别？①工作所处的OSI层次不一样，交换机工作在OSI第二层数据链路层，路由器工作在OSI第三层网络层②寻址方式不同：交换机根据MAC地址寻址，路由器根据IP地址寻址③转发速不同：交换机的转发速度快，路由器转发速度相对较慢。加密算法对称密钥加密 指加密和解密使用同一个密钥的方法：如：DES、3DES、Blowfish、IDEA、RC4、RC5、RC6 和 AES非对称加密 是指使用一对非对称密钥，即公钥和私钥，公钥可以随意发布，但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理，对方接收到加密信息后，使用自己的私钥进行解密。如：RSA、ECC（移动设备用）、Diffie-Hellman、El Gamal、DSA（数字签名用）Hash算法 特别的地方在于它是一种单向算法，用户可以通过hash算法对目标信息生成一段特定长度的唯一hash值，却不能通过这个hash值重新获得目标信息。因此Hash算法常用在不可还原的密码存储、信息完整性校验等。如：MD2、MD4、MD5、HAVAL、SHA常见状态码200：请求成功301 : 永久性转移302 ：暂时性转移304 ： 已缓存400：Bad Request,请求有语法问题403：拒绝请求404：客户端所访问的页面不存在500 ：服务器内部错误503 ： 服务不可用，稍等TCP三次握手，四次挥手转载至CSDN博主：[李唐敏民]
1 处理机调度和死锁1.1 处理机调度在多道程序系统中，调度的实质是一种资源分配，处理及调度是对处理及资源进行分配。1.1.1 层次高级调度（外存 -> 内存 -> 就绪）（多道）又称长程调度或作业调度，调度对象是作业。主要功能是根据某种算法，决定将外存上处于后备队列中的哪几个作业调入内存，为它们创建进程、分配必要的资源，并将它们放入就绪队列。低级调度（就绪 -> 运行）（多道、分时、实时）又称短程调度或进程调度，调度对象是进程。主要功能是，根据某种算法，决定就绪队列中哪个进程获得处理机。中级调度（内存外存）又称内存调度。提高内存利用率和系统吞吐量。为此，把暂时不能运行的进程，调至外存等待（挂起）。当它们具备运行条件且内存有空闲是，把外存上的就绪进程重新调入内存（就绪）。1.1.2 处理机调度算法的目标共同目标提高资源利用率公平性平衡性策略强制执行批处理系统的目标平均周转时间短系统吞吐量高处理机利用率高分时系统的目标响应时间快均衡率实时系统的目标截止时间的保证可预测性1.2 作业与作业调度算法1.2.1 先来先服务（FCFS）和短作业优先（SJF）1.2.2 优先级调度算法（PSA）和高响应比（HRRN）1.3 进程调度1.3.1 轮转调度算法（RR）1.3.2 优先级调度算法1.3.3 多队列调度算法1.3.4 多级反馈调度算法1.4 实时调度1.4.1 最早截止时间优先（EDF）1.4.2 最低松弛度优先（LLF）1.6 死锁（特别重要）1.2.1 定义在一组进程发生死锁的情况下，这组死锁进程中每一个进程，都在等待另一个死锁进程所占有的资源。或者说，每个进程所等待的事件是该组中其他进程释放所占用的资源。但由于所有这些进程都已无法运行，因此它们谁都不能释放资源，致使没有任何一个进程可被唤醒。1.2.2 起因竞争不可抢占性资源竞争可消耗资源引起死锁进程推进顺序不当1.2.3 产生的必要条件死锁发生必须具备四个必要条件：1. 互斥条件： 分配的资源使用具有排它性。2. 请求和保持条件：进程已经保持至少一个资源，但又提出了新的资源请求。3. 不可抢占条件：进程已获得不能被剥夺。4. 循环等待条件：存在一个资源环形等待链。1.2.4 处理方法预防死锁避免死锁检测死锁解除死锁1.2.5 预防死锁破坏请求和保持条件所有进程开始运行之前，必须一次性地申请其在运行过程中所需的全部资源允许一个进程只获得运行初期所需要的资源后开始运行。进程运行过程中再逐步释放已分配给自己的、且已用毕的全部资源，然后再请求新的所需资源。破坏不可抢占条件当一个已经保持了某些不可被抢占资源的进程，提出新的资源请求而不能得到满足时，它必须释放已经保持的所有资源，待以后需要时再重新申请。破坏循环等待条件对系统所有资源类型进行线性排序，并赋予不同的序号。规定每个进程必须按序号递增的顺序请求资源。一个进程在开始时，可以请求某类序号为 i 的资源，以后只能请求 序号大于 i 的资源，或释放 i 请求任意资源。1.2.6 避免死锁银行家算法进程（重要）1. PCBPCB是用来记录进程信息的数据结构2. 进程的状态就绪状态执行状态阻塞状态3. 状态变化事件空->新建：创建执行一个程序的新进程，可能的事件有：新的批处理作业、交互登录（终端用户登录到系统）、操作系统因为提供一项服务而创建、由现有的进程派生等。新建->就绪：操作系统准备好再接纳一个进程时，把一个进程从新建态转换为就绪态。就绪->运行：需要选择一个新进程运行时，操作系统的调度器或分配器根据某种调度算法选择一个处于就绪态的进程。运行->退出：导致进程终止的原因有：正常完成、超过时限、系统无法满足进程需要的内存空间、进程试图访问不允许访问的内存单元（越界）、算术错误（如除以0或存储大于硬件可以接纳的数字）、父进程终止（操作系统可能会自动终止该进程所有的后代进程）、父进程请求终止后代进程等。运行->就绪：最常见的原因是，正在运行的进程到达了“允许不中断执行”的最大时间段，该把处理器的资源释放给其他在就绪态的进程使用了；还有一中原因可能是由于具有更改优先级的就绪态进程抢占了该进程的资源，使其被中断转换到就绪态。运行->阻塞：如果进程请求它必须等待的某些事件，例如一个无法立即得到的资源（如I/O操作），只有在获得等待的资源后才能继续进程的执行，则进入等待态（阻塞态）。阻塞->就绪： 当等待的事件发生时，处于阻塞态的进程转换到就绪态。就绪->退出：在上图中没有标出这种转换，在某些进程中，父进程可以在任何时刻终止一个子进程，如果一个父进程终止，所有相关的子进程都被终止。阻塞->退出：跟上一项原因类似。内存管理要解决的两个问题每个进程代码中使用的地址可能相同。解决思路：对代码中的地址重定向（加个基地址）。物理内存可能比较小，不能同时放很多进程进来。解决思路：把要运行的代码移到内存，暂时不用的代码移入磁盘，即交换（swap），内存置换1. 分段一个程序分成多个段（每个段特性不同为了方便管理，例如代码段只读、数据段等等），当然这都是逻辑上的。管理段的结构叫段表，段表保存中进程的PCB中。2. 页表 把程序按段分对程序员是友好的，但是如果物理存储也按段存，则会导致大块的内存碎片，例如现在需要分个10M的段但是连续的存储空间只有8M/9M/5M三个。解决办法： （将段打散存到页中）不要对内存进行连续的分配，将内存划分成1页1页，按页分配，1页4kb大小，最多浪费的也就4KB。这样不会有内存碎片，也不会出现没有符合要求大小的内存可以申请的情况，因为可以打散了分散到一页一页中。 整个系统的页表就是https://www.cnblogs.com/xdyixia/p/9253138.html中说的多级页表（这个整个系统的多级页表简单来说就是把物理地址都进行了按页划分，保存了每页的基地址（对应下图中的页框号））。程序向系统申请时内存时，系统就会把哪几个页框号分给程序的某个段，程序再把它段0中的第3页数据放到页框6中。说明：进程需要有自己的“页表”，里面映射双方是程序的逻辑地址中的页号和系统分给这給程序的页框号。3. 段页结合的内存管理实际在内存管理中的段页结合如下图，页号加偏移称为虚拟地址，MMU负载从虚拟地址到物理地址的转换，同时也负责权限检查。上面解决了每个进程代码中使用的地址可能相同，系统给每个进程分配基地址，进程保存在PCB中。但是进程可操作的虚拟地址为4G（32位系统），可物理地址为1G怎么办。4. 请求调页内存换入CPU对数据进行请求时，才会进行映射（虚拟内存到物理内存）。例如进程1正在运行，进行映射拿数据，查页表发现页框号中没有数据或有进程2的数据，则需要页表调入内存。页面置换算法1：最佳置换算法（Optimal）：一种理论的算法，选着淘汰的页面是以后一定不再使用的页面（理想化的），该算法无法实现，只能作为其他算法好坏的一个评价对比。2：先进先出（FIFO）算法： 总是最先淘汰最先进去的页面，该算法容易实现。缺点：通常程序调入内存的先后顺序和程序执行的先后顺序不一致，导致缺页率高。3：最近最久未使用算法LRU： 算法赋予每个页面一个访问字段，用来记录上次页面被访问到现在所经历的时间t，每次置换的时候把t值最大的页面置换出去(实现方面可以采用寄存器或者栈的方式实现)。4：时钟算法clock(也被称为是最近未使用算法NRU)：页面设置一个访问位R，并将页面链接为一个环形队列，页面被访问的时候访问位设置R为1。页面置换的时候，如果当前指针所指页面访问R为0，那么置换，否则将其置为0，循环直到遇到一个访问为位0的页面。但是这个方法有缺点：缺页比较少的时候（最近没有使用淘汰中的“最近”太长了），所有的R都为1（很少变成0）,每次都要转一圈才能找到换出去的页，退化成FIFO，效率不高。进程和线程转载至CSDN博主：[李唐敏民]