赞
踩
爬虫:网络爬虫(又称为网页蜘蛛,网络机器人),是一种按照一定规则,自动抓取万维网信息的程序或脚本。随着网络的迅速发展,万维网成为大量信息的载体,如何有效的提取并利用这些信息成为一个巨大挑战。搜索引擎作为辅助人们检索信息的工具成为用户访问万维网的入口和指南。网络爬虫是搜索引擎的重要组成部分;
搜索引擎的工作原理
搜索引擎是通过一种特定规律的软件跟踪网页的链接,从一个链接爬到另一个链接,搜索引擎的爬行是被输入了一定的规则,需要遵从一些命令或文件的内容。
Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取
搜索引擎是通过蜘蛛跟踪链接爬行到网页,并将爬行的数据存入原始页面数据库。其中的页面数据与用户浏览得到的HTML是完全一样的。搜索引擎蜘蛛在爬取页面时,也做一定的重复内容检测,一旦遇到权重很低的网上大量抄袭、采集或复制的内容,很可能就不爬取。
为了解决上述问题,定向抓取相关网页资源的聚焦爬虫应运而生。聚焦爬虫是一个自动下载网页的程序,它根据既定的抓取目标,有选择的访问万维网上的网页与相关链接,获取需要的信息。与通用爬虫相比,聚焦爬虫并不追求大的覆盖,而将目标定为抓取某一特定主题内容相关的网页,为面向主题的用户查询准备数据资源。
聚焦爬虫工作原理:
网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成部分。传统爬虫从一个或若干个初始网页URL开始,获得初始网页的URL,在抓取网页的过程中不断从当前页面上抽取新的URL放入队列,知道满足系统的停止条件。聚焦爬虫的工作流程较为复杂,需要根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列。然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到停止条件。另外,所有被爬虫抓取的网页将会被系统存储,进行一定的分析、过滤、并建立索引,以便之后的查询和检索;
相对于通用爬虫,聚焦爬虫还需要解决的问题:
(1) 对抓取目标的描述和定义
(2) 对网页或数据的分析与过滤
(3) 对URL的搜索策略
抓取目标的描述和定义是决定网页算法与URL搜索策略如何制定的基础。而网页分析算法和候选URL排序算法是决定搜索引擎所提供服务形式和爬虫网页抓取行为的关键所在。这两部分的算法又是紧密相关的。
网络爬虫的发展趋势
随着AJAX/Web2.0的流行,如何抓取AJAX等动态页面成了搜索引擎需解决的问题,如果搜索引擎依旧采用爬的机制,是无法抓取到AJAX页面的有效数据的。对于AJAX这样的技术,所需要的爬虫引擎必须是基于驱动的,而如果想要实现事件驱动,首先要解决以下问题:
第一:Java Script的交互分析和解释;
第二:DOM事件的处理和解释分发;
第三:动态DOM内容语义的抽取;
社交网络对爬虫带来的新挑战:
爬虫是模拟用户在浏览器或某个应用上的操作,把操作的过程,实现自动化的程序。当我们再浏览器中输入一个URL后,后台会发生什么,比如:
简单的来说,这段过程发生了以下四步:
浏览器是如何发送和接受这个数据呢?
HTTP协议(HyperText Transfer Protocol,超文本传输协议)目的是提供一种发布和接收HTML(HyperText Markup Language)页面的方法。
HTTP是基于TCP协议之上的。在TCP/IP协议参考模型的各层对应的协议如下图,其中HTTP是应用层协议。默认HTTP的端口是80,HTTPS的端口是443.
HTTP工作过程
一次HTTP操作称为一个事务,其工作整个过程如下:
HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲就是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL。其所用端口是443。
有两种基本的加密解密算法类型:
HTTPS通信的优点:
网络爬虫是搜索引擎抓取系统的重要组成部分。主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份。
网络爬虫的基本工作流程如下:
import requests #用来爬取网页 from bs4 import BeautifulSoup #用来解析网页 #我们的种子 seds = ["http://www.lagou.com/"] sum = 0 #我们设定终止条件为:爬到10000个页面时停止 while sum < 10000: if sum < len(seds): r = requests.get(seds[sum]) sum =sum + 1 #提取结构化数据做存储操作 do_save_action(r) soup = BeautifulSoup(r.content) urls = soup.find_all("href",.....) #解析网页所有链接 for url in urls: seds.append(url) else: break
- 请求方法
根据HTTP标准,HTTP请求可以使用多种请求方法。
HTTP1.0定义了三种请求方法:GET、POST、和HEAD方法;
HTTP1.1新增了五种请求方法:OPTIONS、PUT、DELETE、TRACE、和CONNECT方法;
centered 方法名称 | centered描述 |
---|---|
centered allOf(Class element type) | centered 创建一个包含指定枚举类型中所有枚举成员的 EnumSet 对象 |
centered complementOf(EnumSet s) | centered 创建一个与指定 EnumSet 对象 s 相同的枚举类型 EnumSet 对象,并包含所有 s 中未包含的枚举成员 |
centered copyOf(EnumSet s) | centered 创建一个与指定 EnumSet 对象 s 相同的枚举类型 EnumSet 对象,并与 s 包含相同的枚举成员 |
centered noneOf(<Class elementType) | centered 创建指定枚举类型的空 EnumSet 对象 |
centered of(E first,e…rest) | centered 创建包含指定枚举成员的 EnumSet 对象 |
centered range(E from ,E to) | centered 创建一个 EnumSet 对象,该对象包含了 from 到 to 之间的所有枚举成员 |
序号 | 方法 | 描述 |
---|---|---|
1 | GET | 请求指定的页面信息,并返回实体主体。 |
2 | HEAD | 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头 |
3 | POST | 向指定资源提交数据进行处理请求(例如提交表单或上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和已有资源的修改。 |
4 | PUT | 从客户端向服务器传送的数据取代指定的文档内容 |
5 | DELETE | 请求服务器删除指定的页面 |
6 | CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。 |
7 | OPTIONS | 允许客户端查看服务器的性能。 |
8 | TRACE | 回显服务器收到的请求,主要用于测试或诊断 |
GET和POST方法区别归纳:
HTTP协议定义了很多服务器交互的方法,最基本的有四种,分别是GET,POST,PUT,DELETE.一个URL地址用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的增改删查。我们最常见的是GET用于获取/查询资源信息,POST用于更新资源信息。
我们看看GET和POST的区别:
URL概述
统一资源定位符(URL,Uniform/Universal Resource Locator)用于完整的描述Internet上网页和其它资源的地址的一种标识方法。
基本格式如下schema://host[:port#]/path/…/[?query-string][#anchor]
当我们在浏览器中输入URL http://www.website.com的时候,浏览器会发送一个Request去获取http://www.website.com的html,服务器把Response发送回浏览器,浏览器分析HTML,发现其中引用了很多文件比如图片、CSS、JS等,浏览器会自动再次发送Requset去获取图片,CSS,JS等文件,当所有的文件全部下载完成后,网页被显示出来。
常用的请求报头
MIME的英文全称是Multipurpose Internet Mail Extensions(多用途互联网邮件扩展)
eg:
Accept:image/gif,表明客户端希望接受GIF图象格式的资源;
Accept:text/html,表明客户端希望接受html文本。
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
意思:浏览器支持的 MIME 类型分别是 text/html、application/xhtml+xml、application/xml 和 */*,优先顺序是它们从左到右的排列顺序。
Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;
Application:用于传输应用程序数据或者二进制数据;
设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定程序来打开。
Mime类型 | 扩展名 |
---|---|
text/html | .htm .html .shtml |
text/plain | text/html是以html的形态输出,比如就会在页面上显示一个文本框,而以plain形式就会在页面上原样显示这段代码 |
…… | …… |
q是权重系数,范围 0 =< q <= 1,q 值越大,请求越倾向于获得其“;”之前的类型表示的内容,若没有指定 q 值越大,请求越倾向于获得其“,则默认为1,若被赋值为0,则用于提醒服务器哪些是浏览器不接受的内容类型。
许多情形下这可以减少5-10倍的下载时间
eg:
Accept-Encoding:gzip;q=1.0, identity; q=0.5, *;q=0 // 按顺序支持 gzip , identity
如果有多个Encoding同时匹配, 按照q值顺序排列
如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受。
eg:
Accept-Language:zh-cn
如果请求消息中没有设置这个报头域,服务器假定客户对各种语言都可以接受。
eg:
Accept-Charset:iso-8859-1,gb2312
ISO8859-1,通常叫做Latin-1。Latin-1包括了书写所有西方欧洲语言不可缺少的附加字符;
gb2312是标准中文字符集;
UTF-8 是 UNICODE 的一种变长字符编码,可以解决多种语言文本显示问题,从而实现应用国际化和本地化。
如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。
状态码
Response消息中的第一行叫状态行,由HTTP协议版本号,状态码,状态消息三部分组成。
状态码用来告诉HTTP客户端,HTTP服务器是否产生了预期的Respose .
HTTP中定义了5类状态码,状态码由三维数字组成,第一个十字定义了响应的类别
1XX提示信息-表示请求已被成功接收,继续处理
2XX成功-表示请求已被成功接收,理解,接受
3XX重定向-要完成请求必须进行更进一步的处理
4XX客户端错误-请求有语法错误或请求无法实现
5XX服务器端错误-服务器未能实现合法的请求
最常见的响应状态码
HTTP Request Header
Cache头域
if-Modified-Since
作用:把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果时间一致,那么返回304,客户端就直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新的文件缓存起来,并显示在浏览器中。
if-None-Match
作用:If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag. 使用这样的机制将提高网站的性能
Pragma
作用: 防止页面被缓存, 在HTTP/1.1版本中,它和Cache-Control:no-cache作用一模一样
Pargma只有一个用法, 例如: Pragma: no-cache
注意: 在HTTP/1.0版本中,只实现了Pragema:no-cache, 没有实现Cache-Control
Cache-Control
作用:这个是非常重要的规则。 这个用来指定Response-Request遵循的缓存机制。各个指令含义如下
Cache-Control:Public 可以被任何缓存所缓存()
Cache-Control:Private 内容只缓存到私有缓存中
Cache-Control:no-cache 所有内容都不会被缓存
Client头域
Accept
作用: 浏览器端可以接受的媒体类型,
例如: Accept: text/html 代表浏览器可以接受服务器回发的类型为 text/html 也就是我们常说的html文档,
如果服务器无法返回text/html类型的数据,服务器应该返回一个406错误(non acceptable)
通配符 代表任意类型
例如 Accept: /* 代表浏览器可以处理所有类型,(一般浏览器发给服务器都是发这个)
Accept-Encoding:
作用: 浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate),(注意:这不是只字符编码);
例如: Accept-Encoding: gzip, deflate
Accept-Language
作用: 浏览器申明自己接收的语言。
语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等;
例如: Accept-Language: en-us
User-Agent
作用:告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本.
我们上网登陆论坛的时候,往往会看到一些欢迎信息,其中列出了你的操作系统的名称和版本,你所使用的浏览器的名称和版本,这往往让很多人感到很神奇,实际上,服务器应用程序就是从User-Agent这个请求报头域中获取到这些信息User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。
例如:User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)
Accept-Charset
作用:浏览器申明自己接收的字符集,这就是本文前面介绍的各种字符集和字符编码,如gb2312,utf-8(通常我们说Charset包括了相应的字符编码方案)
Cookie/Login 头域
Cookie:
作用: 最重要的header, 将cookie的值发送给HTTP 服务器
Entity头域
Content-Length
作用:发送给HTTP服务器数据的长度。
例如: Content-Length: 38
Content-Type
作用:
例如:Content-Type: application/x-www-form-urlencoded
Miscellaneous 头域
Referer:
作用: 提供了Request的上下文信息的服务器,告诉服务器我是从哪个链接过来的,比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。
例如: Referer:http://translate.google.cn/?hl=zh-cn&tab=wT
Transport 头域
Connection
例如: Connection: keep-alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接
例如: Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接。
Host(发送请求时,该报头域是必需的)
作用: 请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的
例如: 我们在浏览器中输入:http://www.guet.edu.cn/index.html
浏览器发送的请求消息中,就会包含Host请求报头域,如下:Host:http://www.guet.edu.cn 此处使用缺省端口号80,若指定了端口号,则变成:Host:指定端口号
HTTP Response header
Cache头域
Date
作用: 生成消息的具体时间和日期
例如: Date: Sat, 11 Feb 2012 11:35:14 GMT
Expires
作用: 浏览器会在指定过期时间内使用本地缓存
例如: Expires: Tue, 08 Feb 2022 11:35:14 GMT
Vary
作用:要了解 Vary 的作用,先得了解 HTTP 的内容协商机制。有时候,同一个 URL 可以提供多份不同的文档,这就要求服务端和客户端之间有一个选择最合适版本的机制,这就是内容协商。
例如: Vary: Accept-Encoding
Cookie/Login 头域
P3P
作用: 用于跨域设置Cookie, 这样可以解决iframe跨域访问cookie的问题
例如: P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR
Set-Cookie
作用: 非常重要的header, 用于把cookie 发送到客户端浏览器, 每一个写入cookie都会生成一个Set-Cookie.
例如: Set-Cookie: sc=4c31523a; path=/; domain=.acookie.taobao.com
Entity头域
ETag
作用: 和If-None-Match 配合使用。 (实例请看上节中If-None-Match的实例)
例如: ETag: “03f2b33c0bfcc1:0”
Last-Modified:
作用: 用于指示资源的最后修改日期和时间。(实例请看上节的If-Modified-Since的实例)
例如: Last-Modified: Wed, 21 Dec 2011 09:09:10 GMT
Content-Type
作用:WEB服务器告诉浏览器自己响应的对象的类型和字符集,
例如:
Content-Type: text/html; charset=utf-8
Content-Type:text/html;charset=GB2312
Content-Type: image/jpeg
Content-Length
指明实体正文的长度,以字节方式存储的十进制数字来表示。在数据下行的过程中,Content-Length的方式要预先在服务器中缓存所有数据,然后所有数据再一股脑儿地发给客户端。
例如: Content-Length: 19847
Content-Encoding
WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。
例如:Content-Encoding:gzip
Content-Language
作用: WEB服务器告诉浏览器自己响应的对象的语言者
例如: Content-Language:da
Miscellaneous 头域
Server:
作用:指明HTTP服务器的软件信息
例如:Server: Microsoft-IIS/7.5
X-AspNet-Version:
作用:如果网站是用ASP.NET开发的,这个header用来表示ASP.NET的版本
例如: X-AspNet-Version: 4.0.30319
X-Powered-By:
作用:表示网站是用什么技术开发的
例如: X-Powered-By: ASP.NET
Transport头域
Connection
例如: Connection: keep-alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接
例如: Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接。
Location头域
Location
作用: 用于重定向一个新的位置, 包含新的URL地址
实例请看304状态实例
HTTP协议是无状态的和Connection: keep-alive的区别
无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系
HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)
从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接
Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间
我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取。所以很多网站或电子邮箱会使用安全级别较高的HTTPS协议。
HTTPS简介
HTTPS其实是有两部分组成:HTTP+SSL/TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据。
客户端发起HTTPS请求
用户在浏览器输入一个https网址,然后连接到server的443端口。
服务端配置
采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面(startssl,有一年的免费服务),这套证书其实就是一对公钥和私钥。
传送证书
这个证书就是公钥,只是包含了很多信息,如证书颁发机构,过期时间等
客户端解析证书
这部分工作是由客户端的TLS完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没问题,那么就生成一个随机值。然后用证书对该随机值进行加密。(把随机值用锁锁起来,没有钥匙看不到)
传送加密信息
这部分传送的是用证书加密后的随机值,目的就是让服务器端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密。
服务端解密信息
服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密。所谓对称加密就是将信息和私钥通过某种算法混合到一起。这样除非知道私钥,否则无法获取内容。正好客户端和服务端都知道这个私钥。所以只要加密算法够好,私钥够复杂,数据就安全。
传输加密后信息
用私钥加密后的信息,可以在客户端被还原
客户端解密信息
客户端用之前生成的私钥解密信息
SSL的位置
HTTPS的工作原理
TTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。TLS/SSL协议不仅仅是一套加密传输的协议,更是一件经过艺术家精心设计的艺术品,
TLS/SSL中使用了非对称加密,对称加密以及HASH算法。握手过程的具体描述如下:
1.浏览器将自己支持的一套加密规则发送给网站。
2.网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
3.浏览器获得网站证书之后浏览器要做以下工作:
a) 验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任 ,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。 b) 如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码,并用证书中提供的公钥加密。 c) 使用约定好的HASH算法计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。
4.网站接收浏览器发来的数据之后要做以下的操作:
a) 使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。 b) 使用密码加密一段握手消息,发送给浏览器。
5.浏览器解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密。
这里浏览器与网站互相发送加密的握手消息并验证,目的是为了保证双方都获得了一致的密码,并且可以正常的加密解密数据,为后续真正数据的传输做一次测试。另外,HTTPS一般使用的加密与HASH算法如下:
非对称加密算法:RSA,DSA/DSS 对称加密算法:AES,RC4,3DES HASH算法:MD5,SHA1,SHA256
HTTPS对应的通信时序图如下:
HTTPS协议和HTTP协议的区别: (具体HTTP协议的介绍可见参考资料2)
https协议需要到ca申请证书,一般免费证书很少,需要交费。
http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。
http的连接很简单,是无状态的 。
HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议, 要比http协议安全。
建立连接协议(三次握手)
为什么需要三次握手?
情况一:client发出的第一个连接请求报文段并未丢失,而是在某个网络节点长时间滞留,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段,但server收到此请求后,误认为是client再次发出的新的连接请求,于是向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样server的很多资源就白白浪费了。
连接终止协议(四次挥手)
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
那可能有人会有疑问,在tcp连接握手时为何ACK是和SYN一起发送,这里ACK却没有和FIN一起发送呢。原因是因为tcp是全双工模式,接收到FIN时意味将没有数据再发来,但是还是可以继续发送数据。
3次握手过程状态:
4次挥手过程状态:(可参考上图)
CLOSED: 表示连接中断。
分享:
命由己造,相由心生,世间万物皆是化相,心不动,万物皆不动,心不变,万物皆不变
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。