关于wireshark:聊聊wireshark的进阶使用功能-京东云技术团队

1. 前言emmm,说起网络常识学习必定离不来wireshark工具,这个工具可能帮忙咱们疾速地定位网络问题以及帮忙正在学习网络协议这块的常识的同学验证实践与理论的一大利器,平时更多的只是停留在初步的应用阶段。也是利用部门外部的网络兴趣小组的探讨机会,私下对wireshark的一些进阶性能,比方专家模式、图表等性能进行调研,并结合实际场景抓包剖析对性能进行对照阐明。 2. wireshark中的剖析菜单——专家模式2.1什么是专家模式?Wireshark的专家信息是十分弱小的一个剖析模块,别离对谬误、正告、留神、对话等数据信息做出分类和正文,对网络故障剖析提供了强有力的信息根据,让你精确疾速地判断出故障点,并进行下一步解决。 2.2 严重性级别的每种分类别离代表什么含意?◦对话(Chat):对于失常通信的根本信息; ◦留神(Note):失常通信时的异样数据包; ◦正告(Warn):不是失常通信中的异样数据包(集体了解为:非正常的通信产生的数据包); ◦谬误(Error):数据包中的谬误,或者解析器解析时的谬误; 2.3 除了严重性级别之外,专家信息项还按组进行了分类:◦假如(Assumption):协定字段的数据不残缺,依据假设值进行了分析 ◦测验和(Checksum):校验和有效 ◦正文(Comment):数据包正文 ◦调试(Debug):调试信息,你不应该在wireshark的公布版本中看到这个组 ◦解密(Decryption):解密问题 ◦已弃用(Deprecated):协定字段曾经被弃用 ◦畸形的(Malformed):格局谬误的数据包或者解析程序有谬误。此数据报的解析已停止 ◦协定(Protocol):违反协定标准(比方有效字段值或者非法长度)。可能会持续对该数据包进行解析 ◦从新组装():从新组装时呈现问题。比方,不是所有的碎片都可用,或者在从新组装期间产生异样 ◦申请代码(Request Code):一个应用程序申请。通常调配聊天级别。 ◦响应代码(Response Code):应用程序响应代码示意潜在问题,比方找不到HTTP 404 ◦平安(Security):平安问题,比方不平安的实现 ◦序列(Sequence):协定序列号可疑,比方它不间断或者检测到重传 ◦未编码(Undecoded):解析不残缺或者数据因为其余问题无奈解码 2.4 TCP的14种专家模式?◦对话音讯(Chat): 窗口更新(window update)_:_由接收者发送,用来告诉发送者TCP接管窗口的大小曾经发生变化。 ◦留神音讯(Note): ▪ 反复ACK(Duplicate ACK )_:_当一台主机没有收到下一个冀望序列号的数据包时,会生成最近一次收到的数据的反复ACK。 留神:其实反复确认自身并不是问题,但如果接管方间断发送多个反复确认,则能够视为网络拥塞的信号。TCP协定中定义了一种拥塞管制机制,在发现网络拥塞时会触发这个机制,以减缓数据传输的速度,从而防止拥塞的加剧。 疾速重传:当TCP接管方间断发送三个反复确认时,发送方就会认为一个数据包曾经失落,并立刻进行疾速重传(Fast Retransmit)操作。它会从新发送那个没有收到确认的数据包,而不是期待超时工夫后再重传。这样做能够尽快地填补失落的数据包,进步数据传输速度和效率。 ▪TCP重传(retransmission)_:_数据包失落的后果。产生在收到重传的ACK, 或者数据包的重传计时器超时的时候。 ▪零窗口探查_:_在一个零窗口包被发送进来后,用来监督TCP接管窗口的状态。 ▪零窗口探查ACK:用来响应零窗口探查数据包。 ▪保活(TCP Keep-Alive Segment):当一个连贯的保活数据呈现时触发。 ▪保活ACK(ACK to Tcp keep-alive):用来响应保活数据包。 ▪窗口已满:用来告诉传输主机接受者的TCP窗口已满。 •正告信息(Warn): ◦上一段失落(Previous segments not captured):指明数据包失落。产生在当数据流中一个冀望序列号被跳过期。 ◦收到失落数据包的ACK(ACKed segment that was not captured):产生在当一个数据包被确认失落但在之后收到了这个曾经被确认失落的数据包的ACK数据包。 ◦零窗口(TCP Zero Window):当接管方曾经达到TCP接管窗口大小时,收回一个零窗口告诉,要求发送方进行传输数据。可能是网络拥塞或接管方未及时处理数据等起因导致的。 ...

September 22, 2023 · 1 min · jiezi

关于wireshark:Wireshark实用技巧

过滤反复包计算以后包与前4个包的MD5是否雷同,若雷同则抛弃:editcap -d input.pcap output.pcap 计算以后包与前13个包的MD5是否雷同:editcap -D 14 input.pcap output.pcap 有时抓到的包中,仅前16个字节不一样,从IP头往后的数据都一样,想把这些包也过滤掉:(计算MD5时,跳过前16个字节)editcap -I 16 -D 14 input.pcap output.pcap Mac零碎上,装置Wireshark后仍找不到editcap命令怎么办?从这个门路上面找:/Applications/Wireshark.app/Contents/MacOS

June 7, 2023 · 1 min · jiezi

关于wireshark:Wireshark安装使用

Wireshark装置应用Wireshark(前称Ethereal)是一个网络封包剖析软件。网络封包剖析软件的性能是截取网络封包,并尽可能显示出最为具体的网络封包材料。Wireshark应用WinPCAP作为接口,间接与网卡进行数据报文交换。 官网地址: https://www.wireshark.org/ 装置官网下载地址: https://www.wireshark.org/#do... 下载对应零碎的包,而后装置 应用1.关上Wireshark软件后,会自动检测你目前所处网络环境与你应用的网卡状况 2.找到本人应用的网卡,双击就能够进入抓包界面,下图圈起来的地位别离对应,开始抓包,暂停抓包,从新抓包。主页面中能够看到每一条的源地址,目标地址,协定类型,具体信息, 点击某条地址数据,看具体的报文 应用过滤器查问tcp.stream eq 12ip.dst==192.168.146.19ip.addr==192.168.146.19http&&(ip.addr==211.154.139.123||ip.addr==54.194.101.134||ip.addr==54.194.14.28||ip.addr==54.76.121.46||ip.addr==54.246.154.122||ip.addr==54.194.47.4)参考链接:https://blog.csdn.net/weixin_...https://blog.csdn.net/m0_4829...https://jingyan.baidu.com/art...https://blog.csdn.net/u014530...https://www.freesion.com/arti...

December 23, 2022 · 1 min · jiezi

关于wireshark:wireshark抓包新手使用教程

title: wireshark抓包老手应用教程 categories:[简略抓包] tags:[wireshark] date: 2022/04/29 <div align = 'right'>作者:hackett</div> <div align = 'right'>微信公众号:加班猿</div> wireshark抓包老手应用教程Wireshark是十分风行的网络封包剖析软件,能够截取各种网络数据包,并显示数据包详细信息。罕用于开发测试过程各种问题定位。本文次要内容包含: 1、Wireshark软件下载和装置以及Wireshark主界面介绍。 2、WireShark简略抓包示例。通过该例子学会怎么抓包以及如何简略查看剖析数据包内容。 3、Wireshark过滤器应用。过滤器蕴含两种类型,一种是抓包过滤器,就是抓取前设置过滤规定。另外一种是显示过滤器,就是在数据包剖析时进行过滤数据应用。通过过滤器能够筛选出想要剖析的内容。包含依照协定过滤、端口和主机名过滤、数据包内容过滤。具体规定和实例能够查看注释。 Wireshark软件装置软件下载门路:wireshark官网。依照零碎版本抉择下载,下载实现后,依照软件提醒一路Next装置。 阐明:如果你是Win10零碎,装置实现后,抉择抓包然而不显示网卡,下载win10pcap兼容性安装包。下载门路:win10pcap兼容性安装包 Wireshark 开始抓包示例先介绍一个应用wireshark工具抓取ping命令操作的示例,让读者能够先上手操作感受一下抓包的具体过程。 1、关上wireshark 2.6.5,主界面如下: 2、抉择菜单栏上Capture -> Option,勾选WLAN网卡(这里须要依据各自电脑网卡应用状况抉择,简略的方法能够看应用的IP对应的网卡)。点击Start。启动抓包。 3、wireshark启动后,wireshark处于抓包状态中。 4、执行须要抓包的操作,如在cmd窗口下执行ping www.baidu.com。 5、操作实现后相干数据包就抓取到了。为防止其余无用的数据包影响剖析,能够通过在过滤栏设置过滤条件进行数据包列表过滤,获取后果如下。阐明:ip.addr == 119.75.217.26 and icmp 示意只显示ICPM协定且源主机IP或者目标主机IP为119.75.217.26的数据包。阐明:协定名称icmp要小写。 5、wireshark抓包实现,就这么简略。对于wireshark显示过滤条件、抓包过滤条件、以及如何查看数据包中的具体内容在前面介绍。 Wireshakr抓包界面介绍 阐明:数据包列表区中不同的协定应用了不同的色彩辨别。协定色彩标识定位在菜单栏View --> Coloring Rules。如下所示 WireShark 次要分为这几个界面 \1. Display Filter(显示过滤器), 用于设置过滤条件进行数据包列表过滤。菜单门路:Analyze --> Display Filters。 \2. Packet List Pane(数据包列表), 显示捕捉到的数据包,每个数据包蕴含编号,工夫戳,源地址,指标地址,协定,长度,以及数据包信息。 不同协定的数据包应用了不同的色彩辨别显示。 \3. Packet Details Pane(数据包详细信息), 在数据包列表中抉择指定数据包,在数据包详细信息中会显示数据包的所有具体信息内容。数据包详细信息面板是最重要的,用来查看协定中的每一个字段。各行信息别离为 ...

