`

TCP建立和关闭连接

 
阅读更多

一、建立连接

clip_image002

1) 请求端(通常称为客户)发送一个 S Y N段指明客户打算连接的服务器的端口,以及初

始序号(I S N,在这个例子中为1 4 1 5 5 3 1 5 2 1) 。这个S Y N段为报文段1。

2) 服务器发回包含服务器的初始序号的S Y N报文段(报文段2)作为应答。同时,将确认

序号设置为客户的I S N加1以对客户的S Y N报文段进行确认。一个S Y N将占用一个序号。

3) 客户必须将确认序号设置为服务器的 I S N加1以对服务器的S Y N报文段进行确认(报文段3) 。

这三个报文段完成连接的建立。这个过程也称为三次握手( three-way handshake) 。

三次握手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) 接着,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包时,会让它通过(这绝对不是个 好主意). 而当状态型防火墙收到此种包时,它会先在连接表中查找是否属于哪个已建连接,否则丢弃该包

二、关闭连接

clip_image004

clip_image006

TCP协议的连接是全双工连接,一个TCP连接存在双向的读写通道。
简单说来是 “先关读,后关写”,一共需要四个阶段。以客户机发起关闭连接为例:
1.服务器读通道关闭
2.客户机写通道关闭
3.客户机读通道关闭
4.服务器写通道关闭
关闭行为是在发起方数据发送完毕之后,给对方发出一个FIN(finish)数据段。直到接收到对方发送的FIN,且对方收到了接收确认ACK之后,双方的数据通信完全结束,过程中每次接收都需要返回确认数据段ACK。
详细过程:
第一阶段 客户机发送完数据之后,向服务器发送一个FIN数据段,序列号为i;
1.服务器收到FIN(i)后,返回确认段ACK,序列号为i+1,关闭服务器读通道;
2.客户机收到ACK(i+1)后,关闭客户机写通道;
(此时,客户机仍能通过读通道读取服务器的数据,服务器仍能通过写通道写数据)
第二阶段 服务器发送完数据之后,向客户机发送一个FIN数据段,序列号为j;
3.客户机收到FIN(j)后,返回确认段ACK,序列号为j+1,关闭客户机读通道;
4.服务器收到ACK(j+1)后,关闭服务器写通道。
这是标准的TCP关闭两个阶段,服务器和客户机都可以发起关闭,完全对称。
FIN标识是通过发送最后一块数据时设置的,标准的例子中,服务器还在发送数据,所以要等到发送完的时候,设置FIN(此时可称为TCP连接处于半关闭状态,因为数据仍可从被动关闭一方向主动关闭方传送)。如果在服务器收到FIN(i)时,已经没有数据需要发送,可以在返回ACK(i+1)的时候就设置FIN(j)标识,这样就相当于可以合并第二步和第三步。

四次握手Four-way Handshake
四次握手用来关闭已建立的TCP连接
1. (B) --> ACK/FIN --> (A)
2. (B) 3. (B) 4. (B) --> ACK --> (A)
注意: 由于TCP连接是双向连接, 因此关闭连接需要在两个方向上做。ACK/FIN 包(ACK 和FIN 标记设为1)通常被认为是FIN(终结)包.然而, 由于连接还没有关闭, FIN包总是打上ACK标记. 没有ACK标记而仅有FIN标记的包不是合法的包,并且通常被认为是恶意的

三、FINRST比较

连接复位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资源耗光。

本文摘自:

《TCP连接的状态转换图深度剖析》

http://www.diybl.com/course/6_system/linux/Linuxjs/2007104/76065.html

参考:

《TCP/IP详解-卷1》第18章《TCP连接的建立与终止》

http://course.ccniit.com/CSTD/Linux/reference/files/018.PDF

分享到:
评论

相关推荐

    w5500TCP server解决有时连接断开问题

    标题提到的"w5500TCP server解决有时连接断开问题",主要涉及的是在TCP通信中如何处理连接稳定性和保持长连接的问题。TCP协议虽然提供了可靠的传输,但在某些情况下,如网络波动、路由器重置或设备休眠,可能会导致...

    TCP中长连接短连接

    本文将详细探讨TCP中的长连接和短连接,这两种连接方式在实际应用中的差异和选择。 长连接,也称为持久连接,指的是客户端(Client)与服务器端(Server)在完成连接建立后,保持连接状态不立即断开,以便于进行多...

    TCPIP建立与断开连接详细过程

    在TCP/IP中,TCP协议通过三次握手建立连接,四次挥手来断开连接。 首先,我们来看TCP连接的建立,这个过程被称为三次握手: 1. **第一次握手**:客户端想要与服务器建立连接时,会发送一个带有SYN标志的数据包...

    QT TCP服务端如何判断客户端已断开连接 - 北冥有鱼的博客 - CSDN博客1

    总结来说,QT中检测TCP客户端断开连接主要依靠`QAbstractSocket`的`error`信号和`SocketError`枚举类型。当接收到`RemoteHostClosedError`时,表示客户端已经关闭了连接。通过适当地处理这个错误,可以及时发现...

    TCP-UDP连接断开程序.zip

    UDP通信没有建立连接和断开连接的过程,而是直接发送数据报,因此它更适合对实时性要求高的应用,如在线视频流和语音通话。 “TCP-UDP连接断开程序”可以查看本地所有活跃的TCP和UDP连接,包括它们的端口号、状态、...

    java建立TCP长链接

    在TCP连接建立之前,需要经过三次握手的过程,而在连接结束后,通过四次挥手断开连接。 在Java中,我们通常使用`java.net.Socket`类和`java.net.ServerSocket`类来实现TCP通信。以下是建立TCP长连接的基本步骤: 1...

    详解TCP协议建立连接全过程状态变迁图.doc

    TCP(Transmission Control ...总的来说,TCP协议的连接建立过程是一个严谨且复杂的过程,涉及到的状态变迁和控制机制都是为了保证数据的正确传输和网络的稳定运行。理解这些原理对于网络编程和问题排查具有重要意义。

    TCP长短连接简单Demo

    TCP连接分为长连接和短连接,这两种连接方式各有其特点和适用场景。本Demo是用C++语言在VS2017环境下编写的,旨在帮助开发者理解TCP长连接和短连接的实现。 首先,我们要理解TCP连接的基本概念。TCP是一种面向连接...

    【Linux网络编程笔记】TCP短连接产生大量TIME_WAIT导致无法对外建立新TCP连接的原因及解决方法—实践篇 - slv

    当系统频繁地创建和关闭TCP短连接时,可能会导致大量的连接停留在TIME_WAIT状态,占用本地端口号资源,进而影响到新连接的建立。因为TCP的端口号范围有限(1024到65535),当可用的端口被TIME_WAIT状态的连接占用...

    Window下杀掉TCP连接

    9. **TCP/IP配置**:了解TCP/IP协议的工作原理,例如熟知的三次握手和四次挥手过程,有助于理解为何有时候需要手动关闭TCP连接。 掌握这些方法和知识,有助于你在遇到需要强制结束TCP连接的情况时,能够迅速有效地...

    wireshark抓取TCP连接及断开实验

    - **捕捉断开连接的数据包**:使用过滤规则`tcp.flags.fin==1 and tcp.flags.ack==1`来捕获带有FIN和ACK标志的数据包,这些数据包代表了连接的正常关闭。 - **捕捉RST置位的包**:使用过滤规则`tcp.flags.rst==1`来...

    Wireshark分析TCP连接断开过程分析与总结.docx

    1. FIN_WAIT_1 状态:当 SOCKET 在 ESTABLISHED 状态时,它想主动关闭连接,向对方发送了 FIN 报文,此时该 SOCKET 即主动断开连接方(客户端)进入到 FIN_WAIT_1 状态,对方进入被动关闭 CLOSE_WAIT 状态。...

    LabVIEW TCP 通讯 自动连接 掉线自动重连

    本主题聚焦于LabVIEW中的TCP/IP通信,特别是如何实现自动连接和掉线后自动重连的功能。 TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,确保了数据的完整性和顺序。在LabVIEW中,我们可以...

    tcp3次握手建立连接 4次握手关闭连接

    TCP是一个面向连接的协议,所以在连接双方发送数据之前,都需要首先建立一条连接。TCP连接的建立可以简单的称为三次握手,而连接的中止则可以叫做四次握手。

    基于Apache Mina实现的TCP长连接和短连接实例

    2. **TCP长连接**:在长连接中,一旦建立连接,就可以进行多次数据传输,直到连接的任意一方主动断开连接。这种模式适用于需要保持连续通信的场景,如FTP、HTTPS和WebSocket等。长连接减少了建立和关闭连接的开销,...

    tcp连接建立-关闭-窗口-慢启动1

    本文将深入探讨TCP连接的建立、关闭过程,以及窗口机制和慢启动的概念。 1. **TCP连接建立** - 通常被称为“三次握手”(Three-Way Handshake)。在TCP连接开始时,客户端(Source Port)发送一个SYN(同步序列编号...

    TCPView查看TCP连接

    这款工具可以帮助用户实时查看所有正在运行的进程与哪些远程主机建立了TCP连接,以及这些连接的状态、端口号等详细信息。在IT行业中,了解和掌握TCPView的使用对于网络故障排查、性能优化以及安全监控都有着重要的...

    STM32F103控制 W5500 作为 TCP 客户端连接到 TCP 服务器—W5500STM32F103

    4. 断开连接:当通信完成后,需要发送FIN报文关闭TCP连接。 在TCP/IP协议栈中,TCP是一种面向连接的、可靠的传输层协议。它通过三次握手建立连接,并通过确认机制、序列号和重传策略保证数据的可靠传输。TCP连接的...

    C#网络通信之TCP连接,客户端和服务端的tcp收发信息

    2. 使用TcpClient的Connect方法,指定服务端的IP地址和端口号,建立连接。 3. 获取与TcpClient关联的NetworkStream,用于读写数据。 4. 通过NetworkStream的Write和Read方法发送和接收数据。 5. 完成通信后,记得...

    两个TCP应用同时相互连接和关闭、抓包数据

    本话题将深入探讨两个TCP应用如何同时进行连接和关闭过程,以及如何通过抓包数据来分析这一过程。抓包数据在网络诊断和问题排查中起到至关重要的作用,它能直观地展示网络通信的细节。 首先,TCP连接的建立通常遵循...

Global site tag (gtag.js) - Google Analytics