TCP的3次握手和4次挥手

标签(空格分隔): 找工作


TCP Flags:

TCP首部中有6个标志比特,主要用于操控TCP的状态机的,依次为URG, ACK, PSH, RST, SYN, FIN,每个标志位的含义如下:

  • URG:此标志表示TCP包的紧急指针域有效,用来保证TCP连接不被终端,并且督促中间层设备要尽快处理这些数据;
  • ACK:此标志表示应答有效,1的时候表示应答有效,反之为0;
  • PSH:此标志位表示Push操作。就是说数据包到达接收端以后,立即传送给应用程序,而不是在缓冲区中排队;
  • RST:此标志位表示复位请求。用来复位那些产生错误的连接,也用来拒绝错误和非法的数据包;
  • SYN:表示同步序号,用来建立连接。SYN与ACK搭配使用,
  • 当连接请求的时候,SYN=1,ACK=0;
  • 当连接被响应的时候,SYN=1,ACK=1;
  • FIN:表示发送端已经达到数据末尾,也就是双方的数据传送完成,没有数据可以传送了。

3次握手

TCP四面向连接的,双方在发送数据之前要先建立一个可靠的连接。三次握手的目的是同步连接双方的序列号和确认号并交换TCP窗口大小信息。

  1. 第一次握手:建立连接。客户端发送请求报文段,SYN=1,Sequence Number为x;然后客户端进入SYN_SEND状态,等待服务器确认;
  2. 第二次握手:服务器收到SYN报文段,需要对这个报文段进行确认,设置Acknowledge Number为x+1;同时自己也要打出SYN请求信息,SYN=1,Sequence Number设为y,服务器进入SYN_RECV状态;
  3. 第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledge Number设为y+1,并发送Ack报文段,这个报文段发送以后,客户端和服务器都进入ESTABLISHED状态,完成了TCP的三次握手。

为什么要3次握手?

防止已失效的连接请求报文段突然又传送到了服务端,产生错误。
什么意思呢?
设想这样一种情况:client发出的第一个请求报文段并没有丢失,而是在网络中滞留了,以致于延误到连接释放以后的某个时间才到达server。本来这是一个早已经失效的请求,但server收到以后误以为是client又心法了一个连接请求,就会同意连接,发送ack确认报文,这时:

  • 如果是2次握手,这样client和server之间就建立起了一条信道,并一直等待client发送数据过来,server就会浪费很多资源;
  • 而如果是3次握手,client收到server发送的对自己已经失效的报文段的ack确认报文,边不予理睬。server由于没有收到确认,就知道client并没有请求建立连接了。
    所以,3次握手的目的就是,为了防止server一直等待而浪费资源。

4次挥手

当客户端和服务器数据传送完毕后,肯定要断开他们之间的连接,而断开连接时需要4次挥手:

  1. 第一次挥手:客户端设置Sequence Number和Acknowledge Number,并向服务器发送一个FIN报文段,这是,客户端进入FIN_WAIT_1状态,表示客户端没有数据要发送给服务器了;
  2. 第二次挥手:服务器收到了客户端发来的FIN报文段,向客户端发送一个ACK(Seq+1)报文段,客户端进入FIN_WAIT_2状态,也就是服务器同意客户端的关闭请求;
  3. 第三次挥手:服务器向客户端发送FIN报文段,请求关闭连接,同时服务器进入CLOSE_WAIT状态;
  4. 第四次挥手:客户端收到服务器发送的FIN报文段,向服务器发送ACK报文段,然后客户端进如TIME_WAIT状态;服务器收到客户端发来的ACK报文段之后,就关闭连接;此时,客户端等待2MSL后依然没有收到回复,则证明服务器已正常关闭,所以客户端也可以关闭连接了。

TCP是全双工模式,当客户端发出FIN报文段时,只是表示客户端没有数据要发送了,所以客户端向服务器发送FIN,告诉服务器它的数据已经全部发送完了;但这个时候客户端还是可以接收来自服务器的数据;
当服务器返回ACK报文段时,表示它已经知道客户端没有数据发送了,但服务器还是可以向客户端发送数据的;
当服务器发送FIN给客户端时,表示服务器也没有数据要发送了,之后客户端收到服务器的FIN报文段时也会返回ACK报文段,结束这次传输。

为什么要4次挥手?

  • FIN_WAIT_1:当SOCKET在ESTABLISHED状态时,它想主动关闭连接,想对方发送了FIN请求,于是该SOCKET进入FIN_WAIT_1状态;
  • FIN_WAIT_2:当收到对方回应的ACK报文段时,就会进入到FIN_WAIT_2状态。该状态下的SOCKET表示半连接,即有以防要求close连接。但另外还告诉主动方,我这边还有一点数据要发送,稍后再关闭连接。
  • CLOSE_WAIT:等待关闭。当主动方发送一个FIN报文段过来时,被动方毫无疑问要发送一个ACK确认报文段,被动方就进入到CLOSE_WAIT状态。然后看自己是否还有数据要发送,如果也没有数据了,则也可以发送FIN报文段给主动方,关闭连接;
  • LAST_ACK:指被动方发送了FIN报文段之后,等待对方的ACK时的状态;
  • TIME_WAIT:表示收到了对方的FIN报文段,并发出了ACK报文,等待2MSL后就可以回到CLOSED状态了。