April 29, 2022 · 2 min · jiezi

关于wireshark:自己能调通接口别人调不通

原创:打码日记(微信公众号ID:codelogs),欢送分享,转载请保留出处。场景有时咱们开发了一个api接口,本人调得好好的,接口文档也写好了,但他人调用时就是有问题,而当咱们调试时,发现申请基本没进来或进来了却取不到调用参数,该怎么告知对方调用姿态哪不对呢? 解决办法对于编码老手,个别会和对方撕扯一会,而后甚至去review对方的代码,这样兴许能解决问题,但本人毕竟不相熟他人零碎的实现,消耗工夫较长。 另外api调用端可能因为封装形式不同或者加过一些拦截器,导致你看调用端的代码基本看不到什么问题,或者因为调用参数有一些不易分辨或不可见的特殊字符,让你无奈察觉到这里有问题。 其实这种问题,咱们从网络层登程,比照本人正确调用时的数据包与对方谬误调用时的数据包内容,以此来诊断问题所在更加高效,毕竟任何封装或拦截器的解决,最终都会反馈在底层的交互数据上。 这里,我应用springmvc开发一个简略的接口,如下: @RestControllerpublic class TestController { @RequestMapping(value = "/test",produces = MimeTypeUtils.TEXT_PLAIN_VALUE) @ResponseBody public String test(@RequestParam(name = "name") String name){ return name; }}这个接口就是间接将name参数的值返回了,而后我应用curl模仿正确与谬误的调用形式,如下: #正确调用形式$ curl http://localhost:8081/test --data-urlencode 'name=a+b'a+b#谬误调用形式$ curl http://localhost:8081/test --data 'name=a+b' a b假如调用方的代码实现的逻辑相似下面谬误的调用形式,传递name参数为a+b,失去的却是a b,接下来咱们来定位看看,谬误的调用办法问题在哪? 办法1:应用wireshark抓包软件 关上wireshark,先后抓包两次失常的以及不失常的申请数据,拿到申请数据后通过文本差别比照工具来比照。 如下为wireshark两次抓包后果,应用追踪流 -> TCP,查看HTTP申请数据 如下为正确的HTTP申请数据,其中红色为申请数据,蓝色为响应数据 如下为谬误的HTTP申请数据 比照申请数据差别 能够看出,一个申请name参数为a%2Bb,一个申请name参数为a+b,显然这是因为name参数值没有url_encode导致的。 另外或者你会奇怪,为啥谬误申请值为a+b,为啥代码外面获取到的却是a b? 起因是tomcat接管到申请参数后,会做一次url_decode,而+号会被decode为空格,java的URLDecoder.decode("a+b", "UTF-8")也是如此。 办法2:应用socat命令 在抓包工具无奈应用的状况下,能够尝试socat命令,应用socat命令来直达申请,调用端将申请先发给socat,socat再把申请转给服务端,如下: # 应用socat直达申请$ socat -v TCP4-LISTEN:8080,bind=0.0.0.0,reuseaddr,fork TCP4:localhost:8081# 调用端拜访socat监听的8080端口# 正确调用形式$ curl http://localhost:8080/test --data-urlencode 'name=a+b'a+b# 谬误调用形式$ curl http://localhost:8080/test --data 'name=a+b' a b再去看socat,会发现如下后果: ...

March 27, 2022 · 1 min · jiezi

关于wireshark:翻译Improve-Cuckoos-Ability-Of-Analyzing-Network-Traffic

原文地址:https://github.com/cssaheel/d... 1.1 IntroductionCuckoo Sandbox is an Automated Malware Analysis developed by Claudio Guarnieri, mainly Cuckoo is a lightweight solution that performs automated dynamic analysis of provided Windows binaries. It is able to return comprehensive reports on key API calls and network activity. This documentation is introduce you a library which processes the network files (PCAP files or Packet-Capture files) and return back a report of the result. This library dissect packets fields and extract the most possible extent of information out of network packets, it also aware of tcp reassemblingn not just that it can recover the downloaded files for http, ftp and the sent emails by smtp.Cuckoo Sandbox是Claudio Guarnieri开发的主动恶意软件剖析工具,次要的Cuckoo是一个轻量级解决方案,该计划对提供的Windows二进制文件执行主动动态分析。它可能返回无关要害API调用和网络流动的全面报告。本文档向您介绍一个库,它解决网络文件(PCAP文件或数据包捕捉文件)并返回后果报告。该库解析数据包字段,并从网络数据包中提取尽可能多的信息,它还理解tcp重组,不仅能够复原http、ftp下载的文件和smtp发送的电子邮件。 ...

March 26, 2022 · 6 min · jiezi

关于wireshark:黑客之道-网络安全之WireShark抓包及常用协议分析

November 12, 2021 · 0 min · jiezi

关于wireshark:后端开发工程师必备技能wireshark抓包

抓包原理wireshark这篇文章次要是用来记录一下wireshark原理和应用办法,包含一些性能。一方面分享,一方面给本人做个笔记,而且作为一个后盾开发人员,把握抓包工具是必备的技能之一。 一、wireshark简介Wireshark(前称Ethereal)是一个网络封包剖析软件。网络封包剖析软件的性能是撷取网络封包,并尽可能显示出最为具体的网络封包材料。Wireshark应用WinPCAP作为接口,间接与网卡进行数据报文交换。 二、抓包是抓哪些包?1.本机环境也就是抓取的是咱们电脑的网卡进出的流量 2.集线器环境流量防洪,同一抵触域(网络域)物理层 3.交换机环境也就是数据链路层(MAC地址表),如图所示,在这个环境中获取数据包的形式有一下几种:3.1 端口镜像(SPAN)利用SPAN技术咱们能够把交换机上某些想要被监控端口(以下简称受控端口)的数据流COPY或MIRROR一 份,发送给连贯在监控端口上的流量分析仪 3.2 ARP坑骗针对以太网地址解析协定(ARP)的一种攻打技术,通过坑骗局域网内访问者PC的网关MAC地址,使访问者PC错认为攻击者更改后的MAC地址是网关的MAC,导致网络不通。此种攻打可让攻击者获取局域网上的数据包甚至可篡改数据包,且可让网上上特定计算机或所有计算机无法失常连线 3.3 MAC泛洪交换机中存在着一张记录着MAC地址的表,为了实现数据的疾速转发,该表具备主动学习机制;泛洪攻打即是攻击者利用这种学习机制一直发送不同的MAC地址给交换机,充斥整个MAC表,此时交换机只能进行数据播送,攻击者凭此取得信息。 二、底层原理看图所示: 三、过滤器1、抓包过滤器也叫捕获过滤器,设置步骤为:抉择 capture -> options。填写"capture filter"栏或者点击"capture filter"按钮为您的过滤器起一个名字并保留,以便在今后的捕获中持续应用这个过滤器。点击开始(Start)进行捕获。 Protocol(协定): 可能的值: ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp and udp. 如果没有特地指明是什么协定,则默认应用所有反对的协定。Direction(方向): 可能的值: src, dst, src and dst, src or dst 如果没有特地指明起源或目的地,则默认应用 “src or dst” 作为关键字。 例如,"host 10.2.2.2"与"src or dst host 10.2.2.2"是一样的。Host(s): 可能的值: net, port, host, portrange. 如果没有指定此值,则默认应用"host"关键字。 例如,"src 10.1.1.1"与"src host 10.1.1.1"雷同。Logical Operations(逻辑运算): 可能的值:not, and, or. 否(“not”)具备最高的优先级。或(“or”)和与(“and”)具备雷同的优先级,运算时从左至右进行。 例如, “not tcp port 3128 and tcp port 23"与”(not tcp port 3128) and tcp port 23"雷同。 "not tcp port 3128 and tcp port 23"与"not (tcp port 3128 and tcp port 23)"不同。注意事项:当应用关键字作为值时,需应用反斜杠“\”。"ether proto \ip" (与关键字"ip"雷同).这样写将会以IP协定作为指标。"ip proto \icmp" (与关键字"icmp"雷同).这样写将会以ping工具罕用的icmp作为指标。 能够在"ip"或"ether"前面应用"multicast"及"broadcast"关键字。当您想排除播送申请时,"no broadcast"就会十分有用。 ...

September 8, 2021 · 1 min · jiezi

wireshark-ICMP

总体抓包图bogon,哈哈 关注看icmp报文类型和代码 win 下执行traceertC:\Users\tb>tracert jd.com通过最多 30 个跃点跟踪到 jd.com [118.193.98.63] 的路由: 1 2 ms 2 ms 2 ms bogon [192.168.1.1] 2 10 ms 4 ms 4 ms 100.64.0.1 3 5 ms 5 ms 5 ms 73.254.120.106.static.bjtelecom.net [106.120.254.73] 4 7 ms * 5 ms 219.142.1.70 5 12 ms 8 ms 7 ms 220.181.0.34 6 * * * 请求超时。 7 * * * 请求超时。 8 * * * 请求超时。 9 * * * 请求超时。 10 * * * 请求超时。 11 * * * 请求超时。 12 * * * 请求超时。 13 * * * 请求超时。 14 * * * 请求超时。 15 * * * 请求超时。 16 7 ms 6 ms 6 ms 118.193.98.63跟踪完成。应用实现举例1. 将ttl 设置过期源主机向目的主机发送一系列特定的UDP数据报。第一组ip数据报 ttl=1第二组IP数据报ttl=2,etc...,如下图 ...

