1.什么是TCP

TCP全称Transmission Control Protocol(传输控制协议),是一种面向连接的、可靠的、基于字节流的传输层通信协议。是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。

关键信息:

   1)面向连接

   2)可靠的

   3)基于字节流

   4)传输层协议

   5)端到端

TCP的三次握手和四次挥手是分别发生在建立连接和断开连接的过程中。

2.为什么需要三次握手

前面我们提到说TCP是面向连接的,那么显然通信的双方如果想进行对话(数据交互)首先需要“建立连接”。那么问题来了,如何确认通信双方是否建立连接了呢?TCP“三次握手”开始登场了。

请欣赏如下TCP三次握手经典图例:(客户端请求服务端获取数据)

1.第一次握手:客户端首先向服务端发送请求,tcp报文头中发送标识SYN=1(SYN表示客户端请求跟服务端建立连接),序号Seq=x。

2.第二次握手:服务端在接收到客户端发送的请求之后,需要告诉客户端已收到请求,tcp报文头中发送标识SYN=1,ACK=1(SYN表示服务端请求跟客户端建立连接,ACK表示对客户端的连接请求进行应答),序号Seq=y,确认号=x+1(表示对客户端发送的序号Seq=x的请求进行确认)。

3.第三次握手:客户端在接收到服务端发送的请求和确认信息之后,同样需要告诉服务端已收到信息,tcp报文头中发送标识ACK=1(ACK表示对服务端的连接请求进行应答),序号Seq=x+1,确认号Ack=y+1(表示对服务端发送的序号Seq=y的请求进行确认)

当三次握手都成功的时候,我们发现此时客户端发送的信息服务端能够收到并且服务端发送的信息客户端也能收到,通信双方连接成功

这里我们要注意以下两点:

1、图中的发送请求中的发送标识SYN、ACK表示的是发送报文中两个标识位!而Seq和Ack分别代表发送序号和确认号。

2、服务端在接收到了客户端的连接请求后,回复中同时发送了SYN、ACK两个标识位,将建立连接的请求和对客户端的确认应答在同一个数据包中发送了,这也是为什么只需要三次握手,就能建立连接。

WireShark工具抓包演示效果:

3.为什么需要四次挥手

当客户端和服务端之间的数据传输完毕之后,我们就需要释放连接(一直建立连接会浪费资源),那为啥需要四次挥手呢?下面我们结合四次挥手经典图例一起分析下:

 1.第一次挥手:客户端向服务端发送断开连接的请求,告诉服务端我这边不需要再请求你的数据了,tcp报文头中发送标识FIN=1(表示客户端请求跟服务端断开连接),序号Seq=u

 2.第二次挥手:服务端在接收到客户端发送的断开请求后,需告诉客户端已收到请求,tcp报文头中发送标识ACK=1(ACK表示对客户端的断开连接的请求进行应答),序号Seq=v,确认号Ack=u+1(表示对客户端发送的序号Seq=u的请求进行确认)。

 3.第三次挥手:当服务端数据传输完毕之后,向客户端发起断开连接的请求,告诉客户端我这边也不需要再发送数据了,tcp报文头中发送标识FIN=1,ACK=1(FIN表示服务端请求跟客户端断开连接,ACK表示对上一次客户端的断开连接的请求进行应答),序号Seq=w,确认号Ack=u+1(表示对客户端发送的序号Seq=u的请求进行确认)

 4.第四次挥手:客户端接收到服务发送的断开连接请求后,需告诉服务端已收到信息,作出应答,tcp报文头中发送标识ACK=1(ACK表示对服务端的断开连接的请求进行应答),序号Seq=u+1,确认号Ack=w+1(表示对服务端发送的序号Seq=w的请求进行确认)

我想说到这里大家都会有几个疑问

1、第二次挥手的时候。为什么不能像握手的时候一样,服务端对客户端断开连接的请求做确认应答的时候,同时向客户端发送断开连接的请求。这样“三次挥手”不就可以了么???

解答:在实际的网络中,服务端在接收到客户端断开连接的请求的时候,此时服务端可能还有数据没有传输完毕,不能立即向客户端发送断开连接的请求!所以当客户端主动发起断开请求的时候,服务器先回应一个确认,等所有数据传输完毕后再发送服务器断开的请求。

