7. TCP连接管理

7.1 TCP的连接建立

(1)三次握手

  ①三次握手过程

    A.第1、2次握手,数据包的SYN均为1,表示用于同步。即第1次客户端发起请求,并将自己的连接参数(如接收窗口大小、MSS和是否支持SACK等)告知服务器。第2次连接是服务器收到连接请求后作出确认,同时其自己的连接参数告知客户端,这主要是出于双向通信的需要)。因此SYN=1表示,这两个数据包主要用于协商和同步通信双方的连接参数)。ACK=1表示是一个确认包。ack表示确认的数据包序号。

    B.第3次握手用于告知客户端服务器端收到确认,可以正式开始通信。

  ②TCP连接状态(查看的命令:netstat -an

    A.服务器启用后,会进入LISTEN状态,监听客户端连接。

    B.当客户端发出连接请求后进入SYN-SEND状态。服务器收到请求后进入SYN-RCVD状态,然后发一个确认包给客户端。

    C.客户端收到确认包以后,创建TCP连接并进入ESTABLISHED状态,同时通知服务器己收到确认包。

    D.服务器收到客户端和通知后,也创建TCP连接并进入ESTABLISHED,于是双方TCP连接建立完成,可以正式通信。

(2)为什么需要三次握手?防止失效的连接请求突然又到达服务器!

  ①场景假设:客户端发出的第1次连接请求,由于网络延时的原因直至客户端连接超时,该请求还未到达服务器端。因此,这个连接请求在客户端这里就会被作废。于是发送第2个连接请求。

  ②如果只采用两次握手

    A.当服务器收到第2次的连接请求后,会发送确认告诉客户端己收到请求。由于采用的是两次连接,此时就会创建一个新的Socket来服务客户端

    B.客户端收到服务端的确认后,也创建与服务器通信的TCP连接。于是双方可以正式通信了。

    C.当双方TCP连接建立起来以后。突起那个在网络上延时的第1个连接请求到达了服务器。服务器收到这个连接请求后,由于两次握手机制依然会创建一个用来服务客户端的TCP连接,并发一个确认给客户端。但由于第1次连接请求在客户端看来己失效,相当于客户端会认为我并没有发出连接请求,而服务器莫名其妙地发一个确认给自己,因此就会直接丢弃这个确认包。但对于服务端来讲,连接己经建立了,可以正常通信。就会一直在那等着客户端给自己发数据,这对服务器来说是一种严重的资源浪费。

  ③如果采用三次握手主要分析这个延时的请求会被如何处理?因为第2次连接请求是正常的TCP通信的过程!)

    A.第1次连接请求(在网络上被延时)突然到达服务器(第一次握手)。

    B.服务器并不马上建立TCP连接,而是通知客户端收到了该请求。(第二次握手)

    C.当客户端收到这个“确认”以后,由于第1次连接请求在客户端看来己经失效,所以会认为自己并没有发出连接请求,就会直接丢弃这个“确认包”。服务器由于没有收到对“确认的确认”就不会为客户端创建TCP连接,这可以防止服务端资源的浪费。

7.2 TCP连接释放

(1)四次挥手过程

  ①第1次挥手:客户端(也可以是服务端)主动向服务端发送一个FIN报文段,然后进入FIN_WAIT_1状态。此FIN报文段的意思表示客户端需要发送的用户数据己发送完毕,不再有用户数据需要发送给服务器了。这时的TCP处于半关闭状态,即只有一方向另一方发送用户数据。

  ②第2次挥手:服务器收到客户端发送的FIN报文段,通知其高层的应用程序。然后发送确认给客户端,客户端收到后进入FIN_WAIT_2状态继续等待。因为服务端可能还有数据没发完,让客户端继续等服务端的通知。而服务端发送对FIN报文的确认完,会进入CLOSE-WAIT状态等待从B向A的数据传完。

  ③第3次挥手:当服务端向客户端的数据传输完以后,高层应用程序会通知TCP。然后TCP发送FIN报文给客户端通知其也没有用户数据需要传输,可以关闭连接了。同时服务器进入LAST_ACK状态。

  ④第4次挥手:客户端收到服务器发送的FIN报文,向服务器发送ACK报文,然后客户端进入TIME_WAIT状态。服务器收到客户端的ACK报文段后,就关闭连接。此时,客户端等待2MSL(2倍的最长报文段时间)后就关闭连接了。

