HOME 首页
SERVICE 服务产品
XINMEITI 新媒体代运营
CASE 服务案例
NEWS 热点资讯
ABOUT 关于我们
CONTACT 联系我们
创意岭
让品牌有温度、有情感
专注品牌策划15年

    tcp协议怎么抓包

    发布时间:2023-03-19 01:41:14     稿源: 创意岭    阅读: 63        问大家

    大家好!今天让创意岭的小编来大家介绍下关于tcp协议怎么抓包的问题,以下是小编对此问题的归纳整理,让我们一起来看看吧。

    开始之前先推荐一个非常厉害的Ai人工智能工具,一键生成原创文章、方案、文案、工作计划、工作报告、论文、代码、作文、做题和对话答疑等等

    只需要输入关键词,就能返回你想要的内容,越精准,写出的就越详细,有微信小程序端、在线网页版、PC客户端

    官网:https://ai.de1919.com

    本文目录:

    tcp协议怎么抓包

    一、本地进程间通过tcp通信,Wireshark 可以抓包么?

    其实可以的,在WindowsXp下我尝试过,设置本地IP的静态路由至网关,可以使用Wireshark抓包。

    这样设置你访问本地地址,报文就要到网关那里走一个回路。

    二、tcpdump抓包工具

    tcpdump和ethereal可以用来获取和分析网络通讯活动,他们都是使用libpcap库来捕获网络封包的。

    在混杂模式下他们可以监控网络适配器的所有通讯活动并捕获网卡所接收的所有帧。

    要想设置网络接口为混杂模式并执行这些命令来捕获所有的网络封包,需要具有超级用户的权限。

    你可以使用这些工具来探究网络相关问题。你可以发现TCP/IP重发、窗口大小的缩放、名字解析的问题、网络配置错误等。

    注意这些工具只能监控网络适配器所接收到的帧,并不能监控到整个网络的通讯情况。

    三、详解 TCP(上)

    让我们来看看这张图

    首先来了解每个部分的意义

    其他部分解释在这里:

    为什么建链接要 3 次握手,断链接需要 4 次挥手?

    另有一些需要注意的地方:

    Again,使用tcp_tw_reuse和tcp_tw_recycle来解决TIME_WAIT的问题是非常非常危险的,因为这两个参数违反了TCP协议(RFC 1122)

    SeqNum 的增加是和传输的字节数相关的 。上图中,三次握手后,来了两个 Len:1440 的包,而第二个包的 SeqNum 就成了 1441。然后第一个 ACK 回的是 1441,表示第一个 1440 收到了。

    注意 :如果你用 Wireshark 抓包程序看 3 次握手,你会发现 SeqNum 总是为 0,不是这样的,Wireshark 为了显示更友好,使用了 Relative SeqNum ——相对序号,你只要在右键菜单中的 protocol preference 中取消掉就可以看到“Absolute SeqNum”了

    TCP 要保证所有的数据包都可以到达,所以,必需要有重传机制。

    比如:发送端发了 1,2,3,4,5 五个包,接收端收到了 1,2 于是返回 ack 3,然后收到了 4(3 没收到)。此时的 TCP 会怎么办?因为正如前面所说的, SeqNum 和 Ack 是以字节数为单位,所以 ack 的时候,不能跳着确认,只能确认最大的连续收到的包 ,不然,发送端就以为之前的都收到了。

    有这样一个简单的办法:不回 ack,死等 3。当发送方发现收不到 3 的 ack 超时后,会重传 3。一旦接收方收到 3 后,会 ack 回 4——意味着 3 和 4 都收到了。

    但是这样有个非常大的 BUG,不回 ACK 那收到的 4,5 也不告诉发送方,这样发送方很有可能会认为 4,5 也没有到。导致 4,5 的重传

    于是,TCP引入了一种叫 Fast Retransmit 的算法, 不以时间驱动,而以数据驱动重传 。也就是说,如果,包没有连续到达,就 ack 最后那个可能被丢了的包,如果发送方连续收到 3 次相同的ack,就重传。Fast Retransmit 的好处是不用等 timeout 了再重传。

    比如说:

    我收到了 3 没收到 2,返回 ack2

    我又收到了 4 但还是没收到 2,返回 ack2

    但是 TMD 我又收到了 5 就是没收到 2,还是返回 ack2

    这个时候,不用等 timeout 的发送方就知道了 2 怕是掉了。于是会重新发 2。然后我接收到了我就返回 ack6

    **快速重传只解决了一个问题:不再需要等 timeout 就可以重新传包了。那重传多少呢?我知道 4 丢了,那要不要重传 5,6,7 呢? **

    所以就有了另一个更好的办法: Selective Acknowledgment (SACK) 。这种方式需要在 TCP 头里加一个 SACK 的东西,ACK 还是 Fast Retransmit 的 ACK,SACK 则是汇报收到的数据碎版。参看下图:

    这样,在发送端就可以根据回传的 SACK 知道哪些数据到了,哪些数据没有到。于是就优化了 Fast Retransmit 的算法。当然,这个协议需要两边都支持。在 Linux下,可以通过 tcp_sack 参数打开这个功能(Linux 2.4后默认打开)。

    这里还需要注意一个问题—— 接收方 Reneging,所谓 Reneging 的意思就是接收方有权把已经报给发送端 SACK 里的数据给丢了 。这样干是不被鼓励的,因为这个事会把问题复杂化了,但是,接收方这么做可能会有些极端情况,比如要把内存给别的更重要的东西。 所以,发送方也不能完全依赖 SACK,还是要依赖 ACK,并维护 Time-Out,如果后续的 ACK 没有增长,那么还是要把 SACK 的东西重传,另外,接收端这边永远不能把 SACK 的包标记为 Ack。

    注意:SACK 会消费发送方的资源,试想,如果一个攻击者给数据发送方发一堆 SACK 的选项, 这会导致发送方开始要重传甚至遍历已经发出的数据,这会消耗很多发送端的资源。 详细的东西请参看《 TCP SACK的性能权衡 》

    Duplicate SACK 又称 D-SACK, 其主要使用了 SACK 来告诉发送方有哪些数据被重复接收了

    D-SACK 使用了 SACK 的第一个段来做标志

    下面的示例中,丢了两个 ACK,所以,发送端重传了第一个数据包(3000-3499),于是接收端发现重复收到,于是回了一个SACK=3000-3500,因为 ACK 都到了 4000 意味着收到了 4000 之前的所有数据,所以这个 SACK 就是 D-SACK——旨在告诉发送端我收到了重复的数据,而且我们的发送端还知道,数据包没有丢,丢的是 ACK 包。

    下面的示例中,网络包(1000-1499)被网络给延误了,导致发送方没有收到 ACK,而后面到达的三个包触发了“Fast Retransmit算法”,所以重传,但重传时,被延误的包又到了,所以,回了一个SACK=1000-1500,因为 ACK 已到了3000,所以,这个 SACK 是D-SACK——标识收到了重复的包。

    这个案例下,发送端知道之前因为“Fast Retransmit算法”触发的重传不是因为发出去的包丢了,也不是因为回应的 ACK 包丢了,而是因为网络延时了。

    可见,引入了D-SACK,有这么几个好处:

    知道这些东西可以很好得帮助TCP了解网络情况,从而可以更好的做网络上的流控。Linux 下的 tcp_dsack 参数用于开启这个功能(Linux 2.4后默认打开)

    陈皓大神讲的真的非常非常好,我仔仔细细把这篇文章过了一遍。

    四、求大神解答 TCP过程分析 Wireshark 抓包分析

    (1)TCPClient向TCPServer发送连接请求SYN

    (2)TCPServer收到连接请求后反馈SYN+ACK

    (3)TCPClient收到SYN+ACK后反馈ACK,三次握手完成,连接建立

    (4)TCPClient向TCPServer发送100字节的数据

    (5)TCPServer收到(4)后确认并发送78字节的数据,即捎带确认

    (6)TCPClient收到(5)后,发送ACK进行确认

    (7)TCPClient发送100字节的数据

    (8)TCPClient发送RST报文,终止连接

    以上就是关于tcp协议怎么抓包相关问题的回答。希望能帮到你,如有更多相关问题,您也可以联系我们的客服进行咨询,客服也会为您讲解更多精彩的知识和内容。


    推荐阅读:

    itchat怎么一直登录(无法用itchat登录网页微信)

    简述TCPIP协议(简述tcpip协议的特点)

    ns怎么用paypal付款(switch怎么用paypal付款)

    小学学校外墙标语大全

    山东景观设计大赛获奖名单(山东景观设计大赛获奖名单公示)