一、TCP报文格式

  下面是TCP报文格式图:

          

  (1) 序号, Seq(Sequence number), 占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。

  (2) 确认号, Ack(Acknowledge number), 占32位, 只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。

  (3) 标志位  有6种标示(SYN、ACK、PSH、RST、URG、FIN):

    ① SYN(synchronous建立联机)

    ② ACK(acknowledgement 确认)

    ③ PSH(push传送)

    ④ RST(reset重置)

    ⑤ URG(urgent紧急)

    ⑥ FIN(finish结束)

  注:

    ① 不要将确认号Ack(Acknowledge number)  和  标志位中的 ACK(acknowledgement)混淆

二、三次握手

  

  (1) 第一次握手: Client将标志位SYN置为1, 随机产生一个seq=J, 并将该数据包发送给Server, Client进入SYN_SENT状态, 等待

         Server确认.

  (2) 第二次握手: Server收到数据包后由标志位SYN=1知道Client请求建立连接, Server将标志位SYN和ACK都置为1,ack=J+1,

          随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RECV状态.

  (3) 第三次握手: Client收到确认后, 检查ack是否为J+1, ACK是否为1, 如果正确则将标志位ACK置为1,ack=K+1, 并将该数据

         包发送给Server,Server检查ack是否为K+1, ACK是否为1, 如果正确则连接建立成功, Client和Server进入

         ESTABLISHED状态, 完成三次握手, 随后Client与Server之间可以开始传输数据了. 

  SYN攻击:

      在三次握手过程中, Server发送SYN_ACK之后, 收到Client的ACK之前的TCP连接称为 半连接(half-open connect), 此时

  Server处于SYN_RECV状态,Server转入ESTABLISHED状态. SYN攻击就是Client在短时间内伪造不存在的IP地址, 并向Server

  不断的发送SYN包, Server回复确认包, 并等待Client确认, 由于源地址不存在的, 因此Server需要不断重发直至超时, 这些伪造的

  SYN包将产时间占用未连接队列, 导致正常的SYN请求因为队列满而被丢弃, 从而引起网络堵塞甚至系统瘫痪. SYN攻击时一种典

  型的DDOS攻击, 检测SYN攻击的方式非常简单, 即当Server上有大量半连接状态切源IP地址是随机的, 则可以断定遭到SYN攻击

  了, 使用如下命令可以让之现行:

      #netstat -nap | grep SYN_RECV

四、四次挥手

    所谓四次挥手就是终止TCP连接, 就是要断开一个TCP连接时, 需要客户端和服务器总共进行四次交互。在socket编程中, 这个

  执行过程由客户端或者服务器任意一方执行close来触发, 下面是断开流程图:

    

    由于TCP连接时全双工的, 因此, 每个方向都必须要单独进行关闭, 这一原则是当一方完成数据发送任务后, 发送一个FIN来终止

  这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了, 即不会再收到数据了, 但是在这个TCP连接上仍然能够发送数

  据,直到这一方向也发送了FIN. 首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。

  (1) 第一次挥手: Client发送一个FIN, 用来关闭Client 到 Server的数据传输, Client进入FIN_WAIT_1状态

  (2) 第二次挥手: Server收到FIN后, 发送一个ACK给Client, 确认序号为收到的序号+1(与SYN相同, 一个FIN占用一个序号),

          Server进入CLOSE_WAIT状态

  (3) 第三次挥手: Server发送一个FIN后, 用来关闭Server到Client的数据传输, Server进入LAST_ACK状态

  (4) 第四次挥手: Client收到FIN后, Client进入TIME_WAIT状态, 接着发送一个ACK给Server, 确认序号为收到序号+1, Server

          进入CLOSED状态, 完成四次挥手

四、状态

  SYN_SENT状态:

      当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,因此也随即它会进入到了SYN_SENT状态,并等待服务

    端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文. (发送端)

  SYN_RCVD状态:  这个状态与SYN_SENT相呼应这个状态表示接受到了SYN报文.

  ESTABLISHED:  表示连接已经建立了.

  CLOSE_WAIT状态:

      发起TCP连接关闭的一方称为client,被动关闭的一方称为server. 被动关闭的server收到FIN后, 但未发出ACK的TCP状态

  是CLOSE_WAIT. 出现这种状况一般都是由于server端代码的问题, 如果你的服务器上出现大量CLOSE_WAIT, 应该要考虑检查代码.

  TIME_WAIT状态:

     表示收到了对方的FIN报文, 并发送出ACK报文, 就等2MSL后即可回到CLOSED可用状态.

  LAST_ACK:

     表示被关闭的一方在发送FIN报文后, 最后等待对方的ACK报文. 当收到ACK报文后, 也即可以进入到CLOSED状态了.

  CLOSED: 表示连接中断.