(3)为什么客户端在TIME-WAIT状态必须等待2MSL的时间?

  保证A发送的最后一个ACK报文段能够到达B。这个ACK报文可能丢失,因而B可能在超时以后重传这个FIN+ACK报文给A,而A就能在2MSL时间内收到这个重传的FIN+ACK报文。接着A重传一次确认,并重启2MSL计时器。如果A在TIME-WAIT不等待一段时间,而是在发送完ACK后立即释放连接,那么就无法收到B重传的FIN+ACK报文从而导致B不能按正常步骤进入CLOSED状态。

(4)保活器计时(Keepalive Timer)

  ①如果客户端突然出现故障,这时并没有机会通知服务器。为防止服务器无谓地等下去。就需要用保活计时器。

  ②服务器在每收到一次客户端发来的数据,就重置保活计时器(通常是2小时)。若在规定的时间内没有收到客户的数据服务器就会发送一个探测报文段,以后每隔(75秒)发一次,如果一连发送10个探测报文仍无客户的响应。就认为客户端出了故障,接着就关闭连接。

7.3 实战:查看TCP连接/释放的数据包

(1)抓包分析TCP连接过程的数据包(以客户端给服务器的第1个数据包为例)

  ①第1次握手的数据包:seq=x(0),SYN=1,ACK= 0,ack= y(0)(在此次中该值无效),以及一些协商参数(如客户端的接收窗口大小,TCP选项部分包含了最大报文段长度(MSS)、是否支持选择确认)

  ②第2次握手的数据包:seq=y(0),SYN=1,ACK=1(表示是一个确认包),ack=x+1(1)以及为了支持双向通信的一些协商参数(如服务端的接收窗口、MSS、是否支持SACK等)

  ③第3次握手的数据包:seq=x+1(1),SYN=0,ACK=1,ack=y+1(1)

(2)抓包分析TCP释放过程的数据包

  ①释放数据包的TCP首部有FIN标志。②可在命令行中通过netstat –n查看TCP活动的连接及状态

7.4 实战:SYN和LAND攻击

(1)SYN攻击

  ①在A计算机上安装SYN攻击器软件。该软件会向B发送TCP连接请求。

  ②但由于SYN伪造了一个TCP请求报文,将源地址改为其他的主机地址(假设是x)。这将导致B计算机把对连接请求的确认报文给x计算机。

  ③由于x计算机根据没有向B机请求连接,因此会直接丢弃数据包。但B并不知道会一些等待x机的确认,以便完成TCP连接。如果A大量发送这样的TCP请求,无疑将造成B计算机资源的极大浪费(见抓包图)

(2)LAND攻击

  ①与SYN攻击类似,LAND将一个TCP请求报文中的源地址改成目标主机地址

  ②这样会导致B计算机在收到请求报文后又给自己发了一个确认包。这个攻击比SYN攻击更利害,可能会直接导致B的崩溃。