October 4, 2019 · 2 min · jiezi

Directory-Not-Empty-删不掉的幽灵

无法删除的文件最近部门NAS测试团队遇到一个非常诡异的问题,在删除一棵存在SMB共享文件夹的文件树时,删除完子目录的所有文件后,再删除这个子目录的时候居然系统报出“Directory Not Empty”的错误从而导致用例测试未通过,打开这个目录一看,确实有一个文件并未删除成功,再查看I/O工具的日志,报告所有的文件都已经成功删除。难道是I/O工具出了问题而没有正确报出错误,这个经过工具开发者的研究后确认后貌似工具没有任何问题,这个问题起初被开发团队踢皮球,死活不承认是SMB2服务器的问题。死活非得让抓取网络包来证实。 作为一个网络分析的伪专家,自己也厚着脸皮主动蹭入NAS测试团队强行出力,希望把这个悬案搞个谁落石出。 抓包重现首先,设置好抓包参数,同时重现问题,这一步很顺利。由于测试参数没有任何更改,很顺利的重现了问题,并且将出问题对应时间点的网络包悉数抓到。 在Windows2106的客户端开启抓包工具wireshark(其对应的命令行工具为 tshark), 并且设置好相关参数: $ tshark -i ens1 -B 4096 -s 1024 -w client-traffic.pcap参数的含义就是在接口ens1上抓取长度为1024字节的每一个帧, 并把这些帧存在client-traffic.pcap的文件里 分析在抓取到网络包以后,我们开始解包分析: 同样通过tshark命令解包分析, 并将揭开的内容分别重定向到摘要文件client-traffic.summary和详细展开格式的client-traffic.detail文件当中: $ tshark -t ud -Y "ip.addr==<server-ip>" -r client-traffic.pcap >>client-traffic.summary$ tshark -t ud -O smb2 -Y "ip.addr==<server-ip>" -r client-traffic.pcap >>client-traffic.detail打开client-traffic.summary文件后的一步就是要找到对应未删除成功的文件(文件名: VCg8iMkGWgll2VJoEFMUa0FKp1DJHEG2)最后一次出现的帧,简单的通过文本搜索便可定位,找到对应的帧以后发现,这个操作是一个Create操作,根据协议[MS-SMB2], 删除操作是通过一组三元操作 Create/SetInfo/Close来实现的,称为Delete-On-Close,由于我们正要寻找的是删除操作,借此可以大胆推测,这个Create (Frame #210725)请求正是三元删除重的第一步, 再往后的帧一个个寻找,果然找到了第二步SetInfo (Frame #210727) 和第三步Close (Frame #210757, 通过该帧展开后确认其FileID属性与前两步操作对象一致) 两个请求以及对应的服务器端的回复:最后Close并未得到服务器回复 Delete-On-Close 操作中的前两步Delete-On-Close 操作中的前两步然而最后的一步的close 请求(Frame #210757)并未得到服务器端的回复,那么问题显然出在了这里,继续往下分析,为什么服务器没有对最后一步close操作作出响应呢? 最后Close并未得到服务器回复 奇怪的是,这个close操作发出后在0.1秒内没有得到任何回复,于是出发了TCP层的超时重传(RTO)(Frame #210765),按道理说在同一个实验室的内部网络下,网络状况是十分好的,基本上不可能发生RTO的情况(即便连快速重传也是极为罕见的),除非服务器出现了宕机。此时我突然想到我们测试当中为了测试SMB2的CA功能(Continues Availability:高可靠性,容忍服务器重启或者故障转移), 经常会引入错误注入的测试用例,再次翻看测试日志,果然发现在创建和删除文件操作的同时有重启服务器节点的操作执行,查看时间戳和发生问题的时间点一直,现在基本可以明确的是,发生的问题和CA有关了。 删除文件同时服务器重启 现在来看看正常的CA流程,当客户端一个SMB2请求遇到服务器重启的情况下,网络会暂时断开,发出的请求在若干次超时重传以后会收到服务重启后发出的TCP重置请求(RST)(Frame #210769), 客户端在收到此请求后便可得知网络发生了断连,为是后续操作得以延续,必须再次建立TCP的连接(通过三次握手 Frame #210770, #210771, #210772), 重新协商(Negotiate. Frame #210773)建立会话(Session Setup. Frame #210776)和共享文件根目录的连接(Tree Connect. Frame #210785), 最后,因为客户端知道在网络断连之前最后一次没有响应的操作即目标文件,此时客户端会通过Create操作(Frame #210787)重新发起一个对目标文件的连接(在client-traffic.detail可看到展开后的Create操作的RECONNECT信息),从而接续上服务器从其前的步骤,实现CA的功能特性 ...

May 11, 2019 · 1 min · jiezi

网络分析利器wireshark命令版4tshark结合ES

tshark是网络分析工具wireshark下的一个工具,主要用于命令行环境进行抓包、分析,尤其对协议深层解析时,tcpdump难以胜任的场景中。本系列文章将整理介绍tshark相关内容。本文将介绍与tshark相关的流量解决方案。 利用tshark,不仅可以对现有的pcap文件进行分析,由于可以输出其他格式,也就可以结合ES的强大搜索能力,达到对数据报文进行记录、分析处理的能力,可以实现回溯分析,结合kibana可视化工具,甚至达到实时可视化监控。 tshark + elastic stackelastic stack全家桶性能一直被诟病,后来另起炉灶,针对采集使用golang构建出一套beats,用于不同的采集场景。其中针对网络流量,开发出packetbeat。 packetbeat的优势是定制了elasticsearch的mapping、kibana一系列可视化图表,可以满足一般对tcp、dns、udp等常规报文的分析。基本达到开箱即用程度。 但packetbeat也有不足,对报文的分析采用会话分析,没有一个个报文单独分析,倾向于应用层,对网络层面分析不足(尤其是故障排查时),此外,支持的协议有限,仅常见协议与tshark的2000多种存在明显差距,当遇到不支持时,需要等待支持或手动写插件,难度极高。 离线导入elasticsearchtshark支持将pcap报文分析后生成json文件导入elasticsearch,同时支持elasticsearch的批量导入接口_bulk的格式,命令如下: tshark -r test_trace.pcap -T ek > test_trace.pcap.json之后可以将json文件通过curl导入。 curl -s -H "Content-Type: application/x-ndjson" -XPOST "localhost:9200/foo/_bulk" --data-binary "@/Users/test-elastic/test_trace.pcap.json"注: 导入时可能存在导入失败,由于_bulk接口对post的文件大小有限制,尽量不要超过15MB,最好在10MB以内。如果超过,建议使用tshark的输出条件生成多个json文件,使用curl依次导入。如果导入失败,可以在curl加-v查看提示信息。默认索引名为类似 packets-2019-04-23(报文记录的日期),可以导入后重新索引可以使用类似以下命令查看导入情况: curl 'http://127.0.0.1:9200/packets-2019-04-23/_search/?size=10&pretty=true'实时监控方案主要思路使用tshark实时抓取报文,并启用过滤策略使用tshark解析捕获的报文,提取指定的字段并写入csv文件中,或者使用json格式在下一步进行ETL writes captured wireless packets as .csv.使用filebeat持续检测csv文件,并发个logstash用于字段过滤之类(如无需过滤可以跳过logstash直接发给elastsearch)logstash对字段进行过滤,格式转化等,之后发到elasticsearch使用kibana进行数据可视化,对报文统计分析简单实现1. tshark部分tshark -a duration:600 -i phy0.mon -t ad -t ad -lT fields -E separator=, -E quote=d -e _ws.col.Time -e wlan.fc.type -e wlan.fc.type_subtype -e radiotap.dbm_antsignal -e frame.len -e radiotap.datarate > tshark.csv2. filebeat简单filebeat.yml配置文件 ...

May 1, 2019 · 2 min · jiezi

网络分析利器wireshark命令版:Apache Spot中tshark模块(3)

tshark是网络分析工具wireshark下的一个工具,主要用于命令行环境进行抓包、分析,尤其对协议深层解析时,tcpdump难以胜任的场景中。本系列文章将整理介绍tshark相关内容。本文将介绍与tshark相关的开源系统。Apache SpotSpot简介Apache Spot是一个开源软件,提供流量和数据包分析的洞察力。通过透明的服务交付,可以帮助识别企业与服务提供商或在云规模运营的资源之间发生的攻击、潜在安全威胁,深入了解其网络环境及安全风险。虽然威胁情报工具有助于识别未知威胁和攻击,但发现未知威胁仍然是一项挑战。 Apache Spot通过大数据和科学计算学科中强大的技术,专注于检测诸如横向移动,旁道数据逃逸,内幕问题或隐身行为等事件的“深层安全问题”,使用流量和数据包分析技术暴露可疑连接和以前看不见的攻击的能力,为公司构建一个旨在支持这一战略的解决方案。整体架构主要功能及特点 感知Telemetry Flows.域名解析DNS (pcaps).代理Proxy.** 并行采集框架Parallel Ingest Framework开源解码器Open source decoders.读取hadoop数据Load data in Hadoop.数据转换Data transformation. 机器学习Machine Learning 快速过滤10亿级事件Filter billion of events to a few thousands.无监督学习Unsupervised learning. 操作分析Operational Analytics 可视化Visualization.启发式分析Attack heuristics.噪音过滤Noise filter.Spot采集架构由上图可知,Apache Spot在处理DNS流量时采用tshark方案,用于协议解析数据ETL等工作。tshark相关源码根据架构图,发现主要在ingest模块,查看相关源码,可以发现Spot是如何应用tshark的。具体代码如下:查看源码 spot-ingest/pipelines/dns/worker.py # build process cmd. process_cmd = “tshark -r {0}{1} {2} > {0}{1}.csv”.format(self._local_staging, file_name, self._process_opt)再查看相关配置 spot-ingest/ingest_conf.json “dns”:{ “type”:“dns”, “collector_path”:"/collector_path/dns", “local_staging”:"/collector_path/dns/tmp", “supported_files”:[".pcap"], “pkt_num”:“650000”, “pcap_split_staging”:"/collector_path/dns/dns_staging", “process_opt”:"-E separator=, -E header=y -E occurrence=f -T fields -e frame.time -e frame.time_epoch -e frame.len -e ip.src -e ip.dst -e dns.resp.name -e dns.resp.type -e dns.resp.class -e dns.flags.rcode -e dns.a ‘dns.flags.response == 1’" },上面Dshark命令就不详细介绍,可参考上篇文章: tshark使用示例(2)尝试Demo部署docker环境抽取docker镜像: docker pull apachespot/spot-demo启动镜像: docker run -it -p 8889:8889 apachespot/spot-demo在浏览器中打开 http://localhost:8889/files/ui/flow/suspicious.html#date=2016-07-08 参考 Apache Spot主站incubator-spot 系列文章: 网络分析利器wireshark命令版:tshark简介(1)网络分析利器wireshark命令版:tshark使用示例(2)网络分析利器wireshark命令版:Apache Spot中tshark模块(3)[网络分析利器wireshark命令版:tshark结合ES(4)] ...

April 17, 2019 · 1 min · jiezi

网络分析利器wireshark命令版:tshark使用示例(2)

tshark是wireshark网络分析工具下的一个分支,主要用于命令行环境进行抓包、分析,尤其对协议深层解析时,tcpdump难以胜任的场景中。本系列文章将整理介绍tshark相关内容。基本用法常用命令查看tshark版本tshark -v列出当前存在的网络接口tshark -D网卡描述依据OS有不同的编号方式,在不了解网络设备及编号情况下,一般先用“tshark -D”查看网络接口的编号以供-i参数使用。注: linux可以结合ifconfig命令查看tshark对指定网卡监听,抓包sudo tshark -i <interface>抓取网卡eth0的流量并写入capture123.pcaptshark -i eth0 -w capture123.pcap读取之前的文件capture123.pcaptshark -i eth0 -r capture123.pcap抓取网卡eth0的流量10分钟tshark -i eth0 -a duration:600注: 默认时间单位为秒抓取网卡eth0的10000个数据包tshark -c 10000 -i eth0抓取网卡eth0涉及192.168.1.1的流量报文tshark -i eth0 -f “host 192.168.1.1”注: 与wireshark、tcpdump一致,均使用BPF过滤表达式抓取网卡eth0指定协议的流量报文tshark -i eth0 -f “<协议名>”协议名可以为: tcp, udp, dns, icmp, http等案例实时打印当前mysql查询语句tshark -s 512 -i eth1 -n -f ’tcp dst port 3306’ -R ‘mysql.query’ -T fields -e mysql.query说明:-s 512 :只抓取前512个字节数据-i eth0 :监听eth0网卡-n :禁止域名解析-f ‘tcp dst port 3306’ :只捕捉协议为tcp,目的端口为3306的数据包-R ‘mysql.query’ :过滤出mysql.query查询语句的报文-T fields -e mysql.query :打印mysql查询语句实时打印当前http请求的url(包括域名)tshark -s 512 -i eth1 -n -f ’tcp dst port 8000’ -R ‘http.host and http.request.uri’ -T fields -e http.host -e http.request.uri -l | tr -d ’t’说明:-s 512 :只抓取前512个字节数据-i eth1 :监听eth1网卡-n :禁止网络对象名称解析-f ‘tcp dst port 8000’ :只捕捉协议为tcp,目的端口为8000的数据包-R ‘http.host and http.request.uri’ :过滤出http.host和http.request.uri-T fields -e http.host -e http.request.uri :打印http.host和http.request.uri-l :输出到标准输出读取之前抓包文件进行报文数据分析需要从抓包的文件evidence04.pcap中提取出报文相关数据信息,如时间、源IP、目的IP、协议名、源Port、標Port、包大小等信息,最后输出到csv文件。tshark -r evidence.pcap -T fields -e frame.time_relative -e ip.src -e ip.dst -e ip.proto -e tcp.srcport -e tcp.dstport -e frame.len -E header=n -E separator=, -E quote=n -E occurrence=f > output.csv说明:-r evidence.pcap 需要分析的报文记录文件(pcap格式)-T fields 输出格式,选fields按字段,也可以选json等其他格式,需结合-e 及 -E使用-e frame.time_relative 取出封包的相对时间-e ip.src 提取源IP-e ip.dst 提取目的IP-e ip.proto 提取协议名-e tcp.srcport 提取源Port-e tcp.dstport 提取目的Port-e frame.len 提取数据帧大小-E header=n 是否输出字段名称(cvs的第1行)-E separator=, 指定分割符,/t是tab,/s是一格空格-E quote=n 指定是否对字段用引号,d是双引号,s是单引号,n是不用-E occurrence=f 多值时是否保留,f是第一个值,l是最后一个值,a是所有值都列出,默认全部output.csv 输出文件路径及名称DNS报文过滤使用tshark过滤dns cap包中源ip、目的ip、request请求tshark -r test.cap -T fields -e frame.time -e ip.src -e ip.dst -e dns.qry.name -R ‘udp.dstport==53 || dns’说明:-r test.pcap 需要分析的报文记录文件(pcap格式)-T fields 输出格式,选fields按字段,也可以选json等其他格式,需结合-e 及 -E使用-e frame.time 提取数据帧时间-e ip.src 提取源IP-e ip.dst 提取目的IP-e dns.qry.name 提取dns查询的域名信息-R ‘udp.dstport==53 || dns’ 显示过滤,仅对udp目标端口为53或者dns协议的报文进行处理默认直接显示在终端上,不记录文件。常见问题tshark: Only read filters, not capture filters, can be specified when reading a capture file.tshark -r 20190409.pcap -f ‘udp’ -w udp-20190409.pcap读取文件时只能使用显示过滤,也就是只能使用-Y或-2 -R过滤tshark: -R without -2 is deprecated. For single-pass filtering use -Y.tshark -r 20190409.pcap -R ‘udp’ -w udp-20190409.pcap显示过滤-R参数需要和-2一起使用,或使用-Y参考:tshark很快,但要怎麼用?ethereal-filter使用tshark 和 shell脚本分析 DNS pcap包 系列文章: 网络分析利器wireshark命令版:tshark简介(1)网络分析利器wireshark命令版:tshark使用示例(2) ...

April 16, 2019 · 2 min · jiezi

网络分析利器wireshark命令版:tshark简介(1)

tshark是网络分析工具wireshark下的一个工具,主要用于命令行环境进行抓包、分析,尤其对协议深层解析时,tcpdump难以胜任的场景中。本系列文章将整理tshark相关:简介安装在linux下安装(debian或ubuntu)sudo apt-get install tshark安装完成后在抓包之前,可以先检查版本、查看帮助等了解tshark初步了解安装后检查按照安装wireshark的方式,安装完成后,启动“终端”(命令提示符):tshark -vtshark参数命令解析查看帮助如下:➜ ~ tshark -hTShark (Wireshark) 3.0.1 (v3.0.1-0-gea351cd8)Dump and analyze network traffic.See https://www.wireshark.org for more information.Usage: tshark [options] …主要参数说明接口报文捕捉 -i <interface> 接口名或网卡编号 (默认: 第一个非环回接口) -f <capture filter> 使用libpcap过滤表达式进行包过滤 -s <snaplen> 设置每个抓包的大小,默认为65535。 (相当于tcpdump的-s,tcpdump默认抓包的大小仅为68) -p 不使用混杂模式抓捕报文(即只抓取与本机有关的流量) -I 如果支持则启用镜像模式 -B <buffer size> 内核缓存大小 (默认2MB) -y <link type> 链路层类型 (默认为找到的第一个协议) –time-stamp-type <type> 接口时间戳类型 -D 列出所有接口并退出 -L 列出所有接口链路层类型并退出(供-y参数使用) –list-time-stamp-types 列出所有接口时间戳类型并退出(供–time-stamp参数使用)捕获终止条件 -c <packet count> 捕获到n个包时停止 (默认不限,持续捕获) -a <autostop cond.> … duration:NUM - 捕获进行NUM后停止 filesize:NUM - 输出文件大于NUM KB后停止 files:NUM - 输出超过NUM个文件后停止捕获输出 -b <ringbuffer opt.> … duration:NUM - 在NUM秒后写入下一个文件(文件名由-w参数决定) interval:NUM - create time intervals of NUM secs filesize:NUM - 在文件大于NUM KB后写入下一个文件 files:NUM - 循环缓存: 在NUM个文件后替换早前的读取文件-r <infile|-> 设置需要读取的文件名及路径(或’-‘表示标准输入,从终端输入)分析处理 -2 执行two-pass分析 -M <packet count> 执行会话自动重置 -R <read filter> 包读取过滤使用wireshark显示过滤表达式(配合-2参数) -Y <display filter> 包显示过滤使用wireshark显示过滤表达式 -n 不进行名称解析 (def: all enabled) -N <name resolve flags> 启用指定的地址名字解析: “mnNtdv” (“m”代表MAC层,“n”代表网络层,“t”代表传输层,“N”代表当前异步DNS查找。) -d <layer_type>==<selector>,<decode_as_protocol> … “解析为”,详见man帮助页面。例: tcp.port==8888,http (注意选择子和解包协议之间不能留空格) -H <hosts file> 读取主机列表文件,将被写入捕获的文件(Implies -W n) –enable-protocol <proto_name> 启用协议报文解析 –disable-protocol <proto_name> 不对指定协议报文解析 –enable-heuristic <short_name> 启用协议报文启发式解析 –disable-heuristic <short_name> 不对指定协议报文启发式解析输出 -w <outfile|-> 使用pcapng格式将报文写入"outfile"文件 (或’-‘表示标准输出,直接显示在终端) -C <config profile> 启动时使用指定的配置文件 -F <output file type> 设置输出文件格式类型, 默认为pcapng格式 “-F"留空则列出所有的文件类型 -V 输出中增加报文层次树(包详细信息) -O <protocols> 仅显示以下协议的详细信息,逗号分割 -P 每写入一个文件后进行包情况汇总 -S <separator> 数据包之间的行分割符 -x 输出中增加16进制和ascii字符信息(报文按字节显示) -T pdml|ps|psml|json|jsonraw|ek|tabs|text|fields|? 文本输出格式 (默认文本:text) -j <protocolfilter> 当-T ek|pdml|json 设置时协议层过滤 (例:“ip ip.flags text”, 过滤不展开的所有字节点,除非过滤中有指定的子节点) -J <protocolfilter> 当 -T ek|pdml|json 选项设置时进行顶层协议过滤, (例: “http tcp”, 过滤展开的所有字节点) -e <field> 当 -T fields 设置时打印字段 (如tcp.port,_ws.col.Info) 此选项可以多个用于打印多个字段 -E<fieldsoption>=<value> 当-Tfields选项启用时用于输出配置: bom=y|n 打印UTF-8 BOM header=y|n 选择首行是否输出字段名(类似表头) separator=/t|/s|<char> 选择字段采用tab、空格、指定可打印字符为分割符 occurrence=f|l|a 打印第一个、最后一个或全部出现的数值(默认全部) aggregator=,|/s|<char> 选择字段采用逗号、空格、指定可打印字符聚合字段 quote=d|s|n 选择对数值采用双引号、单引号、不用引号 -t a|ad|d|dd|e|r|u|ud|? 输出格式化的时间戳(默认r: rel. 优先) -u s|hms 输出格式化秒(默认s:秒) -l 每个包之后就刷新标准输出 -q 向终端输出少量信息 (e.g. 当使用统计) -Q 仅向stderr输出确切错误信息(比-q信息更少) -g 启用组用户读取输出文件 -W n 如果支持,保存额外信息到文件中 n = 写入网络地址解析信息 -X <key>:<value> 扩展选项,详见man页面 -U tap_name PDUs专家模式, 详见man帮助页面 -z <statistics> 大量统计,详见man帮助页面 –capture-comment <comment> 在最新创建的输出文件中增加捕获注释(仅支持pcapng格式) –export-objects <protocol>,<destdir> 保存指定导出协议对象到指定目录 –color 在输出的文本格式中支持类似Wireshark图形界面的色彩,终端需要支持24位彩色 同时支持pdml、psml的色彩属性(注:这两张属性非标准) –no-duplicate-keys 如果-T json设置, 合并重复键,将多个值归并在一个键下的数组中 –elastic-mapping-filter <protocols> 如果指定-G elastic-mapping,设置仅mapping文件中指定的协议杂项 -h 显示帮助 -v 显示版本 -o <name>:<value> … 覆盖配置项 -K <keytab> 使用keytab文件用于解密kerberos -G [report] 生成一份或多份报告,默认report=“fields” 使用”-G help"获取更多信息补充说明支持包输出格式可用作不同格式转化工具,推荐使用默认的pcapngtshark -Ftshark: option requires an argument – Ftshark: The available capture file types for the “-F” flag are:… pcap - Wireshark/tcpdump/… - pcap pcapng - Wireshark/… - pcapng…捕获过滤(Capture Filter)抓包前在网络接口上设置过滤的,使用BPF表达式(tcpdump、libpcap通用)。通常用于抓取指定的ip、协议,可定位到3层,可以通过简单字符进行。不建议作过多过滤(规则复杂可能影响抓包性能)读取(显示)过滤(Display Filter)用于抓包之后,能够对报文可识别的协议字段进行过滤,可对2~7层过滤,可使用逻辑表达式,多个条件结合使用。注意:建议在使用时,先在wireshare过滤栏调试,具有字段提示,表达式合规会显示绿色参考:tshark linux 命令tshark官方文档 ...

April 16, 2019 · 2 min · jiezi

网络分析利器:tshark

tshark是wireshark网络分析工具下的一个分支,主要用于命令行环境进行抓包、分析,尤其对协议深层解析时,tcpdump难以胜任的场景中。主要参数抓包接口类-i 设置抓包的网络接口,不设置则默认为第一个非自环接口-D 列出当前存在的网络接口-f 设定抓包过滤表达式-s 设置每个抓包的大小,默认为65535。(相当于tcpdump的-s,tcpdump默认抓包的大小仅为68)-p 设置网络接口以非混合模式工作,即只关心和本机有关的流量。-B 设置内核缓冲区大小,仅对windows有效。-y 设置抓包的数据链路层协议,不设置则默认为-L找到的第一个协议,局域网一般是EN10MB等。-L 列出本机支持的数据链路层协议,供-y参数使用。 抓包进度控制-c 抓取的packet数,在处理一定数量的packet后,停止抓取,程序退出。-a 设置tshark抓包停止向文件书写的条件,事实上是tshark在正常启动之后停止工作并返回的条件。条件写为test:value的形式,如“-a duration:5”表示tshark启动后在5秒内抓包然后停止;“-a filesize:10”表示tshark在输出文件达到10kB后停止;“-a files:n”表示tshark在写满n个文件后停止。文件控制-b 设置ring buffer文件参数。 ring buffer的文件名由-w参数决定。-b参数采用test:value的形式书写。“-b duration:5”表示每5秒写下一个ring buffer文件;“-b filesize:5”表示每达到5kB写下一个ring buffer文件;“-b files:7”表示ring buffer文件最多7个,周而复始地使用,如果这个参数不设定,tshark会将磁盘写满为止。-r 设置tshark分析的输入文件。tshark既可以抓取分析即时的网络流量,又可以分析dump在文件中的数据。-r不能是命名管道和标准输入。过滤处理-R 设置读取(显示)过滤表达式(read filter expression)。不符合此表达式的流量同样不会被写入文件。注意,读取(显示)过滤表达式的语法和底层相关的抓包过滤表达式语法不相同。类似于抓包过滤表达式,在命令行使用时最好将它们quote起来-n 禁止所有地址名字解析(默认为允许所有)-N 启用某一层的地址名字解析。“m”代表MAC层,“n”代表网络层,“t”代表传输层,“C”代表当前异步DNS查找。如果-n和-N参数同时存在,-n将被忽略。如果-n和-N参数都不写,则默认打开所有地址名字解析-d 将指定的数据按有关协议解包输出。如要将tcp 8888端口的流量按http解包,应该写为“-d tcp.port==8888,http”。注意选择子和解包协议之间不能留空格输出格式-w 设置raw数据的输出文件。这个参数不设置,tshark将会把解码结果输出到stdout。“-w-”表示把raw输出到stdout。如果要把解码结果输出到文件,使用重定向“>”而不要-w参数-F 设置输出raw数据的格式,默认为libpcap。“tshark -F”会列出所有支持的raw格式-V 设置将解码结果的细节输出,否则解码结果仅显示一个packet一行的summary-x 设置在解码输出结果中,每个packet后面以HEX dump的方式显示具体数据-T 设置解码结果输出的格式,包括text,ps,psml和pdml,默认为text-t 设置解码结果的时间格式。“ad”表示带日期的绝对时间,“a”表示不带日期的绝对时间,“r”表示从第一个包到现在的相对时间,“d”表示两个相邻包之间的增量时间(delta)-S 在向raw文件输出的同时,将解码结果打印到控制台-l 在处理每个包时即时刷新输出-X 扩展项-q 设置安静的stdout输出(例如做统计时)-z 设置统计参数其它-h 显示命令行帮助-v 显示tshark的版本信息-o 重载选项基本用法在linux下安装(debian或ubuntu)sudo apt-get install tshark安装完成后在抓包之前,可以先检查版本、查看帮助等了解tshark初步了解查看tshark版本tshark -v列出当前存在的网络接口tshark -D网卡描述依据OS有不同的编号方式,在不了解网络设备及编号情况下,一般先用“tshark -D”查看网络接口的编号以供-i参数使用。注: linux可以结合ifconfig命令查看tshark对指定网卡监听,抓包sudo tshark -i <interface>抓取网卡eth0的流量并写入capture123.pcaptshark -i eth0 -w capture123.pcap读取之前的文件capture123.pcaptshark -i eth0 -r capture123.pcap抓取网卡eth0的流量10分钟tshark -i eth0 -a duration:600注: 默认时间单位为秒抓取网卡eth0的10000个数据包tshark -c 10000 -i eth0抓取网卡eth0涉及192.168.1.1的流量报文tshark -i eth0 -f “host 192.168.1.1”注: 与wireshark、tcpdump一致,均使用BPF过滤表达式抓取网卡eth0指定协议的流量报文tshark -i eth0 -f “<协议名>”协议名可以为: tcp, udp, dns, icmp, http等案例实时打印当前mysql查询语句tshark -s 512 -i eth1 -n -f ’tcp dst port 3306’ -R ‘mysql.query’ -T fields -e mysql.query说明:-s 512 :只抓取前512个字节数据-i eth0 :监听eth0网卡-n :禁止域名解析-f ‘tcp dst port 3306’ :只捕捉协议为tcp,目的端口为3306的数据包-R ‘mysql.query’ :过滤出mysql.query查询语句的报文-T fields -e mysql.query :打印mysql查询语句实时打印当前http请求的url(包括域名)tshark -s 512 -i eth1 -n -f ’tcp dst port 8000’ -R ‘http.host and http.request.uri’ -T fields -e http.host -e http.request.uri -l | tr -d ’t’说明:-s 512 :只抓取前512个字节数据-i eth1 :监听eth1网卡-n :禁止网络对象名称解析-f ‘tcp dst port 8000’ :只捕捉协议为tcp,目的端口为8000的数据包-R ‘http.host and http.request.uri’ :过滤出http.host和http.request.uri-T fields -e http.host -e http.request.uri :打印http.host和http.request.uri-l :输出到标准输出读取之前抓包文件进行报文数据分析需要从抓包的文件evidence04.pcap中提取出报文相关数据信息,如时间、源IP、目的IP、协议名、源Port、標Port、包大小等信息,最后输出到csv文件。tshark -r evidence.pcap -T fields -e frame.time_relative -e ip.src -e ip.dst -e ip.proto -e tcp.srcport -e tcp.dstport -e frame.len -E header=n -E separator=, -E quote=n -E occurrence=f > output.csv说明:-r evidence.pcap 需要分析的报文记录文件(pcap格式)-T fields 输出格式,选fields按字段,也可以选json等其他格式,需结合-e 及 -E使用-e frame.time_relative 取出相對封包時間的欄位資料-e ip.src 提取源IP-e ip.dst 提取目的IP-e ip.proto 提取协议名-e tcp.srcport 提取源Port-e tcp.dstport 提取目的Port-e frame.len 提取包大小-E header=n 是否输出字段名称(cvs的第1行)-E separator=, 指定分割符,/t是tab,/s是一格空格-E quote=n 指定是否对字段用引号,d是双引号,s是单引号,n是不用-E occurrence=f 多值时是否保留,f是第一个值,l是最后一个值,a是所有值都列出,默认全部 output.csv 输出文件路径及名称参考:tshark linux 命令tshark官方文档tshark很快,但要怎麼用?ethereal-filter ...

April 13, 2019 · 2 min · jiezi

“三次握手,四次挥手”你真的懂吗?

记得刚毕业找工作面试的时候,经常会被问到:你知道“3次握手,4次挥手”吗?这时候我会“胸有成竹”地“背诵”前期准备好的“答案”,第一次怎么怎么,第二次……答完就没有下文了,面试官貌似也没有深入下去的意思,深入下去我也不懂,皆大欢喜!作为程序员,要有“刨根问底”的精神。知其然,更要知其所以然。这篇文章希望能抽丝剥茧,还原背后的原理。什么是“3次握手,4次挥手”TCP是一种面向连接的单播协议,在发送数据前,通信双方必须在彼此间建立一条连接。所谓的“连接”,其实是客户端和服务器的内存里保存的一份关于对方的信息,如ip地址、端口号等。TCP可以看成是一种字节流,它会处理IP层或以下的层的丢包、重复以及错误问题。在连接的建立过程中,双方需要交换一些连接的参数。这些参数可以放在TCP头部。TCP提供了一种可靠、面向连接、字节流、传输层的服务,采用三次握手建立一个连接。采用4次挥手来关闭一个连接。TCP服务模型在了解了建立连接、关闭连接的“三次握手和四次挥手”后,我们再来看下TCP相关的东西。一个TCP连接由一个4元组构成,分别是两个IP地址和两个端口号。一个TCP连接通常分为三个阶段:启动、数据传输、退出(关闭)。当TCP接收到另一端的数据时,它会发送一个确认,但这个确认不会立即发送,一般会延迟一会儿。ACK是累积的,一个确认字节号N的ACK表示所有直到N的字节(不包括N)已经成功被接收了。这样的好处是如果一个ACK丢失,很可能后续的ACK就足以确认前面的报文段了。一个完整的TCP连接是双向和对称的,数据可以在两个方向上平等地流动。给上层应用程序提供一种双工服务。一旦建立了一个连接,这个连接的一个方向上的每个TCP报文段都包含了相反方向上的报文段的一个ACK。序列号的作用是使得一个TCP接收端可丢弃重复的报文段,记录以杂乱次序到达的报文段。因为TCP使用IP来传输报文段,而IP不提供重复消除或者保证次序正确的功能。另一方面,TCP是一个字节流协议,绝不会以杂乱的次序给上层程序发送数据。因此TCP接收端会被迫先保持大序列号的数据不交给应用程序,直到缺失的小序列号的报文段被填满。TCP头部源端口和目的端口在TCP层确定双方进程,序列号表示的是报文段数据中的第一个字节号,ACK表示确认号,该确认号的发送方期待接收的下一个序列号,即最后被成功接收的数据字节序列号加1,这个字段只有在ACK位被启用的时候才有效。当新建一个连接时,从客户端发送到服务端的第一个报文段的SYN位被启用,这称为SYN报文段,这时序列号字段包含了在本次连接的这个方向上要使用的第一个序列号,即初始序列号ISN,之后发送的数据是ISN加1,因此SYN位字段会消耗一个序列号,这意味着使用重传进行可靠传输。而不消耗序列号的ACK则不是。头部长度(图中的数据偏移)以32位字为单位,也就是以4bytes为单位,它只有4位,最大为15,因此头部最大长度为60字节,而其最小为5,也就是头部最小为20字节(可变选项为空)。ACK —— 确认,使得确认号有效。RST —— 重置连接(经常看到的reset by peer)就是此字段搞的鬼。SYN —— 用于初如化一个连接的序列号。FIN —— 该报文段的发送方已经结束向对方发送数据。当一个连接被建立或被终止时,交换的报文段只包含TCP头部,而没有数据。状态转换三次握手和四次挥手的状态转换如下图。为什么要“三次握手,四次挥手”三次握手换个易于理解的视角来看为什么要3次握手。客户端和服务端通信前要进行连接,“3次握手”的作用就是双方都能明确自己和对方的收、发能力是正常的。第一次握手:客户端发送网络包,服务端收到了。这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。第二次握手:服务端发包,客户端收到了。这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。从客户端的视角来看,我接到了服务端发送过来的响应数据包,说明服务端接收到了我在第一次握手时发送的网络包,并且成功发送了响应数据包,这就说明,服务端的接收、发送能力正常。而另一方面,我收到了服务端的响应数据包,说明我第一次发送的网络包成功到达服务端,这样,我自己的发送和接收能力也是正常的。第三次握手:客户端发包,服务端收到了。这样服务端就能得出结论:客户端的接收、发送能力,服务端的发送、接收能力是正常的。第一、二次握手后,服务端并不知道客户端的接收能力以及自己的发送能力是否正常。而在第三次握手时,服务端收到了客户端对第二次握手作的回应。从服务端的角度,我在第二次握手时的响应数据发送出去了,客户端接收到了。所以,我的发送能力是正常的。而客户端的接收能力也是正常的。经历了上面的三次握手过程,客户端和服务端都确认了自己的接收、发送能力是正常的。之后就可以正常通信了。每次都是接收到数据包的一方可以得到一些结论,发送的一方其实没有任何头绪。我虽然有发包的动作,但是我怎么知道我有没有发出去,而对方有没有接收到呢?而从上面的过程可以看到,最少是需要三次握手过程的。两次达不到让双方都得出自己、对方的接收、发送能力都正常的结论。其实每次收到网络包的一方至少是可以得到:对方的发送、我方的接收是正常的。而每一步都是有关联的,下一次的“响应”是由于第一次的“请求”触发,因此每次握手其实是可以得到额外的结论的。比如第三次握手时,服务端收到数据包,表明看服务端只能得到客户端的发送能力、服务端的接收能力是正常的,但是结合第二次,说明服务端在第二次发送的响应包,客户端接收到了,并且作出了响应,从而得到额外的结论:客户端的接收、服务端的发送是正常的。用表格总结一下:视角客收客发服收服发客视角二一 + 二一 + 二二服视角二 + 三一一二 + 三四次挥手TCP连接是双向传输的对等的模式,就是说双方都可以同时向对方发送或接收数据。当有一方要关闭连接时,会发送指令告知对方,我要关闭连接了。这时对方会回一个ACK,此时一个方向的连接关闭。但是另一个方向仍然可以继续传输数据,等到发送完了所有的数据后,会发送一个FIN段来关闭此方向上的连接。接收方发送ACK确认关闭连接。注意,接收到FIN报文的一方只能回复一个ACK, 它是无法马上返回对方一个FIN报文段的,因为结束数据传输的“指令”是上层应用层给出的,我只是一个“搬运工”,我无法了解“上层的意志”。“三次握手,四次挥手”怎么完成?其实3次握手的目的并不只是让通信双方都了解到一个连接正在建立,还在于利用数据包的选项来传输特殊的信息,交换初始序列号ISN。3次握手是指发送了3个报文段,4次挥手是指发送了4个报文段。注意,SYN和FIN段都是会利用重传进行可靠传输的。三次握手客户端发送一个SYN段,并指明客户端的初始序列号,即ISN(c).服务端发送自己的SYN段作为应答,同样指明自己的ISN(s)。为了确认客户端的SYN,将ISN(c)+1作为ACK数值。这样,每发送一个SYN,序列号就会加1. 如果有丢失的情况,则会重传。为了确认服务器端的SYN,客户端将ISN(s)+1作为返回的ACK数值。四次挥手客户端发送一个FIN段,并包含一个希望接收者看到的自己当前的序列号K. 同时还包含一个ACK表示确认对方最近一次发过来的数据。服务端将K值加1作为ACK序号值,表明收到了上一个包。这时上层的应用程序会被告知另一端发起了关闭操作,通常这将引起应用程序发起自己的关闭操作。服务端发起自己的FIN段,ACK=K+1, Seq=L客户端确认。ACK=L+1为什么建立连接是三次握手,而关闭连接却是四次挥手呢?这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方是否现在关闭发送数据通道,需要上层应用来决定,因此,己方ACK和FIN一般都会分开发送。“三次握手,四次挥手”进阶ISN三次握手的一个重要功能是客户端和服务端交换ISN(Initial Sequence Number), 以便让对方知道接下来接收数据的时候如何按序列号组装数据。如果ISN是固定的,攻击者很容易猜出后续的确认号。ISN = M + F(localhost, localport, remotehost, remoteport)M是一个计时器,每隔4微秒加1。F是一个Hash算法,根据源IP、目的IP、源端口、目的端口生成一个随机数值。要保证hash算法不能被外部轻易推算得出。序列号回绕因为ISN是随机的,所以序列号容易就会超过2^31-1. 而tcp对于丢包和乱序等问题的判断都是依赖于序列号大小比较的。此时就出现了所谓的tcp序列号回绕(sequence wraparound)问题。怎么解决?/** The next routines deal with comparing 32 bit unsigned ints* and worry about wraparound (automatic with unsigned arithmetic).*/static inline int before(__u32 seq1, __u32 seq2){ return (__s32)(seq1-seq2) < 0;}#define after(seq2, seq1) before(seq1, seq2)上述代码是内核中的解决回绕问题代码。__s32是有符号整型的意思,而__u32则是无符号整型。序列号发生回绕后,序列号变小,相减之后,把结果变成有符号数了,因此结果成了负数。假设seq1=255, seq2=1(发生了回绕)。seq1 = 1111 1111 seq2 = 0000 0001我们希望比较结果是 seq1 - seq2= 1111 1111-0000 0001———– 1111 1110由于我们将结果转化成了有符号数,由于最高位是1,因此结果是一个负数,负数的绝对值为 0000 0001 + 1 = 0000 0010 = 2因此seq1 - seq2 < 0syn flood攻击最基本的DoS攻击就是利用合理的服务请求来占用过多的服务资源,从而使合法用户无法得到服务的响应。syn flood属于Dos攻击的一种。如果恶意的向某个服务器端口发送大量的SYN包,则可以使服务器打开大量的半开连接,分配TCB(Transmission Control Block), 从而消耗大量的服务器资源,同时也使得正常的连接请求无法被相应。当开放了一个TCP端口后,该端口就处于Listening状态,不停地监视发到该端口的Syn报文,一 旦接收到Client发来的Syn报文,就需要为该请求分配一个TCB,通常一个TCB至少需要280个字节,在某些操作系统中TCB甚至需要1300个字节,并返回一个SYN ACK命令,立即转为SYN-RECEIVED即半开连接状态。系统会为此耗尽资源。常见的防攻击方法有:无效连接的监视释放监视系统的半开连接和不活动连接,当达到一定阈值时拆除这些连接,从而释放系统资源。这种方法对于所有的连接一视同仁,而且由于SYN Flood造成的半开连接数量很大,正常连接请求也被淹没在其中被这种方式误释放掉,因此这种方法属于入门级的SYN Flood方法。延缓TCB分配方法消耗服务器资源主要是因为当SYN数据报文一到达,系统立即分配TCB,从而占用了资源。而SYN Flood由于很难建立起正常连接,因此,当正常连接建立起来后再分配TCB则可以有效地减轻服务器资源的消耗。常见的方法是使用Syn Cache和Syn Cookie技术。Syn Cache技术系统在收到一个SYN报文时,在一个专用HASH表中保存这种半连接信息,直到收到正确的回应ACK报文再分配TCB。这个开销远小于TCB的开销。当然还需要保存序列号。Syn Cookie技术Syn Cookie技术则完全不使用任何存储资源,这种方法比较巧妙,它使用一种特殊的算法生成Sequence Number,这种算法考虑到了对方的IP、端口、己方IP、端口的固定信息,以及对方无法知道而己方比较固定的一些信息,如MSS(Maximum Segment Size,最大报文段大小,指的是TCP报文的最大数据报长度,其中不包括TCP首部长度。)、时间等,在收到对方 的ACK报文后,重新计算一遍,看其是否与对方回应报文中的(Sequence Number-1)相同,从而决定是否分配TCB资源。使用SYN Proxy防火墙一种方式是防止墙dqywb连接的有效性后,防火墙才会向内部服务器发起SYN请求。防火墙代服务器发出的SYN ACK包使用的序列号为c, 而真正的服务器回应的序列号为c’, 这样,在每个数据报文经过防火墙的时候进行序列号的修改。另一种方式是防火墙确定了连接的安全后,会发出一个safe reset命令,client会进行重新连接,这时出现的syn报文会直接放行。这样不需要修改序列号了。但是,client需要发起两次握手过程,因此建立连接的时间将会延长。连接队列在外部请求到达时,被服务程序最终感知到前,连接可能处于SYN_RCVD状态或是ESTABLISHED状态,但还未被应用程序接受。对应地,服务器端也会维护两种队列,处于SYN_RCVD状态的半连接队列,而处于ESTABLISHED状态但仍未被应用程序accept的为全连接队列。如果这两个队列满了之后,就会出现各种丢包的情形。查看是否有连接溢出netstat -s | grep LISTEN半连接队列满了在三次握手协议中,服务器维护一个半连接队列,该队列为每个客户端的SYN包开设一个条目(服务端在接收到SYN包的时候,就已经创建了request_sock结构,存储在半连接队列中),该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于Syn_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。目前,Linux下默认会进行5次重发SYN-ACK包,重试的间隔时间从1s开始,下次的重试间隔时间是前一次的双倍,5次的重试时间间隔为1s, 2s, 4s, 8s, 16s, 总共31s, 称为指数退避,第5次发出后还要等32s才知道第5次也超时了,所以,总共需要 1s + 2s + 4s+ 8s+ 16s + 32s = 63s, TCP才会把断开这个连接。由于,SYN超时需要63秒,那么就给攻击者一个攻击服务器的机会,攻击者在短时间内发送大量的SYN包给Server(俗称SYN flood攻击),用于耗尽Server的SYN队列。对于应对SYN 过多的问题,linux提供了几个TCP参数:tcp_syncookies、tcp_synack_retries、tcp_max_syn_backlog、tcp_abort_on_overflow 来调整应对。参数作用tcp_syncookiesSYNcookie将连接信息编码在ISN(initialsequencenumber)中返回给客户端,这时server不需要将半连接保存在队列中,而是利用客户端随后发来的ACK带回的ISN还原连接信息,以完成连接的建立,避免了半连接队列被攻击SYN包填满。tcp_syncookies内核放弃建立连接之前发送SYN包的数量。tcp_synack_retries内核放弃连接之前发送SYN+ACK包的数量tcp_max_syn_backlog默认为1000. 这表示半连接队列的长度,如果超过则放弃当前连接。tcp_abort_on_overflow如果设置了此项,则直接reset. 否则,不做任何操作,这样当服务器半连接队列有空了之后,会重新接受连接。Linux坚持在能力许可范围内不忽略进入的连接。客户端在这期间会重复发送sys包,当重试次数到达上限之后,会得到connection time out响应。全连接队列满了当第三次握手时,当server接收到ACK包之后,会进入一个新的叫 accept 的队列。当accept队列满了之后,即使client继续向server发送ACK的包,也会不被响应,此时ListenOverflows+1,同时server通过tcp_abort_on_overflow来决定如何返回,0表示直接丢弃该ACK,1表示发送RST通知client;相应的,client则会分别返回read timeout 或者 connection reset by peer。另外,tcp_abort_on_overflow是0的话,server过一段时间再次发送syn+ack给client(也就是重新走握手的第二步),如果client超时等待比较短,就很容易异常了。而客户端收到多个 SYN ACK 包,则会认为之前的 ACK 丢包了。于是促使客户端再次发送 ACK ,在 accept队列有空闲的时候最终完成连接。若 accept队列始终满员,则最终客户端收到 RST 包(此时服务端发送syn+ack的次数超出了tcp_synack_retries)。服务端仅仅只是创建一个定时器,以固定间隔重传syn和ack到服务端参数作用tcp_abort_on_overflow如果设置了此项,则直接reset. 否则,不做任何操作,这样当服务器半连接队列有空了之后,会重新接受连接。Linux坚持在能力许可范围内不忽略进入的连接。客户端在这期间会重复发送sys包,当重试次数到达上限之后,会得到connection time out响应。min(backlog, somaxconn)全连接队列的长度。命令netstat -s命令[root@server ~]# netstat -s | egrep “listen|LISTEN” 667399 times the listen queue of a socket overflowed667399 SYNs to LISTEN sockets ignored上面看到的 667399 times ,表示全连接队列溢出的次数,隔几秒钟执行下,如果这个数字一直在增加的话肯定全连接队列偶尔满了。[root@server ~]# netstat -s | grep TCPBacklogDrop查看 Accept queue 是否有溢出ss命令[root@server ~]# ss -lntState Recv-Q Send-Q Local Address:Port Peer Address:PortLISTEN 0 128 *:6379 *:*LISTEN 0 128 *:22 :如果State是listen状态,Send-Q 表示第三列的listen端口上的全连接队列最大为50,第一列Recv-Q为全连接队列当前使用了多少。非 LISTEN 状态中 Recv-Q 表示 receive queue 中的 bytes 数量;Send-Q 表示 send queue 中的 bytes 数值。小结当外部连接请求到来时,TCP模块会首先查看max_syn_backlog,如果处于SYN_RCVD状态的连接数目超过这一阈值,进入的连接会被拒绝。根据tcp_abort_on_overflow字段来决定是直接丢弃,还是直接reset.从服务端来说,三次握手中,第一步server接受到client的syn后,把相关信息放到半连接队列中,同时回复syn+ack给client. 第三步当收到客户端的ack, 将连接加入到全连接队列。一般,全连接队列比较小,会先满,此时半连接队列还没满。如果这时收到syn报文,则会进入半连接队列,没有问题。但是如果收到了三次握手中的第3步(ACK),则会根据tcp_abort_on_overflow字段来决定是直接丢弃,还是直接reset.此时,客户端发送了ACK, 那么客户端认为三次握手完成,它认为服务端已经准备好了接收数据的准备。但此时服务端可能因为全连接队列满了而无法将连接放入,会重新发送第2步的syn+ack, 如果这时有数据到来,服务器TCP模块会将数据存入队列中。一段时间后,client端没收到回复,超时,连接异常,client会主动关闭连接。“三次握手,四次挥手”redis实例分析我在dev机器上部署redis服务,端口号为6379,通过tcpdump工具获取数据包,使用如下命令tcpdump -w /tmp/a.cap port 6379 -s0-w把数据写入文件,-s0设置每个数据包的大小默认为68字节,如果用-S 0则会抓到完整数据包在dev2机器上用redis-cli访问dev:6379, 发送一个ping, 得到回复pong停止抓包,用tcpdump读取捕获到的数据包tcpdump -r /tmp/a.cap -n -nn -A -x| vim -(-x 以16进制形式展示,便于后面分析)共收到了7个包。抓到的是IP数据包,IP数据包分为IP头部和IP数据部分,IP数据部分是TCP头部加TCP数据部分。IP的数据格式为:它由固定长度20B+可变长度构成。10:55:45.662077 IP dev2.39070 > dev.6379: Flags [S], seq 4133153791, win 29200, options [mss 1460,sackOK,TS val 2959270704 ecr 0,nop,wscale 7], length 0 0x0000: 4500 003c 08cf 4000 3606 14a5 0ab3 b561 0x0010: 0a60 5cd4 989e 18eb f65a ebff 0000 0000 0x0020: a002 7210 872f 0000 0204 05b4 0402 080a 0x0030: b062 e330 0000 0000 0103 0307对着IP头部格式,来拆解数据包的具体含义。字节值字节含义0x4IP版本为ipv40x5首部长度为5 * 4字节=20B0x00服务类型,现在基本都置为00x003c总长度为316+12=60字节,上面所有的长度就是60字节0x08cf标识。同一个数据报的唯一标识。当IP数据报被拆分时,会复制到每一个数据中。0x40003bit 标志 + 13bit 片偏移。3bit 标志对应 R、DF、MF。目前只有后两位有效,DF位:为1表示不分片,为0表示分片。MF:为1表示“更多的片”,为0表示这是最后一片。13bit 片位移:本分片在原先数据报文中相对首位的偏移位。(需要再乘以8 )0x36生存时间TTL。IP报文所允许通过的路由器的最大数量。每经过一个路由器,TTL减1,当为 0 时,路由器将该数据报丢弃。TTL 字段是由发送端初始设置一个 8 bit字段.推荐的初始值由分配数字 RFC 指定。发送 ICMP 回显应答时经常把 TTL 设为最大值 255。TTL可以防止数据报陷入路由循环。 此处为54.0x06协议类型。指出IP报文携带的数据使用的是哪种协议,以便目的主机的IP层能知道要将数据报上交到哪个进程。TCP 的协议号为6,UDP 的协议号为17。ICMP 的协议号为1,IGMP 的协议号为2。该 IP 报文携带的数据使用 TCP 协议,得到了验证。0x14a516bitIP首部校验和。0x0ab3 b56132bit源ip地址。0x0a60 5cd432bit目的ip地址。剩余的数据部分即为TCP协议相关的。TCP也是20B固定长度+可变长度部分。字节值字节含义0x989e16bit源端口。1161616+81616+1416+11=390700x18eb16bit目的端口63790xf65a ebff32bit序列号。41331537910x0000 000032bit确认号。0xa4bit首部长度,以4byte为单位。共104=40字节。因此TCP报文的可选长度为40-20=200b0000006bit保留位。目前置为0.0b0000106bitTCP标志位。从左到右依次是紧急 URG、确认 ACK、推送 PSH、复位 RST、同步 SYN 、终止 FIN。0x7210滑动窗口大小,滑动窗口即tcp接收缓冲区的大小,用于tcp拥塞控制。292000x872f16bit校验和。0x0000紧急指针。仅在 URG = 1时才有意义,它指出本报文段中的紧急数据的字节数。当 URG = 1 时,发送方 TCP 就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍是普通数据。可变长度部分,协议如下:字节值字节含义0x0204 05b4最大报文长度为,05b4=1460. 即可接收的最大包长度,通常为MTU减40字节,IP头和TCP头各20字节0x0402表示支持SACK0x080a b062 e330 0000 0000时间戳。Ts val=b062 e330=2959270704, ecr=00x01无操作0x03 0307窗口扩大因子为7. 移位7, 乘以128这样第一个包分析完了。dev2向dev发送SYN请求。也就是三次握手中的第一次了。SYN seq(c)=4133153791第二个包,dev响应连接,ack=4133153792. 表明dev下次准备接收这个序号的包,用于tcp字节注的顺序控制。dev(也就是server端)的初始序号为seq=4264776963, syn=1.SYN ack=seq(c)+1 seq(s)=4264776963第三个包,client包确认,这里使用了相对值应答。seq=4133153792, 等于第二个包的ack. ack=4264776964.ack=seq(s)+1, seq=seq(c)+1至此,三次握手完成。接下来就是发送ping和pong的数据了。接着第四个包。10:55:48.090073 IP dev2.39070 > dev.6379: Flags [P.], seq 1:15, ack 1, win 229, options [nop,nop,TS val 2959273132 ecr 3132256230], length 14 0x0000: 4500 0042 08d1 4000 3606 149d 0ab3 b561 0x0010: 0a60 5cd4 989e 18eb f65a ec00 fe33 5504 0x0020: 8018 00e5 4b5f 0000 0101 080a b062 ecac 0x0030: bab2 6fe6 2a31 0d0a 2434 0d0a 7069 6e67 0x0040: 0d0atcp首部长度为32B, 可选长度为12B. IP报文的总长度为66B, 首部长度为20B, 因此TCP数据部分长度为14B. seq=0xf65a ec00=4133153792ACK, PSH. 数据部分为2a31 0d0a 2434 0d0a 7069 6e67 0d0a0x2a31 -> *10x0d0a -> \r\n0x2434 -> $40x0d0a -> \r\n0x7069 0x6e67 -> ping0x0d0a -> \r\ndev2向dev发送了ping数据,第四个包完毕。第五个包,dev2向dev发送ack响应。序列号为0xfe33 5504=4264776964, ack确认号为0xf65a ec0e=4133153806=(4133153792+14). 第六个包,dev向dev2响应pong消息。序列号fe33 5504,确认号f65a ec0e, TCP头部可选长度为12B, IP数据报总长度为59B, 首部长度为20B, 因此TCP数据长度为7B.数据部分2b50 4f4e 470d 0a, 翻译过来就是+PONG\r\n.至此,Redis客户端和Server端的三次握手过程分析完毕。总结“三次握手,四次挥手”看似简单,但是深究进去,还是可以延伸出很多知识点的。比如半连接队列、全连接队列等等。以前关于TCP建立连接、关闭连接的过程很容易就会忘记,可能是因为只是死记硬背了几个过程,没有深入研究背后的原理。所以,“三次握手,四次挥手”你真的懂了吗?欢迎一起交流~~参考资料【redis】https://segmentfault.com/a/11…【tcp option】https://blog.csdn.net/wdscq12…【滑动窗口】https://www.zhihu.com/questio…【全连接队列】http://jm.taobao.org/2017/05/…【client fooling】 https://github.com/torvalds/l…【backlog RECV_Q】http://blog.51cto.com/5909093…【定时器】https://www.cnblogs.com/mengh…【队列图示】https://www.itcodemonkey.com/…【tcp flood攻击】https://www.cnblogs.com/hubav…【MSS MTU】https://blog.csdn.net/LoseInV… ...

February 15, 2019 · 3 min · jiezi