[参考链接][http://www.jellythink.com/archives/705]2

TCP的3次握手和4次挥手的更多相关文章

  1. TCP的三次握手与四次挥手

    TCP的三次握手与四次挥手 一.TCP(Transmission Control Protocol 传输控制协议) TCP是面向对连接,可靠的进程到进程通信的协议 TCP是提供全双工服务,即数据可在同 ...

  2. 你应该这么理解TCP的三次握手和四次挥手

    前言: TCP协议是计算机的基础,他本身是一个非常非常复杂的协议. 本文只是蜻蜓点水,将从网络基础以及TCP的相关概念介绍开始,之后再将三次握手,四次挥手这些内容来阐述. 最后介绍一些常见问题,并给出 ...

  3. tcp/ip 3次握手和4次挥手

    tcp/ip 3次握手和4次挥手

  4. TCP/IP三次握手与四次挥手的正确姿势

    0.史上最容易理解的:TCP三次握手,四次挥手 https://cloud.tencent.com/developer/news/257281 A 理解TCP/IP三次握手与四次挥手的正确姿势http ...

  5. TCP的三次握手与四次挥手详解

    TCP的三次握手与四次挥手是TCP创建连接和关闭连接的核心流程,我们就从一个TCP结构图开始探究中的奥秘  序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序 ...

  6. 【图解】给面试官解释TCP的三次握手与四次挥手-Web运用原理及网络基础

    作者 | Jeskson 来源 | 达达前端小酒馆 轻松了解HTTP协议 为什么要学习网络协议呢?为什么要学习计算机完了呢?显然这很重要,至少能够帮助你找到工作的原因之一,学习网络知识点太多太多,没有 ...

  7. TCP的三次握手与四次挥手笔记

    TCP的三次握手与四次挥手笔记 TCP Flags URG: 紧急指针标志 ACK:确认序号标志 PSH:push标志 RST:重置连接标志 SYN:同步序号,用于建立连接过程 FIN: finish ...

  8. TCP的三次握手与四次挥手理解及面试题

    TCP的三次握手与四次挥手理解及面试题(很全面) 转载自:https://blog.csdn.net/qq_38950316/article/details/81087809 本文经过借鉴书籍资料.他 ...

  9. TCP 的三次握手和四次挥手

    参考资料: 1.TCP的三次握手与四次挥手理解及面试题: 2.Http协议三次握手和四次挥手: 3.TCP通信的三次握手和四次撒手的详细流程(顿悟) 前置: 序号(也称序列号) - Sequence ...

随机推荐

  1. android环境搭建——工欲善其事,必先利其器 2

    前两天鼓捣android, 搭建环境,不想麻烦就用了  adt-bundle-windows-x86-20140702. rar , 起个模拟器哇塞,太爽了. 出去转一圈唠会回来正好启动成功!有个网友 ...

  2. 《zw版·delphi与halcon系列原创教程》zw版_THImagex控件函数列表

    <zw版·delphi与halcon系列原创教程>zw版_THImagex控件函数列表 Halcon虽然庞大,光HALCONXLib_TLB.pas文件,源码就要7w多行,但核心控件就是两 ...

  3. enum与typedef enum的用法

    一,两者的用法 枚举类型定义用关键字enum标识,形式为: enum 标识符 { 枚举数据表 }:枚举数据(枚举常量)是一些特定的标识符,标识符代表什么含义,完全由程序员决定.数据枚举的顺序规定了枚举 ...

  4. hadoop自带例子wordcount的具体运行步骤

    1.在hadoop所在目录“usr/local”下创建一个文件夹input root@ubuntu:/usr/local# mkdir input 2.在文件夹input中创建两个文本文件file1. ...

  5. python字符串列表字典相互转换

    字符串转换成字典 json越来越流行,通过python获取到json格式的字符串后,可以通过eval函数转换成dict格式: >>> a='{"name":&qu ...

  6. python logging 替代print 输出内容到控制台和重定向到文件

    转自:http://blog.csdn.net/z_johnny/article/details/50740528

  7. 161103、Spring Boot 入门

    Spring Boot 入门 spring Boot是Spring社区较新的一个项目.该项目的目的是帮助开发者更容易的创建基于Spring的应用程序和服务,让更多人的人更快的对Spring进行入门体验 ...

  8. 161019、并发容器ConcurrentHashMap

    java.util.concurrent.ConcurrentMap<K, V>一种是用读写锁实现Map的方法.此种方法看起来可以实现Map响应的功能,而且吞吐量也应该不错.但是通过前面对 ...

  9. webpack笔记_(3)_First_Project

    知道了怎么样安装,那么学习一下简单的应用吧. 1.安装webpack npm install webpack -g (全局) npm install webpack --save--dev (本地) ...

  10. zabbix如何实现微信报警 转载

    现实生产环境中,我们通常使用邮件和短信接受zabbix报警信息,但是邮件经常被工作人员搁置在角落中甚至被设置为垃圾邮件被过滤掉.公司的短信接口又太贵,复杂环境中使用短息报警会使运维成本增加很多.微信提 ...