一、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. RISC-V评估系列

    RISC-V评估系列 RISC-V工具链搭建 SiFive虚拟机分享--提取码:xe1c SiFive SDK函数结构 底层驱动 driver框架 操作系统FreeRTOS移植 FGPA评估 benc ...

  2. [NodeJS] Use Now alias for custom sub-domains

    Now is a great way to deploy your node application, but the generated URLs aren't memorable or easil ...

  3. u3d demo起步第二章

    假设要给一个角色加入寻路组件.那么仅仅须要选中这个角色,Component->Navigation->Nav Mesh Agent就能够加入寻路组件. 然后仅仅要agent.SetDest ...

  4. js实现点击不同的按钮后各自返回被点击的次数

    js实现点击不同的按钮后各自返回被点击的次数 一.总结 1.注意:返回的不是三个按钮总的点击数,而是每一个的 2.用全局变量的话每一个按钮要多一个函数,用闭包就很方便 二.js实现点击不同的按钮后各自 ...

  5. 【76.57%】【codeforces 721A】One-dimensional Japanese Crossword

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  6. 【45.65%】【codeforces 560B】Gerald is into Art

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  7. 《从零開始学Swift》学习笔记(Day 1)——我的第一行Swift代码

     Swift 2.0学习笔记--我的第一行Swift代码 原创文章,欢迎转载. 转载请注明:关东升的博客 当第一次看到以下代码时我石化了.这些代码是什么东东?单词拼出来的? import Foun ...

  8. 逐步把Nginx及Redis引入项目组之负载均衡技术调研初版总结

    本篇以一个Nginx服务.两个Tomcat服务.一个Redis搭建一个负载均衡环境,由于就一台电脑暂以随机分配client请求策略开展,详细工作中推荐以IP地址来实现client请求的动态负载策略.省 ...

  9. java中的subString具体解释及应用

    substring(參数)是java中截取字符串的一个方法 有两种传參方式 一种是public String substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个 ...

  10. ReentrantLock Condition await signal 专题

    Condition的执行方式,是当在线程T1中调用await方法后,线程T1将释放锁,并且将自己阻塞,等待唤醒, 线程T2获取到锁后,开始做事,完毕后,调用Condition的signal方法,唤醒线 ...