1. 数据传输的大致示意图

1.1 TCP数据报文首部内部

1.2 TCP连接的几种状态说明

  即命令 netstat 结果中的所有状态:

2. TCP连接建立的全过程

2.1 TCP三次握手建立TCP连接

  1)客户端和服务端都处于CLOSED状态。(发起TCP请求的称为客户端,接受请求的称为服务端)
  2)服务端打开服务端口,处于listen状态。
  3)客户端发起连接请求。首先发送SYN(synchronous)报文给服务端,等待服务端给出ACK报文回应。发送的SYN=1,ACK=0,seq=x,表示只发送了SYN信号。此时客户端处于SYN-SENT状态(SYN信号已发送)。

  4)服务端收到SYN信号后,发出ACK报文回应,并同时发出自己的SYN信号请求连接。此时服务端处于SYN-RECV状态(syn recieved,在图中显示的是SYN-RCVD)。发送的SYN=1 ACK=x+1,seq=y,表示发送了SYN+ACK。
  5)客户端收到服务端的确认信号ACK后,再次发送ACK信号给服务端以回复服务端发送的syn。此时客户端进入ESTABLISHED状态,发送的SYN=0,ACK=y+1,seq=x+1,表示只发送了ACK。
  6)服务端收到ACK信号后,也进入ESTABLISHED状态。此后进行数据的传输都通过此连接进行。其中第3、4、5步是三次握手的过程。这个过程通俗地说就是双方请求并回应的过程:①A发送syn请求B并等待B回应;②B回应A,并同时请求A;③A回应B

2.2 TCP释放连接,四次挥手断开TCP连接全过程

  1)客户端发送FIN(finally)=1,seq=u报文信号,请求断开。此后客户端进入FIN-WAIT-1状态。
  2)服务端收到FIN信号,给出确认信号ACK=1,seq=v,ack=u+1表示同意断开。此时服务端进入CLOSE-WAIT状态。此过程结束后表示从客户端到服务端方向的TCP连接已经关闭了,也就是说整个TCP连接处于半关闭状态。
  3)客户端收到服务端的ACK后进入FIN-WAIT-2状态,以等待服务端发出断开信号FIN。在客户端的FIN-WAIT-2状态的等待过程中,服务端再发出自己的FIN信号给客户端,FIN=1,ACK=1,seq=w,ack=u+1。此时服务端进入LAST-ACK状态。
  4)客户端收到服务端的FIN信号,给出回应信号ACK,ACK=1,seq=u+1,ack=w+1,表示接受服务端的断开请求,此时客户端进入TIME-WAIT状态,此时客户端已脱离整个TCP,只需再等待一段时间(2*MSL)就自动进入CLOSED状态。
  5)服务端收到客户端的回应ACK信号,知道客户端同意了服务端到客户端方向的TCP断开,直接进入CLOSED状态。以上1.2.3.4是四次挥手的阶段,握手和挥手的过程是类似的.区别是:握手时发送的SYN和ACK是放在同一个数据包发送的,而挥手时,是将服务端发送的ACK和FIN分卡发送的.

  注意:如果是客户端请求断开,那么服务端就是被动断开端,可能会保留大量的CLOSE-WAIT状态的连接,如果是服务端主动请求断开,则可能会保留大量的TIME_WAIT状态的连接。由于每个连接都需要占用一个文件描述符,高并发情况下可能会耗尽这些资源。因此,需要找出对应问题,做出对应的防治,一般来说,可以修改内核配置文件 /etc/sysctl.conf 来解决一部分问题。

3. Linux下查看和预防SYN洪水攻击

  SYN洪水攻击是一种常见的DDoS攻击手段.攻击者可以通过工具在极短时间内伪造大量随机不存在的ip向服务器指定端口发送tcp连接请求,也就是发送了大量syn=1 ack=0的数据包,当服务器收到了该数据包后会回复并同样发送syn请求tcp连接,也就是发送ack=1 syn=1的数据包,此后服务器进入SYN-RECV状态,正常情况下,服务器期待收到客户端的ACK回复。但问题是服务器回复的目标ip是不存在的,所以回复的数据包总被丢弃,也一直无法收到ACK回复,于是不断重发ack=1 syn=1的回复包直至超时。在服务器被syn flood攻击时,由于不断收到大量伪造的syn=1 ack=0请求包,它们将长时间占用资源队列,使得正常的SYN请求无法得到正确处理,而且服务器一直处于重传响应包的状态,使得cpu资源也被消耗。总之,syn flood攻击会大量消耗网络带宽和cpu以及内存资源,使得服务器运行缓慢,严重时可能会引起网络堵塞甚至系统瘫痪.

  可使用 netstat -lntap 命令判断服务器是否遭受SYN洪水攻击,结合 /etc/sysctl.conf 和防火墙iptables是进行优化/封堵.

[root@xuexi ~]# netstat -tnlpa | grep tcp | awk '{print $6}' | sort | uniq -c
1 ESTABLISHED
7 LISTEN
256 SYN_RECV

  以上大部分内容参考好友报文博文 https://www.cnblogs.com/f-ck-need-u/p/7397146.html

  

