TCP三次握手和四次挥手的问题在面试中是最为常见的考点之一。很多读者都知道三次和四次,但是如果问深入一点,他们往往都无法作出准确回答。本文就来简单谈谈 TCP 的三次握手和四次挥手。 在了解后面的知识之前我们先来看下 OSI 七层模型吧。
What is the OSI model? 开放式系统互联通信参考模型(英语:Open System Interconnection Reference Model,缩写为 OSI),简称为 OSI 模型(OSI model),一种概念模型,由国际标准化组织(ISO)提出,一个试图使各种计算机在世界范围内互连为网络的标准框架。定义于 ISO/IEC 7498-1。
主要功能: 为应用软件提供接口,使应用程序能够使用网络服务 典型设备: 网关 典型协议、标准和应用: http(80)、ftp(20/21)、smtp(25)、pop3(110)、telnet(23)、dns(53)
主要功能: 数据的解码和编码,数据的加密和解密,数据的压缩和解压缩 典型设备: 网关 典型协议、标准和应用: ASCLL、PICT、TIFF、JPEG、 MIDI、MPEG
主要功能: 建立、维护、管理应用程序之间的会话 典型设备: 网关 典型协议、标准和应用: RPC、SQL、NFS 、X WINDOWS、ASP
主要功能: 负责建立端到端的链接,保证保温在端到端之间的传输 典型设备: 网关 典型协议、标准和应用: TCP、UDP、SPX
主要功能: 负责将分组数据从源端传输到目的端,网络层的主要作用就是路由和寻址 典型设备: 路由器 典型协议、标准和应用: IP、IPX、APPLETALK、ICMP
主要功能: 在不可靠的物理链路上,提供可靠的数据传输服务 典型设备: 交换机、网桥、网卡 典型协议、标准和应用: 802.2、802.3ATM、HDLC、FRAME RELAY
主要功能: 利用传输介质为数据链路层提供物理连接,实现比特流的透明传输 典型设备: 集线器、中继器 典型协议、标准和应用: V.35、EIA/TIA-232
应用层: TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等 传输层: TCP,UDP 网络层: IP,ICMP,OSPF,EIGRP,IGMP 数据链路层: SLIP,CSLIP,PPP,MTU
互联网协议族(英语:Internet Protocol Suite,缩写为 IPS)[1],是一个网络通信模型,以及一整个网络传输协议家族,为互联网的基础通信架构。它常被通称为 TCP/IP 协议族(英语:TCP/IP Protocol Suite,或 TCP/IP Protocols),简称 TCP/IP [2]。 因为这个协议家族的两个核心协议,包括TCP(传输控制协议)和 IP(网际协议),为这个家族中最早通过的标准[3]。由于在网络通讯协议普遍采用分层的结构,当多个层次的协议共同工作时,类似计算机科学中的堆栈,因此又被称为 TCP/IP 协议栈(英语:TCP/IP Protocol Stack)[4][5] 。 这些协议最早发源于美国国防部(缩写为 DoD)的ARPA 网项目,因此也被称作 DoD 模型(DoD Model)[6]。这个协议套组由互联网工程任务组负责维护。 TCP/IP 提供点对点的链接机制,将数据应该如何封装、定址、传输、路由以及在目的地如何接收,都加以标准化。它将软件通信过程抽象化为四个抽象层,采取协议堆栈的方式,分别实现出不同通信协议。协议套组下的各种协议,依其功能不同,被分别归属到这四个层次结构之中[7][8],常被视为是简化的七层 OSI 模型。
在建立 TCP 连接之前需要进行三次握手,以便于链接到服务器,如果要断开服务器需要进行四次挥手,具体流程如下。
一个完整的三次握手也就是请求—应答—再次确认
为什么要挥手,简单点来说就是既然建立了链接,那么肯定还要断开连接吖,连接总不能一直占用吧,这样多浪费系统该资源,下面让我们来看看四次挥手的流程。
这是因为服务端在 LISTEN 状态下,收到建立连接请求的 SYN 报文后,把 ACK 和 SYN 放在一个报文里发送给客户端。而关闭连接时,当收到对方的 FIN 报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即 Close,也可以发送一些数据给对方后,再发送 FIN 报文给对方来表示同意现在关闭连接,因此,己方 ACK 和 FIN一般都会分开发送。
目的: 防止已经失效的连接请求到达服务端,创建无效的连接,浪费资源。 说明: 当客户端发出的第一个连接请求在网络上的某个节点被滞留了(网络会存在许多不可靠的因素),过一段时间后突然又到达了服务端,服务端误以为这是一个新的建立连接的请求,于是就会向客户端发出确认包并建立连接。 实际上客户端当前并没有发出创建连接的请求,就会丢弃服务端的确认包。而服务端却创建了连接并等待客户端发送数据,浪费了相关的资源。
在三次握手过程中,服务器发送 SYN-ACK 之后,收到客户端的 ACK 之前
的 TCP 连接称为半连接 (half-open connect)。此时服务器处于 SYN_RECV 状态,当收到 ACK 后,服务器转入 ESTABLISHED 状态.
SYN 攻击就是:攻击客户端在短时间内伪造大量不存在的 IP 地址,向服务器不断地发送 SYN 包,服务器回复 ACK 确认包,并等待客户的确认从而建立连接。由于源地址是不存在的,不会再发送 ACK 确认包,所以服务器需要不断的重发直至超时,这些伪造的 SYN 包将长时间占用未连接队列,正常的 SYN 请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。
SYN 攻击是一个典型的 DDOS 攻击。检测 SYN 攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源 IP 地址是随机的,基本上可以断定这是一次 SYN 攻击
虽然按道理,四个报文都发送完毕,我们可以直接进入 CLOSE 状态了,但是我们必须假象网络是不可靠的,有可以最后一个 ACK 丢失。所以 TIME_WAIT 状态就是用来重发可能丢失的 ACK 报文。
来源:安生博客,原文:http://t.cn/AiCifqeP
转自:高效运维