TCP/IP简介:

TCP/IP 是不同的通信协议的大集合。

是指能够在多个不同网络间实现信息传输的协议族。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议族, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。

TCP/IP协议参考ISO,OSI模型共有七层,但在TCP/IP协议中,它们被简化为了四个层次。如图:

三次握手建立连接

三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。

进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。

图中字符的含义:

SYN:连接请求/接收 报文段

seq:发送的第一个字节的序号

ACK:确认报文段

ack:确认好,希望收到的下一个数据的第一个字节的序号

TCP协议中,主动发起请求的一端称为客户端,被动连接的一端称为服务端。不管是客户端还是服务端,TCP连接建立完后都能发送和接收数据。

刚开始的时候,服务器和客户端都为CLOSED状态。在通信开始前,双方都得创建各自的传输控制块(TCB)。服务器创建完TCB后便进入LISTEN状态,此时准备接收客户端发来的连接请求。

1、第一次握手:

客户端向服务端发送一个 SYN 报文(SYN = 1),并指明客户端的初始化序列号 ISN(x),即图中的 seq = x,表示本报文段所发送的数据的第一个字节的序号。请求发送后,客户端进入SYN_SENT 状态。

 SYN-SENT:在发送连接请求后等待匹配的连接请求

 SYN=1,ACK=0表示该报文段为连接请求报文

 x为本次TCP通信的字节流的初始序号

 TCP规定:SYN=1的报文段不能有数据部分,但要消耗掉一个序号

2、第二次握手:

服务器收到客户端的 SYN 报文之后,会发送 SYN 报文作为应答(SYN = 1),并且指定自己的初始化序列号 ISN(y),即图中的 seq = y。同时会把客户端的 ISN + 1 作为确认号 ack 的值,表示已经收到了客户端发来的的 SYN 报文,希望收到的下一个数据的第一个字节的序号是 x + 1,此时服务器进入 SYN-RCVD 的状态。

SYN-RCVD:在收到和发送一个连接请求后等待对连接请求的确认

 SYN=1,ACK=1表示该报文段为连接同意的应答报文

 seq=y表示服务端作为发送者时,发送字节流中的第一个字节序号

 ack=x+1表示服务端希望客户端发送的下一个数据报初始序号是从x+1开始

3、第三次握手:

客户端收到服务器端响应的 SYN 报文之后,会发送一个 ACK 报文,把服务器的 ISN + 1 作为 ack 的值,表示已经收到了服务端发来的的 SYN 报文,希望收到的下一个数据的第一个字节的序号是 y + 1,并指明此时客户端的序列号 seq = x + 1(初始为 seq = x,所以第二个报文段要 +1),此时客户端进入 ESTABLISHED状态。服务器收到 ACK 报文之后,也进入ESTABLISHED状态,此时双方连接的建立完成。

ESTABLISHED:代表一个打开的连接,数据可以传送给用户

四次挥手连接释放

TCP 的连接的拆除需要发送四个包,因此称为四次挥手(Four-way handshake),客户端或服务器均可主动发起挥手动作。

TCP连接是双向的,在四次挥手中,前两次挥手用于断开一个方向的连接,后两次挥手用于断开另一方向的连接。

1、第一次挥手

客户端发送一个 FIN 报文(请求连接终止:FIN = 1),报文中会指定一个序列号 seq = u。并停止再发送数据,主动关闭 TCP 连接。此时客户端进入 FIN_WAIT_1 状态,等待服务端的确认。

 FIN-WAIT-1 :等待远程TCP的连接中断请求,或先前的连接中断请求的确认

 FIN=1表示该报文段是一个连接释放请求

 seq=u,u-1是客户端向服务端发送的最后一个字节的序号

2、第二次挥手

服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序号值 +1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端进入 CLOSE_WAIT状态。

 CLOSE_WAIT :等待从本地用户发来的连接中断请求

 ACK=1:除TCP连接请求报文段以外,TCP通信过程中所有数据报的ACK都为1,表示应答

 seq=v,v是服务端释放应答报文段第一个字节序号

 ack=u+1表示希望收到从第u+1个字节开始的报文段,并且已经成功接收了前u个字节

第二次挥手完成后,客户端到服务端方向的连接已经释放,服务端不会再接收客户端的数据,客户端也没有数据要发送了。但服务端到客户端方向的连接仍然存在,服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。

3、第三次挥手

服务端将最后的数据发送完毕后,就向客户端发送连接释放报文,其报文头包含:FIN=1,ack=u+1,由于在CLOS-WAIT状态,服务端很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器进入LAST-ACK状态。

LAST_ACK : 等待原来发向远程TCP的连接中断请求的确认

4、第四次挥手

客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答(ack = w+1),且把服务端的序列值 +1 作为自己 ACK 报文的序号值(seq=u+1),此时客户端进入TIME_WAIT状态。

 TIME_WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认

该状态会持续2MSL(最长报文段寿命)时间,这个期间TCP连接还未释放,若该时间段内没有服务端的重发请求的话,客户端就进入CLOSED状态,撤销TCB。

服务端只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

常见问题:

1、TCP建立连接为什么是三次握手,而不是两次或四次?

两次握手会将已失效的连接请求报文段再次传送到服务端,会造成服务端资源的浪费。

