TCP的3次握手和4次挥手
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窗口大小信息。
- 第一次握手:建立连接。客户端发送请求报文段,SYN=1,Sequence Number为x;然后客户端进入SYN_SEND状态,等待服务器确认;
- 第二次握手:服务器收到SYN报文段,需要对这个报文段进行确认,设置Acknowledge Number为x+1;同时自己也要打出SYN请求信息,SYN=1,Sequence Number设为y,服务器进入SYN_RECV状态;
- 第三次握手:客户端收到服务器的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次挥手:
- 第一次挥手:客户端设置Sequence Number和Acknowledge Number,并向服务器发送一个FIN报文段,这是,客户端进入FIN_WAIT_1状态,表示客户端没有数据要发送给服务器了;
- 第二次挥手:服务器收到了客户端发来的FIN报文段,向客户端发送一个ACK(Seq+1)报文段,客户端进入FIN_WAIT_2状态,也就是服务器同意客户端的关闭请求;
- 第三次挥手:服务器向客户端发送FIN报文段,请求关闭连接,同时服务器进入CLOSE_WAIT状态;
- 第四次挥手:客户端收到服务器发送的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次挥手的更多相关文章
- TCP的三次握手与四次挥手
TCP的三次握手与四次挥手 一.TCP(Transmission Control Protocol 传输控制协议) TCP是面向对连接,可靠的进程到进程通信的协议 TCP是提供全双工服务,即数据可在同 ...
- 你应该这么理解TCP的三次握手和四次挥手
前言: TCP协议是计算机的基础,他本身是一个非常非常复杂的协议. 本文只是蜻蜓点水,将从网络基础以及TCP的相关概念介绍开始,之后再将三次握手,四次挥手这些内容来阐述. 最后介绍一些常见问题,并给出 ...
- tcp/ip 3次握手和4次挥手
tcp/ip 3次握手和4次挥手
- TCP/IP三次握手与四次挥手的正确姿势
0.史上最容易理解的:TCP三次握手,四次挥手 https://cloud.tencent.com/developer/news/257281 A 理解TCP/IP三次握手与四次挥手的正确姿势http ...
- TCP的三次握手与四次挥手详解
TCP的三次握手与四次挥手是TCP创建连接和关闭连接的核心流程,我们就从一个TCP结构图开始探究中的奥秘 序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序 ...
- 【图解】给面试官解释TCP的三次握手与四次挥手-Web运用原理及网络基础
作者 | Jeskson 来源 | 达达前端小酒馆 轻松了解HTTP协议 为什么要学习网络协议呢?为什么要学习计算机完了呢?显然这很重要,至少能够帮助你找到工作的原因之一,学习网络知识点太多太多,没有 ...
- TCP的三次握手与四次挥手笔记
TCP的三次握手与四次挥手笔记 TCP Flags URG: 紧急指针标志 ACK:确认序号标志 PSH:push标志 RST:重置连接标志 SYN:同步序号,用于建立连接过程 FIN: finish ...
- TCP的三次握手与四次挥手理解及面试题
TCP的三次握手与四次挥手理解及面试题(很全面) 转载自:https://blog.csdn.net/qq_38950316/article/details/81087809 本文经过借鉴书籍资料.他 ...
- TCP 的三次握手和四次挥手
参考资料: 1.TCP的三次握手与四次挥手理解及面试题: 2.Http协议三次握手和四次挥手: 3.TCP通信的三次握手和四次撒手的详细流程(顿悟) 前置: 序号(也称序列号) - Sequence ...
随机推荐
- [OrangePi] Installation on internal EMMC
Install the image on SD Card as described above Boot your Orange PI board from SD Card Run: sudo ins ...
- Windows应用层网络模块扫盲
说到Windows应用层网络通信不得不提winsock,winsock是工作在TCP/IP层的应用层(TCP/IP层分为主机到网络层[比特].网络互联层[数据帧].传输层[数据包].应用 ...
- 【GDI+】 线段 文字 定位的问题(二)
继续: 经过上文的分析,似乎可以得到类似这样的想法: 由此 分为左右两侧进行区分绘制,应该就可以获得想要的结果了~
- RSYNC--数据迁移、备份
前言 一台Solaris主机要下线了,准备将数据迁移至一台AIX主机上,可是在Solaris主机上有一个文件系统有1200万个小文件,因为是跨平台的数据迁移,采用磁盘底层复制无法进行,采用数据备份恢复 ...
- 想学习一下CSS函数
好像原来都是用前后端代码实现的功能,如今CSS3已经吸纳为标准,使用简单的选择器就可以实现了.
- 161101、在Java中如何高效判断数组中是否包含某个元素
如何检查一个数组(无序)是否包含一个特定的值?这是一个在Java中经常用到的并且非常有用的操作.同时,这个问题在Stack Overflow中也是一个非常热门的问题.在投票比较高的几个答案中给出了几种 ...
- 160918、BigDecimal运算
java.math.BigDecimal.BigDecimal一共有4个够造方法,让我先来看看其中的两种用法: 第一种:BigDecimal(double val)Translates a doubl ...
- Android 常用工具类之 DimenUtil
public class DimenUtil { /** sp转换成px */ public static int sp2px(float spValue) { float fontScale = M ...
- ALTFP_CONVERT IP使用与仿真
ALTFP_CONVERT IP使用与仿真 近期项目要使用到整型数据转浮点型数据,将16位的整数转换为单精度浮点数(32bit).本打算自己写逻辑实现的,不过考虑到本身项目时间紧,能力也有限,就没 ...
- 在centos6.5上面mount微软系统上安装ftp服务器
---恢复内容开始--- 现在用虚拟机开发linux软件,发现虚拟机提供的共享文件夹不能很好地工作,表现为: 1.我在windows上面修改了文件内容,在linux里面发现文件内容没有变化,需要做些等 ...