2、在图中我们能看到,客户端的TIME_WAIT状态会持续2MSL再变成CLOSED,MSL(Maximum Segment Lifetime)的中文可以译为“报文最大生存时间”!它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。那这里为什么需要维持2MSL呢?

解答:第4次挥手的时候客户端向服务端发送断开连接的请求的确认ACK,如果客户端发送完成后就直接就关闭连接,如果由于网络原因服务端没有收到ACK,那服务端就没法关闭连接了!因此客户端在回复确认后,还需要等待,万一服务端没有收到应答还会继续发送断开连接的请求;

4.TCP是如何保证可靠传输的

前面我们还说到TCP是可靠的,TCP为了保证报文传输的可靠,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。

简单来说,TCP通过这种通信双方相互应答确认超时重传的机制来保证传输的可靠性。

感兴趣的同学可以多了解了解,每天丰富自己一点点。

简单说说TCP三次握手、四次挥手机制的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. TCP三次握手四次挥手

    看到一篇总结很好的TCP三次握手,学习一下,原文链接. 建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,S ...

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

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

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

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

  9. 转---tcp三次握手四次挥手syn fin......

    http://blog.chinaunix.net/uid-22312037-id-3575121.html转自 一.TCP报文格式        TCP/IP协议的详细信息参看<TCP/IP协 ...

  10. TCP三次握手四次挥手详解2

    相对应socket开发者,TCP创建过程和连接拆除过程是由TCP/IP协议栈自动创建的,因此开发者并不需要控制这个过程,但是对于理解TCP底层运作机制,相当有帮助 TCP三次握手 所谓三次握手,是指建 ...

随机推荐

  1. Python内置OS模块用法详解

    大家好,从今天起早起Python将持续更新由小甜同学从初学者的角度学习Python的笔记,其特点就是全文大多由新手易理解的代码与注释及动态演示.刚入门的读者千万不要错过! 很多人学习python,不知 ...

  2. Codechef June Challenge 2020 Division 1 记录

    目录 The Tom and Jerry Game! Operations on a Tuple The Delicious Cake Convenient Airports Guessing Gam ...

  3. 谈谈对Java平台的理解

    从我第一次接触Java的时候,老师就说"Write once,run anywhere",这句话虽然听起来有一点太过于形式主义,但是也突出了它的特点.那么,现在的我们应该总结一下和 ...

  4. 2020-04-06:insert语句在mysql里经历了什么?

    1.会话状态转换为update 2.激活事物状态由 not_active 变为 active 3.查找定位数据 4.进行乐观插入 记录insert的undo记录记录undo的redo log 入red ...

  5. 运用sklearn进行主成分分析(PCA)代码实现

    基于sklearn的主成分分析代码实现 一.前言及回顾 二.sklearn的PCA类介绍 三.分类结果区域可视化函数 四.10行代码完成葡萄酒数据集分类 五.完整代码 六.总结 基于sklearn的主 ...

  6. windows下mongoDB的下载和安装

    1.进入mongoDB官网,官网地址:https://www.mongodb.com 2.  点击Try free按钮,进入下载页面 3.点击download进行下载:下载完成如下图: 4.点击下载的 ...

  7. WKWebView 网络请求Header 丢失

    WKWebView 是苹果手机上主要的H5加载控件,它相比UIWebView 有诸多优势.在次不做比较,但是它的坑缺比较多.网上也有很多的例子但是做的比较好的真不多,我在这里推荐俩博客供大家参考.ht ...

  8. Wireshark中遇到的epoch time

    使用Wireshark分析DNS时遇到的Epoch time 首先看一下Wireshark分析DNS的情况(如下图): 这是协议树的第一项,第一项中的第五行出现了Epoch Time,查阅资料之后才知 ...

  9. Android Studio gridview 控件使用自定义Adapter, 九宫格items自适应全屏显示

    先看效果图,类似于支付宝首页的效果.由于九宫格显示的帖子网上已经很多,但是像这样九宫格全屏显示的例子还不是太多.本实例的需求是九宫格全屏显示,每个子view的高度是根据全屏高度三等分之后自适应高度,每 ...

  10. 用Python的Pandas和Matplotlib绘制股票唐奇安通道,布林带通道和鳄鱼组线

    我最近出了一本书,<基于股票大数据分析的Python入门实战 视频教学版>,京东链接:https://item.jd.com/69241653952.html,在其中给出了MACD,KDJ ...