三次握手已经能说明握手时的通信是正常的,四次握手就显得浪费了。

2、TCP关闭连接时为什么是四次挥手?

由于 TCP 的半关闭(half-close)特性,TCP 提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。

任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接。

3、为什么TIME_WAIT状态需要经过2MSL才能返回到CLOSE状态?

 1.为了保证服务端能收到客户端的确认应答。

若客户端发完确认应答后直接进入CLOSED状态,那么如果该应答丢失,服务端等待超时后就会重新发送连接释放请求,但此时客户端已经关闭了,不会作出任何响应,因此服务端就无法正常关闭。

2.防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。

客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。


福利

​TCP/IP协议三次握手和四次挥手相关推荐

  1. 白话解说TCP/IP协议三次握手和四次挥手

    白话解说TCP/IP协议三次握手和四次挥手 1.背景 和女朋友异地恋一年多,为了保持感情我提议每天晚上视频聊天一次. 从好上开始,到现在,一年多也算坚持下来了. 1.1.问题 有时候聊天的过程中,我的 ...

  2. 【计算机网络面试】tcp/ip协议三次握手、四次挥手

    TCP报文格式 TCP 报文是 TCP 层传输的数据单元,也称为报文段.TCP 报文中每个字段如图所示. 上图中 TCP 报文中每个字段的含义如下: 源端口和目的端口字段 TCP源端口(Source ...

  3. TCP/IP协议三次握手与四次握手流程解析

    原文链接地址:http://www.2cto.com/net/201310/251896.html TCP/IP协议三次握手与四次握手流程解析 TCP/IP协议的详细信息参看<TCP/IP协议详 ...

  4. 通俗理解TCP/IP协议三次握手与四次分手流程

    三次握手流程 客户端发个请求"开门呐,我要进来"给服务器 服务器发个"进来吧,我去给你开门"给客户端 客户端有很客气的发个"谢谢,我要进来了" ...

  5. Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手)...

    Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手) 一丶CS/BS 架构 C/S: 客户端/服务器 定义:       这里 ...

  6. python网络通信效率_Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手)...

    Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手) 一丶CS/BS 架构 C/S: 客户端/服务器 定义: 这里的客户端一般 ...

  7. 通俗易懂理解TCP协议三次握手和四次挥手及其常见问题

    TCP协议三次握手和四次挥手 三次握手 如果建立连接只需要2次握手,可能会出现的情况 四次挥手 为什么建立连接是三次握手,关闭连接确是四次挥手呢? TIME_WAIT状态有什么作用,为什么主动关闭方没 ...

  8. TCP协议“三次握手“和“四次挥手“

    TCP协议三次握手和四次挥手 为了使数据的传输更为安全,在OSI七层架构的传输层(TCP)定义了需要建立稳定的连接提供安全的交互环境,而三次握手解决了连接的建立. 三次握手过程: 第一次:客户端向服务 ...

  9. TCP 连接的“ 三次握手 ”与“ 四次挥手 ”

    TCP 协议简介 TCP 是互联网核心协议之一,本文介绍它的基础知识. 一.TCP 协议的作用 互联网由一整套协议构成.TCP 只是其中的一层,有着自己的分工. (图片说明:TCP 是以太网协议和 I ...

最新文章

  1. python使用fpdf创建pdf并写入hello world
  2. svn 1.8.11 命令行提交新添加文件错误
  3. Python模块的四种形式
  4. java udp传输文件_JAVA使用UDP收发文件
  5. 家有路由器,为什么会出现网络拒绝接入而无法上网的情况呢?
  6. PureMVC--一款多平台MVC框架
  7. Android启动页欢迎界面大全 (网址)
  8. 原来编译通过,现在编译不通过,怎么回事?
  9. 百度文库免积分免费下载工具的原理与实现
  10. 实验七 数据选择器和译码器的应用
  11. R语言生存分析之竞争风险模型
  12. 马尔可夫(Markov)不等式
  13. SQL BETWEEN AND 用法
  14. Android 接口测方法
  15. WIFI营销读书笔记之二:跑马圈地
  16. java 泰文的编码_Unicode字符编码表(转)
  17. Excel隔行插入空白行小技巧
  18. [敏捷开发培训] 构建Agile MVP
  19. java 消息总线 框架_JavaWeb 消息总线框架 Saka V0.0.1 发布
  20. 华为10误删照片怎么才能恢复回来?

热门文章

  1. 两个无线路由器用网线连接
  2. html段落取消首行缩进,HTML段落首行缩进
  3. DataGrip安装时遇到的几个坑:“算机中丢失api-ms-win-crt-stdio-l1-1-0.dll“、“Failed to load JVM DLL\bin\server\jvm.dll“
  4. 软件测试常见断言,断言神器AssertJ快速入门
  5. 如何提高小学生的课堂注意力?
  6. 目标检测YOLO实战应用案例100讲-复杂背景下的红外弱小目标检测方法研究
  7. (3)HDFS原理与高可用技术原理介绍
  8. vue 字符串内容格式化显示并添加序号
  9. 汉子在计算机中采用什么字节表示,汉字在计算机中的表示
  10. Spring Data JPA是什么?以及简单的使用(联表查询)