第8章 传输层(7)_TCP连接管理的更多相关文章

  1. 第6章 传输层(详解TCP的三次握手与四次挥手)

    第6章 传输层 传输层简介 传输层为网络应用程序提供了一个接口,并且能够对网络传输提供了可选的错误检测.流量控制和验证功能.TCP/IP传输层包含很多有用的协议,能够提供数据在网络传输所需的必要寻址信 ...

  2. 第8章 传输层(3)_TCP协议

    3. 传输控制协议(TCP) 3.1 TCP协议的主要特点 (1)TCP是面向连接的传输层协议.即使用TCP协议之前必须先建立TCP连接.在传送数据完毕之后,必须释放己经建立的TCP连接. (2)每一 ...

  3. 第8章 传输层(1)_TCP/UDP协议的应用场景

    1. 传输层的两个协议 1.1 TCP和UDP协议的应用场景 (1)TCP协议:如果要传输的内容比较多,需要将发送的内容分成多个数据包发送.这就要求在传输层用TCP协议,在发送方和接收方建立连接,实现 ...

  4. 【知识强化】第五章 传输层 5.3 TCP协议

    这节课我们来学习一下TCP协议的特点以及TCP报文段的格式. 首先呢我们来看一下TCP有哪些特点呢.之前我们说过TCP它是一个比较可靠的面向连接的协议,所以最主要的特点它是可以面向连接的一种传输层协议 ...

  5. 数据通讯与网络 第五版第24章 传输层协议-TCP协议部分要点

    上一博客记录了UDP协议的关键要点,这部分记录TCP协议的关键要点. 24.3 传输控制协议(TRANSMISSION CONTROL PROTOCOL) TCP(Transmission Contr ...

  6. 数据通讯与网络 第五版第24章 传输层协议-UDP协议部分要点

    24.1 介绍 本章节主要集中于传输层协议的解读,图24.1展示TCP.UDP.SCTP在TCP\IP协议栈的位置 24.1.1 服务(Service) 每个协议都提供不同的服务,所以应该合理正确的使 ...

  7. 计算机网络自顶向下方法第3章-传输层 (Transport Layer).2

    3.5 面向连接的运输: TCP 3.5.1 TCP连接 TCP是因特网运输层的面向连接的可靠的运输协议. TCP连接提供全双工服务(full-duplex service). TCP连接是点对点的连 ...

  8. 【知识强化】第五章 传输层 5.2 UDP协议

    这节课我们来学习一下UDP协议. 那在上节课呢我们学了这样一个打油诗. 啊,就是传输层有两个好兄弟,大哥TCP和二弟UDP.大哥很靠谱,二弟不靠谱.那只要说到UDP协议我们就要知道它的一个重要的特点, ...

  9. 第8章 传输层(2)_UDP协议

    2. 用户数据报协议(UDP) 2.1 UDP的特点 (1)UDP是无连接的,即发送数据之前不需要建立连接,因此减少了开销和发送数据之前的时延. (2)UDP使用了尽最大努力交付,即不保证可靠交付,因 ...

随机推荐

  1. 使用skipper 扩展fabio 的路由&&http proxy 功能

    skipper 具有强大的http 路由功能,fabio 是一个方便的基于consul 的负载均衡软件, 我们可以方便的使用skipper 路由功能进行fabio的扩展,使用registrator 进 ...

  2. PHP 获取上月,本月,近15天,近30天日期

    <?php //echo $_SERVER['PHP_SELF']; //define('ROOT_PATH',str_replace($_SERVER['PHP_SELF'],'',str_r ...

  3. out, ref 和 params 的区别和用法

    1. out 参数. 如果你在一个方法中,返回多个相同类型的值,可以考虑返回一个数组. 但是,如果返回多个不同类型的值,返回数组就不可取.这个时候可以考虑使用out参数. out参数就侧重于在一个方法 ...

  4. 论 业务系统 架构 的 简化 (一) 不需要 MQ

    MQ , 就是 消息队列(Message Queue), 不知从什么时候起, MQ 被用来 搭建 分布式 业务系统 架构, 一个重要作用 就是用来  “削峰”   . 我们 这里 就来 讨论 如何 设 ...

  5. haproxy(单机)+mysql集群负载均衡

    HAProxy是 七层代理 ,在使甠HAProxy后,在MySQL上 看不到Apps的源IP地址 ,看到的是HAProxy地址,而 MySQL的权限访问设置是和IP地址有关 ,这样就导致了MySQL无 ...

  6. chrome自定义ua(批处理文件方式)

    新建bat文件,输入如下代码: @echo off start chrome.exe --user-agent="你自定义的ua字符串" EXIT 保存后运行bat文件. 这个时候 ...

  7. jmeter --- 搭建持续集成接口测试平台(Jenkins+Ant+Jmeter)

    jmeter --- 搭建持续集成接口测试平台(Jenkins+Ant+Jmeter) 一.环境准备: 1.JDK:http://www.oracle.com/technetwork/java/jav ...

  8. C# 虚方法、override和new

    使用new关键字来做调用 using System; using System.Collections.Generic; using System.Linq; using System.Text; u ...

  9. 基于MVC4+EasyUI的Web开发框架形成之旅(6)--基类控制器CRUD的操作

    在上一篇随笔中,我对Web开发框架的总体界面进行了介绍,其中并提到了我的<Web开发框架>的控制器的设计关系,Web开发框架沿用了我的<Winform开发框架>的很多架构设计思 ...

  10. Video to SDI Tx Bridge模块video_data(SD-SDI)处理过程

    Video to SDI Tx Bridge模块video_data(SD-SDI)处理过程 1.Top Level Block Diagram of Video to SDI TX Bridge V ...