TCP三次握手(建立连接)/四次挥手(关闭连接)

TCP三次握手(建立连接)/四次挥手(关闭连接)

相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不需要控制这个过程.但是对于理解TCP底层运作机制,相当有帮助.

www.2cto.com

而且对于有网络协议工程师之类笔试,几乎是必考的内容.企业对这个问题热情之高,出乎我的意料:-)。有时上午面试前强调这个问题,并重复讲一次,下午几乎每一个人都被问到这个问题。

因此在这里详细解释一下这两个过程。

TCP三次握手

所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。

三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.在socket编程中,客户端执行connect()时。将触发三次握手。

TCP三次握手(建立连接)/四次挥手(关闭连接)

第一次握手:

客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence Number)字段里。 www.2cto.com

TCP三次握手(建立连接)/四次挥手(关闭连接)

第二次握手:

服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即X+1。

TCP三次握手(建立连接)/四次挥手(关闭连接)

第三次握手.

客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1

TCP三次握手(建立连接)/四次挥手(关闭连接)

SYN攻击

在三次握手过程中,服务器发送SYN-ACK之后,收到客户端的ACK之前的TCP连接称为半连接(half-open connect).此时服务器处于Syn_RECV状态.当收到ACK后,服务器转入ESTABLISHED状态.

Syn攻击就是 攻击客户端 在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直 至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。

Syn攻击是一个典型的DDOS攻击。检测SYN攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击.在Linux下可以如下命令检测是否被Syn攻击

netstat -n -p TCP | grep SYN_RECV

一般较新的TCP/IP协议栈都对这一过程进行修正来防范Syn攻击,修改tcp协议实现。主要方法有SynAttackProtect保护机制、SYN cookies技术、增加最大半连接和缩短超时时间等.

但是不能完全防范syn攻击。 www.2cto.com

TCP 四次挥手

TCP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。

TCP三次握手(建立连接)/四次挥手(关闭连接)

参见wireshark抓包,实测的抓包结果并没有严格按挥手时序。我估计是时间间隔太短造成。

TCP三次握手(建立连接)/四次挥手(关闭连接)

1、建立连接协议(三次握手)

(1)客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报文1。