五、总结

  关于三次握手与四次挥手通常都会有典型的面试题:

  (1) 三次握手是什么或者流程? 四次握手呢? 答案前面分析就是.

  (2) 为什么连接时是三次握手, 而关闭连接却是四次挥手?

    这是因为服务端在LISTEN状态下, 收到建立连接请求的SYN报文后, 把ACK和SYN放在一个报文里发送给客户端. 而关闭连接时,

  当收到对方的FIN报文时, 仅仅表示对方不在发送数据了, 但是还能接收数据, 己方也未必全部数据都发送对方了, 所以己方可以立即

  close, 也可以发送一些数据给对方后, 再发送FIN报文给对方来表示同意现在关闭连接, 因此, 己方ACK和FIN一般都会分开发送。

参考文章:

  http://blog.csdn.net/xifeijian/article/details/12777187

  http://www.cnblogs.com/Jessy/p/3535612.html    

  http://blog.csdn.net/renzhenhuai/article/details/12105457

http://www.cnblogs.com/jiangson/p/5980681.html

真的懂了:TCP协议中的三次握手和四次挥手(关闭连接时, 当收到对方的FIN报文时, 仅仅表示对方不在发送数据了, 但是还能接收数据, 己方也未必全部数据都发送对方了。相当于一开始还没接上话不要紧,后来接上话以后得让人把话讲完)的更多相关文章

  1. TCP协议中的三次握手和四次挥手(图解)【转】

    建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. [更新于2017.01.04 ]该部分内容配图有误,请大家见谅,正确的配图如下,错误配图也不删 ...

  2. python网络编程-TCP协议中的三次握手和四次挥手(图解)

    建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资 ...

  3. TCP协议中的三次握手和四次挥手(图解)

    建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资 ...

  4. [转]TCP协议中的三次握手和四次挥手(图解)

    本文转自:http://blog.csdn.net/whuslei/article/details/6667471 建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来 ...

  5. 【转】 TCP协议中的三次握手和四次挥手(图解)

    建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资 ...

  6. TCP协议中的三次握手和四次挥手(图解)(转载http://blog.csdn.net/whuslei/article/details/6667471)

    建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源 ...

  7. TCP协议中的三次握手和四次挥手(图解) 转载

    建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资 ...

  8. 图解:TCP协议中的三次握手和四次挥手

    建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资 ...

  9. TCP协议中的三次握手和四次挥手(图解)【转载】

    建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资 ...

随机推荐

  1. NoSql中的B-tree、B+tree和LSM-tree 分类: B7_HBASE 2015-03-15 18:27 85人阅读 评论(0) 收藏

    总结: 1.B+树将数据完全排序,读数据时很快,但当要修改数据时,就需要将新入数据下面的数据重新排位,特别是当写入的数据排在较高的位置时,需要大量的移位操作才能完成写入. 2.SLM牺牲部分的读性能, ...

  2. Mongodb in Mycat指南

    1       前言 Mycat目前支持JDBC连接后端数据库,理论上支持任何数据库,如ORACLE.DB2.SQL Server等,是将其模拟为MySQL,所以对其他数据库只支持标准的SQL语句,而 ...

  3. markdown + vim

    https://www.jianshu.com/p/24aefcd4ca93https://github.com/isnowfy/python-vim-instant-markdownhttps:// ...

  4. [Angular] Using NO_ERRORS_SCHEMA

    For example, when testing container component we might import lots of children components, but we di ...

  5. 如何解决安卓SDK无法下载Package的问题 分类: H1_ANDROID 2013-09-09 10:26 1199人阅读 评论(0) 收藏

    转载自:http://jingyan.baidu.com/article/8275fc86dbe84046a03cf69d.html 有些用户在安装好Android SDK后,打开Android SD ...

  6. php实现找两个链表的第一个公共结点(实例演示)

    php实现找两个链表的第一个公共结点(实例演示) 一.总结 因为是链表,第一个节点公共之后,后面所有的节点都公共了 画个图实例演示一下,会超清晰且简单 二.php实现找两个链表的第一个公共结点 题目描 ...

  7. [Docker] Build Your Own Custom Docker Image

    In this lesson we will cover how to build your own custom Docker image from scratch. We'll walk thro ...

  8. [GraphQL] Create an Input Object Type for Complex Mutations

    When we have certain mutations that require more complex input parameters, we can leverage the Input ...

  9. Make chrome extension

    How to Make a Chrome Extension. https://robots.thoughtbot.com/how-to-make-a-chrome-extension Skip to ...

  10. arcengine 开发经典帖 【强烈推荐仔细研读】

    转自原文 arcengine 开发经典帖 使用ArcGIS Engine 开发自定义GIS应用: 第一部分:使用ArcGIS Engine 发布自定义GIS应用软件-全面了解ArcGIS Engine ...