TCP三次握手四次挥手过程梳理的更多相关文章

  1. TCP三次握手四次挥手过程详解

    http://blog.csdn.net/imilli/article/details/50620104 TCP头部: 其中 ACK   SYN  序号  这三个部分在以下会用到,它们的介绍也在下面. ...

  2. TCP三次握手四次挥手过程及各过程中客户端和服务器端的状态。

    #三次握手 客户端向服务器端发送SYN包,客户端进入SYN_SEND状态 服务器端收到客户端发送的包返回ACK+SYN包,服务器端进入SYN_RECV状态 客户端收到服务器端返回的包再发回ACK包,客 ...

  3. [转]Linux服务器上11种网络连接状态 和 TCP三次握手/四次挥手详解

    一.Linux服务器上11种网络连接状态: 图:TCP的状态机 通常情况下:一个正常的TCP连接,都会有三个阶段:1.TCP三次握手;2.数据传送;3.TCP四次挥手. 注:以下说明最好能结合”图:T ...

  4. TCP三次握手四次挥手,通俗易懂版

    三次握手四次挥手 三次握手 其实很好理解,三次握手就是保证双手都有发送和接受的能力.那么最少三次才能验证完成 即----> 客户端发送---服务端收到----服务端发送-- 1.客户端发送 -- ...

  5. tcp三次握手四次挥手那些事

    建立TCP需要三次握手才能建立,而断开连接则需要四次挥手.三次握手,四次挥手流程图如下: 一.首先看下如何通过三次挥手----------建立连接 首先客户端发送连接请求报文,服务端接受连接后回复AC ...

  6. 网络 TCP三次握手,四次挥手详解

    三次握手,四次挥手可以说是炙手可热的面试题了,来看看它究竟长什么样子吧! 我们先把流程图贴上来 : 为什么这么复杂? 因为TCP是可靠性传输. 确认可靠传输的前提:  TCP连接管理机制 用TCP首部 ...

  7. TCP三次握手/四次挥手详解

    一. TCP/IP协议族 TCP/IP是一个协议族,通常分不同层次进行开发,每个层次负责不同的通信功能.包含以下四个层次: 1. 链路层,也称作数据链路层或者网络接口层,通常包括操作系统中的设备驱动程 ...

  8. TCP三次握手四次挥手详解

    转载 http://www.cnblogs.com/zmlctt/p/3690998.html 相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不需 ...

  9. wireshark抓包直观图解 TCP三次握手/四次挥手详解

    转http://www.seanyxie.com/category/linux/ 作者:seanyxie |   一. TCP/IP协议族 TCP/IP是一个协议族,通常分不同层次进行开发,每个层次负 ...

随机推荐

  1. 蒙蔽的FormBody

    作为一个不算新人的新人,今天看到 了FormBody这个绿色字体,之前没有怎么注意过, 好了 ,发现了一篇文章,记录下. 这篇文章总结下来就是: 在前端穿过的数据是Json格式(当我们设置Conten ...

  2. Adobe Acrobat DC 安装

    Adobe Acrobat DC 制作pdf模板 下载:http://www.downza.cn/soft/20562.html 安装出错解决: 可以将C:\Program Files (x86)\C ...

  3. Prop验证、inheritAttrs、$attrs的用法和坑

    Prop Prop验证 Vue.component('my-component', { props: { // 基础的类型检查 (`null` 和 `undefined` 会通过任何类型验证) pro ...

  4. kaggle预测房价的代码步骤

    # -*- coding: utf-8 -*- """ Created on Sat Oct 20 14:03:05 2018 @author: 12958 " ...

  5. java 方法定义 调用

    一.定义 格式: 修饰符 返回值类型 方法名(参数){ return } 相比之下python方法的定义简单多了 public static 是修饰符 二.调用 方法名(); 注意:要在main方法中 ...

  6. __call__ 方法

    对象() 或 类()() 调用 __call__里面的方法 class Call: def __call__(self, *args, **kwargs): print("Hello __c ...

  7. JSONArray 与 List 互转

    List 转 JSONArray // 通过JSONPath获取其中数据,也可以说自己生成的List List<JSONObject> caseList = JsonPath.read(r ...

  8. FreeImage 结合 VB6 使用技巧

    1.图片(Bitmap)改变为32位使用FreeImage_ConvertColorDepth函数.图片半透明绘制需要图片(Bitmap)是32位的. 2.图片(Bitmap)的半透明绘制使用函数:F ...

  9. 团队作业-Alpha版本发布2

    团队项目-系统设计 这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/GeographicInformationScience/homework 这个作业要 ...

  10. 龙芯 3B1500 Fedora28 安装笔记

    版权声明:原创文章,未经博主允许不得转载 龙芯 3A4000 已经发布,十年前的 3B1500 早就落伍了.但我还是打算把它作为寒假刷 ACM 题的主力机 并将此当作年后收到 4000 的预习. 龙芯 ...