(2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志。因此它表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好进行数据通讯。

(3) 客户必须再次回应服务段一个ACK报文,这是报文段3。

2、连接终止协议(四次挥手)

   由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

 (1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送(报文段4)。

 (2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。 www.2cto.com

 (3) 服务器关闭客户端的连接,发送一个FIN给客户端(报文段6)。

 (4) 客户段发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。

CLOSED: 这个没什么好说的了,表示初始状态。

LISTEN: 这个也是非常容易理解的一个状态,表示服务器端的某个SOCKET处于监听状态,可以接受连接了。

SYN_RCVD: 这个状态表示接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本上用netstat你是很难看到这种状态的,除非你特意写了一个客户端测试程序,故意将三次TCP握手过程中最后一个ACK报文不予发送。因此这种状态时,当收到客户端的ACK报文后,它会进入到ESTABLISHED状态。

SYN_SENT: 这个状态与SYN_RCVD遥想呼应,当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,因此也随即它会进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。

ESTABLISHED:这个容易理解了,表示连接已经建立了。

FIN_WAIT_1: 这个状态要好好解释一下,其实FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。而这两种状态的区别是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。

FIN_WAIT_2:上面已经详细解释了这种状态,实际上FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。

TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。

CLOSING: 这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什么情况下会出现此种情况呢?其实细想一下,也不难得出结论:那就是如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。

CLOSE_WAIT: 这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方close一个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。 www.2cto.com

LAST_ACK: 这个状态还是比较容易好理解的,它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。

最后有2个问题的回答,我自己分析后的结论(不一定保证100%正确)

1、 为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

2、 为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?

这是因为:虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。

分类:默认分类 时间:2012-01-01 人气:4
本文关键词:
分享到:

相关文章

  • 系统学习TCP/IP协议(一)------有用的策略和模式 2012-01-04

    系统学习TCP/IP协议(一)------有用的策略和模式 协议实际上就是一种解决某些问题的策略和模式,在经典的TCP/IP协议中就有很多策略和模式值得学习。归纳起来有以下一些(随着学习深入逐步添加): 分层 封装和分用 可靠连接 分层 分层是TCP/IP乃至网络通信最核心的策略和模式,分层使得所有的网络应用程序不用关心底层链路传输的细节,也使得不同类型的网络有效地互通。这是一种典型的化繁为简,把复杂的事情分解到不同层面的策略,层与层之间是服务与被服务的关系,每层只需关注所在维度的事情。例如,通

  • TCP连接状态详解示意图 2012-01-21

    TCP连接状态详解示意图 tcp状态: LISTEN:侦听来自远方端口的连接请求 SYN-SENT:再次发送连接请求后等待匹配的连接请求 SYN-RECEIVE:再次收到和发送一个连接请求后等待对方连接诶请求的确认 ESTABLISHED:代表一个打开的连接 FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认 FIN-WAIT-2:从远程TCP等待连接中断请求 CLOSE-WAIT:等待从本地用户发来的连接中断请求 CLOSEING:等待远程TCP对连接中断的确认 LA

  • 快车的TCP端口/UDP端口是什么 2012-01-25

      快车的TCP端口/UDP端口说明如下:   TCP和UDP服务通常有一个用户/服务器的关系,例如,一个Telnet服务进程开始在系统上处于空闲状态,等待着连接。用户使用Telnet用户程序与服务进程建立一个连接。用户程序向服务进程写入信息,服务进程读出信息并发出响应,用户程序读出响应并向用户报告。因而,这个连接是双工的,可以用来进行读写。   TCP或UDP连接唯一地使用每个信息中的如下四项进行确认:   源IP地址:发送包的IP地址。   目的IP地址:接收包的IP地址。   源端口:源系

  • 大话TCP/IP协议之HTTP网络协议(一) 2012-02-01

    Part1.最熟悉的陌生人 和TCP/UDP协议比起来,HTTP协议或许更为大家所熟知,因为大家处处都可以看到http://xxx.com的字样。但是,真 正了解HTTP协议的同学,或许只是少数,还有很多人甚至不知道"404"的含义。而本文,正是让大家来更深入的了解 下这位最熟悉的陌生人。 Part2.HTTP在江湖中的地位 众所周知,Internet四层网络模型(也称TCP/IP四层模型)包括数据链路层、网络层、传输层和应用层。网络层最著名的协议是IP协议,传输层最著名的协议是TCP协议和UD

  • 传输协议:TCP和UDP的区别 2012-02-10

    传输协议:TCP和UDP的区别 TCP(传输控制协议): 1)提供IP环境下的数据可靠传输(一台计算机发出的字节流会无差错的发往网络上的其他计算机,而且计算机A接收数据包的时候,也会向计算机B回发数据包,这也会产生部分通信量),有效流控,全双工操作(数据在两个方向上能同时传递),多路复用服务,是面向连接,端到端的传输; 2)面向连接:正式通信前必须要与对方建立连接。事先为所发送的数据开辟出连接好的通道,然后再进行数据发送,像打电话。 3)TCP支持的应用协议:Telnet(远程登录)、FTP(文

  • TCP建立与断开连接以及错误处理(包括部分小问题) 2012-02-12

    TCP建立与断开连接以及错误处理(包括部分小问题) 1. TCP建立连接:三次握手,到处都有。需要注意的是ACK确认序列号是SYN携带序列号+1,不是直接相等。基本过程如图所示。 socket程序中调用connect将激发三路握手过程,connect将在成功建立连接或者出错才返回。 (1) 客户端发送SYN以后,6s没有来自服务器的SYN分节响应,则重发SYN,24s后无响应再重发,75s后无响应则返回错误ETIMEOUT。 (2) 对客户端的响应若是RST,则表明服务器端对应端口没有进程等待与

  • 系统学习TCP/IP协议(二)------连接建立与关闭 2012-02-15

    系统学习TCP/IP协议(二)------连接建立与关闭 TCP的可靠传输首先是建立在可靠的连接建立与关闭之上,这一块包含以下要点: TCP三次握手建立连接 TCP半关闭 TCP的状态变迁 TCP服务端监听和处理设计 TCP三次握手建立连接 TCP为了通信双方确认建立起连接,设计了三次握手的策略,三次握手的过程如下: 1) 请求端发送一个SYN段指明客户打算连接的服务器的端口,以及初始序号(ISN)。 2) 服务器发回包含服务器的初始序号的SYN报文段作为应答。同时,将确认序号设置为客户的ISN

  • 系统安全:用TCP/IP 网络连接过滤保护用户计算机 2012-02-17

    除了使用防火墙和杀毒软件,我们还可以使用TCP/IP过滤来保护我们的计算机。TCP/IP过滤可以允许特定的TCP和UDP端口或者IP协议连接到用户的计算机。 要配置一个网络连接的TCP/IP过滤,我们可以遵循下面的步骤: 1.在系统托盘中的网络连接图标上右击,选择“状态”,如图1: 图 1 2.单击“属性”按钮,打开网络连接属性对话框,找到“网络”选项卡,单击Internet协议(TCP/IP): 3.单击属性按钮,打开下面的窗口,如图2: 图 2 4.在上图中,单击“高级…”按钮,打开“高级T

  • TCP/IP协议的几个截图及子网划分方法 2012-02-21

    TCP/IP协议的几个截图及子网划分方法 一.划分子网需要考虑的问题: 1.要划分的子网数量 2.每个子网的主机数量 二.确定子网掩码的步骤: 1.确定子网数量,并将其转换为二进制数,并确定位数n。如:你需要6个子网,6的二进制值为110,共3位,即n=3; 2.按照你ip地址的类型写出其缺省子网掩码。如C类,则缺省子网掩码为11111111.11111111.11111111.00000000; 3.将缺省子网掩码中与主机号的前n位对应的位置置1,其余位置置0。若n=3且为C类地址:则得到子网

Copyright (C) quwantang.com, All Rights Reserved.

趣玩堂 版权所有 京ICP备15002868号

processed in 0.035 (s). 10 q(s)