三次握手Three-way Handshake
一个虚拟连接的建立是通过三次握手来实现的
1. (B) --> [SYN] --> (A)
假如服务器A和客户机B通讯. 当A要和B通信时,B首先向A发一个SYN (Synchronize) 标记的包,告诉A请求建立连接.
注意: 一个 SYN包就是仅SYN标记设为1的TCP包(参见TCP包头Resources). 认识到这点很重要,只有当A受到B发来的SYN包,才可建立连接,除此之外别无他法。因此,如果你的防火墙丢弃所有的发往外网接口的SYN包,那么你将不能让外部任何主机主动建立连接。
2. (B) <-- [SYN/ACK] <--(A)
接着,A收到后会发一个对SYN包的确认包(SYN/ACK)回去,表示对第一个SYN包的确认,并继续握手操作.
注意: SYN/ACK包是仅SYN 和 ACK 标记为1的包.
3. (B) --> [ACK] --> (A)
B收到SYN/ACK 包,B发一个确认包(ACK),通知A连接已建立。至此,三次握手完成,一个TCP连接完成
Note: ACK包就是仅ACK 标记设为1的TCP包. 需要注意的是当三此握手完成、连接建立以后,TCP连接的每个包都会设置ACK位
这就是为何连接跟踪很重要的原因了. 没有连接跟踪,防火墙将无法判断收到的ACK包是否属于一个已经建立的连接.一般的包过滤(Ipchains)收到ACK包时,会让它通过(这绝对不是个好主意). 而当状态型防火墙收到此种包时,它会先在连接表中查找是否属于哪个已建连接,否则丢弃该包
四次握手Four-way Handshake
四次握手用来关闭已建立的TCP连接
1. (B) --> ACK/FIN --> (A)
2. (B) <-- ACK <-- (A)
3. (B) <-- ACK/FIN <-- (A)
4. (B) --> ACK --> (A)
注意: 由于TCP连接是双向连接, 因此关闭连接需要在两个方向上做。ACK/FIN 包(ACK 和FIN 标记设为1)通常被认为是FIN(终结)包.然而, 由于连接还没有关闭, FIN包总是打上ACK标记. 没有ACK标记而仅有FIN标记的包不是合法的包,并且通常被认为是恶意的
连接复位Resetting a connection
四次握手不是关闭TCP连接的唯一方法. 有时,如果主机需要尽快关闭连接(或连接超时,端口或主机不可达),RST (Reset)包将被发送. 注意在,由于RST包不是TCP连接中的必须部分, 可以只发送RST包(即不带ACK标记). 但在正常的TCP连接中RST包可以带ACK确认标记
请注意RST包是可以不要收到方确认的?
无效的TCP标记Invalid TCP Flags
到目前为止,你已经看到了 SYN, ACK, FIN, 和RST 标记. 另外,还有PSH (Push) 和URG (Urgent)标记.
最常见的非法组合是SYN/FIN 包. 注意:由于 SYN包是用来初始化连接的, 它不可能和 FIN和RST标记一起出现. 这也是一个恶意攻击.
由于现在大多数防火墙已知 SYN/FIN 包, 别的一些组合,例如SYN/FIN/PSH, SYN/FIN/RST, SYN/FIN/RST/PSH。很明显,当网络中出现这种包时,很你的网络肯定受到攻击了。
别的已知的非法包有FIN (无ACK标记)和"NULL"包。如同早先讨论的,由于ACK/FIN包的出现是为了关闭一个TCP连接,那么正常的FIN包总是带有 ACK 标记。"NULL"包就是没有任何TCP标记的包(URG,ACK,PSH,RST,SYN,FIN都为0)。
到目前为止,正常的网络活动下,TCP协议栈不可能产生带有上面提到的任何一种标记组合的TCP包。当你发现这些不正常的包时,肯定有人对你的网络不怀好意。
UDP (用户数据包协议User Datagram Protocol)
TCP是面向连接的,而UDP是非连接的协议。UDP没有对接受进行确认的标记和确认机制。对丢包的处理是在应用层来完成的。(or accidental arrival).
此处需要重点注意的事情是:在正常情况下,当UDP包到达一个关闭的端口时,会返回一个UDP复位包。由于UDP是非面向连接的, 因此没有任何确认信息来确认包是否正确到达目的地。因此如果你的防火墙丢弃UDP包,它会开放所有的UDP端口(?)。
由于Internet上正常情况下一些包将被丢弃,甚至某些发往已关闭端口(非防火墙的)的UDP包将不会到达目的,它们将返回一个复位UDP包。
因为这个原因,UDP端口扫描总是不精确、不可靠的。
看起来大UDP包的碎片是常见的DOS (Denial of Service)攻击的常见形式 (这里有个DOS攻击的例子,http://grc.com/dos/grcdos.htm ).
ICMP (网间控制消息协议Internet Control Message Protocol)
如同名字一样, ICMP用来在主机/路由器之间传递控制信息的协议。 ICMP包可以包含诊断信息(ping, traceroute - 注意目前unix系统中的traceroute用UDP包而不是ICMP),错误信息(网络/主机/端口 不可达 network/host/port unreachable), 信息(时间戳timestamp, 地址掩码address mask request, etc.),或控制信息 (source quench, redirect, etc.) 。
你可以在http://www.iana.org/assignments/icmp-parameters中找到ICMP包的类型。
尽管ICMP通常是无害的,还是有些类型的ICMP信息需要丢弃。
Redirect (5), Alternate Host Address (6), Router Advertisement (9) 能用来转发通讯。
Echo (8), Timestamp (13) and Address Mask Request (17) 能用来分别判断主机是否起来,本地时间和地址掩码。注意它们是和返回的信息类别有关的。它们自己本身是不能被利用的,但它们泄露出的信息对攻击者是有用的。
ICMP消息有时也被用来作为DOS攻击的一部分(例如:洪水ping flood ping,死 ping ?呵呵,有趣 ping of death)?/p>
包碎片注意A Note About Packet Fragmentation
如果一个包的大小超过了TCP的最大段长度MSS (Maximum Segment Size) 或MTU (Maximum Transmission Unit),能够把此包发往目的的唯一方法是把此包分片。由于包分片是正常的,它可以被利用来做恶意的攻击。
因为分片的包的第一个分片包含一个包头,若没有包分片的重组功能,包过滤器不可能检测附加的包分片。典型的攻击Typical attacks involve in overlapping the packet data in which packet header is 典型的攻击Typical attacks involve in overlapping the packet data in which packet header isnormal until is it overwritten with different destination IP (or port) thereby bypassing firewall rules。包分片能作为 DOS 攻击的一部分,它可以crash older IP stacks 或涨死CPU连接能力。
Netfilter/Iptables中的连接跟踪代码能自动做分片重组。它仍有弱点,可能受到饱和连接攻击,可以把CPU资源耗光。
握手阶段:
序号 方向 seq ack
1 A->B 10000 0
2 B->A 20000 10000+1=10001
3 A->B 10001 20000+1=20001
解释:
1:A向B发起连接请求,以一个随机数初始化A的seq,这里假设为10000,此时ACK=0
2:B收到A的连接请求后,也以一个随机数初始化B的seq,这里假设为20000,意思是:你的请求我已收到,我这方的数据流就从这个数开始。B的ACK是A的seq加1,即10000+1=10001
3:A收到B的回复后,它的seq是它的上个请求的seq加1,即10000+1=10001,意思也是:你的回复我收到了,我这方的数据流就从这个数开始。A此时的ACK是B的seq加1,即20000+1=20001
数据传输阶段:
序号 方向 seq ack size
23 A->B 40000 70000 1514
24 B->A 70000 40000+1514-54=41460 54
25 A->B 41460 70000+54-54=70000 1514
26 B->A 70000 41460+1514-54=42920 54
解释:
23:B接收到A发来的seq=40000,ack=70000,size=1514的数据包
24:于是B向A也发一个数据包,告诉B,你的上个包我收到了。B的seq就以它收到的数据包的ACK填充,ACK是它收到的数据包的SEQ加上数据包的大小(不包括以太网协议头,IP头,TCP头),以证实B发过来的数据全收到了。
25:A在收到B发过来的ack为41460的数据包时,一看到41460,正好是它的上个数据包的seq加上包的大小,就明白,上次发送的数据包已安全到达。于是它再发一个数据包给B。这个正在发送的数据包的seq也以它收到的数据包的ACK填充,ACK就以它收到的数据包的seq(70000)加上包的size(54)填充,即ack=70000+54-54(全是头长,没数据项)。
其实在握手和结束时确认号应该是对方序列号加1,传输数据时则是对方序列号加上对方携带应用层数据的长度.如果从以太网包返回来计算所加的长度,就嫌走弯路了.
另外,如果对方没有数据过来,则自己的确认号不变,序列号为上次的序列号加上本次应用层数据发送长度.
分享到:
相关推荐
同时,要理解Modbus协议的报文格式,正确编写或解析通信报文,避免出现通信异常。 通过以上内容,我们可以了解到Modbus TCP协议的基本概念、结构、应用以及使用Java工具进行测试和调试的方法。这些知识对于理解和...
Modbus-TCP协议将消息结构映射到TCP/IP协议栈中,具体来说,应用层的Modbus协议与TCP层交互,TCP层负责数据的可靠传输,而IP层处理网络层的数据包路由。此外,Modbus-TCP也适应了以太网的物理层标准,如Ethernet II...
使用Winpcap捕获并解析TCP报文 需要配置Winpcap的库和头文件
标题中的"PPP IP TCP实例解析"涉及到网络通信中三个关键协议:PPP(Point-to-Point Protocol)、IP(Internet Protocol)和TCP(Transmission Control Protocol)。这些协议在计算机网络中扮演着不同的角色,共同...
TCP和UDP的解析涉及到网络编程的基本概念,包括端口号、套接字编程、网络字节序转换以及错误处理。在C#中,开发者需要理解Socket类的使用,包括bind、listen、accept、connect、send和recv等方法,以及异步编程模型...
本项目专注于实现一个TCP客户端,它能向服务器发送数据,以及一个服务器端,它负责接收客户端的数据并进行解析,可能还会涉及到其他业务操作,如将接收到的信息发送到Kafka消息队列或存储到数据库中,以及实现服务器...
### VPP TCP层代码解析 #### 1. VPP TCP三次握手建连流程 ##### 服务端流程解析 **vppcom_app_create**: 在VPP中创建应用程序的线程处理函数。此函数会执行一系列初始化步骤,包括注册工作线程、创建epoll机制,...
本文将详细解析FINS UDP和FINS TCP两种通信协议,并进行通讯测试的说明。 1. **FINS UDP**: FINS UDP基于用户数据报协议(UDP/IP),这是一种无连接的通信方式,速度快但数据可靠性较低。在FINS UDP通信中,你...
在这个监听器内部,我们可以使用提供的API来解析数据包,获取源IP、目的IP、TCP标志字段(SYN、ACK、FIN等)、序列号、确认号等信息。 3. **IP详细信息**: 一旦我们有了IP地址,可以通过DNS查询将其转换为域名,...
TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,与UDP(User Datagram Protocol)相比,TCP提供了更多的可靠性和服务质量。TCP通过多种机制确保数据的正确传输,如...
### Modbus_TCP 数据解析 #### 一、Modbus_TCP 协议概述 Modbus_TCP 是一种基于TCP/IP网络协议的应用层协议,它扩展了原始的Modbus协议,并使其能够在现代工业自动化环境中通过以太网进行通信。Modbus_TCP提供了一...
c++实现对cap抓TCP、UDP包文件的解析,可以用windump抓包后直接解析。通过循环解析出cap文件中每个包的IP头的各部分含义、TCP/UDP头的含义。这些部分都储存在结构体中,如果需要统计,读者可自行编写统计规则。由于...
我们在和硬件做对接时一般是给设备发送命令,然后设备返回结果。如果在发送时我就想知道设备有没有成功执行那该怎么办呢? 我网上查过很多资料,没找到满意的结果,最终自己无意尝试实现了这个功能。...
【TCP数据包解析】 在计算机网络中,TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP确保数据在发送方与接收方之间完整无误地传输,通过序列号、确认应答、重传...
本资料大全深入解析了Linux下TCP/IP协议栈的源码,为理解其工作原理提供了宝贵的资源。 首先,我们关注《TCPip在linux下的具体实现.doc》文档,它可能详细介绍了Linux系统如何实现TCP/IP协议的具体步骤和机制。这...
4. **源码解析**:Java源码提供了实现TCP转发的具体逻辑。通常,这包括使用Java的`ServerSocket`类创建服务器端监听,使用`Socket`类建立客户端和服务器之间的连接,以及使用输入/输出流进行数据读写。理解源码可以...
lwip协议栈tcp部分的解析,非常详细
Modbus TCP通信与数据解析是工业自动化领域中的一个重要知识点,它是基于标准的Modbus协议,通过TCP/IP网络层进行通信的方式。Modbus TCP允许设备,如仪器仪表和PLC(可编程逻辑控制器),在局域网或互联网上进行...
在本示例中,服务端利用Vert.x的TCP服务器功能,接收并解析JMeter发送的protobuf消息,然后返回响应。 4. **创建TCP连接** 在JMeter中,需要设置TCP Sampler来连接到服务端。你需要填写服务器的IP地址和端口号,...