TCP的三次握手和四次握手
三次握手(建立连接)
- 首先,服务器进程(B)先创建传控制块TCB(用来存储连接信息,如连接表,发送和接收序号等),准备接收客户进程(A)的请求。然后服务器进程处于LISTEN(收听)状态,等待客户的连接请求。客户进程(A)同样也是首先创建传输控制块TCB,然后向服务器B发出连接请求报文。报文首部的同步位SYN=1,同时选择一个初始的序号seq=x(TCP规定,SYN=1的报文不能携带数据,但是要消耗掉一个序号),这时TCP客户进程进入SYN-SENT(同步已发送)状态。
- 服务器进程(B)收到连接请求后,如同意连接,则向A发送确认。在确认报文中SYN位和ACK位都为1,确认号ack=x+1,同时自己选择一个初始序号seq=y。(这个报文也不能携带数据,同样要消耗一个序号),这是服务器进程(B)进入SYN-RCVD(同步收到)状态。
- 客户进程(A)收到B的确认后,还要向B发送确认。确认报文的ACK=1,确认号为ack=y+1,自己的序号为seq=x+1,(TCP规定,ACK报文可以携带数据,如果不携带则不消耗序号,这样的话,下一个数据报文段的序号仍是seq=x+1),这时,TCP连接已建立,A进入ESTABLISHED状态,当B收到A的确认后,同样也进入ESTABLISHED状态。
问题:为什么A还要发送一次确认呢?(为什么是三次握手,不是两次)
答:主要是为了防止已经失效的连接请求报文突然又传送到B,因而产生错误。例如,当A发送连接请求,但是因为网络延迟等原因,在某个网络节点滞留,迟迟未到达B,所以A未收到B的确认,这时候A重新发送了一次请求报文,这次正常建立连接。数据传输完毕后,正常释放连接。突然这时候B收到了A第一次发送的请求报文,以为A又要重新建立连接。这时发送了确认报文,同意建立连接。如果这时不采用三次握手,那么只要B发送确认,新的连接就建立了。由于A没有发出建立连接的请求,因此不会搭理B,也不会向B发送数据,而B以为新的连接建立了,一直在等待A发来数据,B的许多资源就这样白白浪费了。这种情况下,如果采用三次握手,A不会向B发送确认,B由于收不到确认,就知道A没有建立连接。
四次握手(释放连接)
- 双方传输结束后,通信双方都可以释放连接。现在A和B都处于ESTABLISHED状态。A进程向B发送连接释放报文,并停止发送数据。报文的首部终止控制位FIN=1,序号为u(序号u等于前面传送过的数据的最后一个字节的序号加1),这是A进入FIN-WAIT-1(终止等待1)状态,等待B的确认。
- B收到连接释放报文后即发出确认ACK=1,确认号为ack=u+1,而这个报文的自己序号是v(等于B前面已传送过的数据的最后一个字节的序号加1)。然后B进入CLOSED-WAIT(关闭等待)状态。(TCP服务器进程这时应通知高层应用进程,因而A到B的连接就释放了,这时候TCP连接进入半关闭状态,即A已经没有数据要发送了,但是如果B要发送数据,A仍要接收,也就是说从B到A这个方向的连接并未关闭)。A收到来自B的确认后,就进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。
- 如果B没有数据向A发送了,其应用进程就通知TCP释放连接。这是B发送连接释放报文必须使FIN=1,假定B的序号为w,(因为在半关闭状态B可能又发送了一些数据),B必须重复上次已发送的确认号ack=u+1,确认位ACK=1。这时B进入LAST-ACK(最后确认)状态,等待A的确认。
- A收到B的连接释放报文后,必须对此发出确认。在确认报文中把ACK置为1,确认号为ack=w+1,而自己的序号是seq=u+1,然后进入TIME-WAIT(时间等待)状态。请注意,现在TCP连接还没有释放掉,必须经过时间等待计时器(TIME-WAIT timer)设置的时间2MSL后,A才进入CLOSED状态。(MSL-Maximum Segment Lifetime叫做最长报文段寿命,建议为2分钟),因此A进入到TIME-WAIT状态后,要经过4分钟才能进入到CLOSED状态,才能开始建立下一个新的连接。
问题:为什么A在TIME-WAIT状态必须等待2MSL的时间呢?
答:为了保证A发送的最后一个ACK报文段能够到达B。这个ACK报文段有可能丢失,因此处于LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认。B会超时重传这个FIN+ACK报文段,而A就能在2MSL时间内收到这个重传的FIN+ACK报文段。接着A重传一次确认,重新启动2MSL计时器。最后A和B都正常进入到CLOSED状态。如果A不等待一段时间,而是立即释放连接,那么就无法收到B的重传FIN+ACK报文段,因而也不会再发送一次确认报文段。这样,B就无法按照正常的步骤进入CLOSED状态。另一个原因是,防止已失效的连接请求报文段出现在本连接中,A在发送完最后一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样就可以使得下一个新的连接中不会出现这种旧的连接请求报文段。
TCP的三次握手和四次握手的更多相关文章
- TCP连接和连接释放(TCP的三次挥手和四次握手)
TCP的运输连接管理 TCP是面向连接的协议.运输连接是用来传送TCP报文的.TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程.因此,运输连接就有三个阶段,即:连接建立.数据传送和连接 ...
- TCP/IP协议三次握手与四次握手流程解析
原文链接地址:http://www.2cto.com/net/201310/251896.html TCP/IP协议三次握手与四次握手流程解析 TCP/IP协议的详细信息参看<TCP/IP协议详 ...
- TCP/IP协议三次握手与四次握手流程解析(转载及总结)
原文地址:http://www.2cto.com/net/201310/251896.html,转载请注明出处: TCP/IP协议三次握手与四次握手流程解析 一.TCP报文格式 TCP/IP协议的详 ...
- TCP/IP协议三次握手与四次握手
TCP/IP协议三次握手与四次握手流程解析 一.TCP报文格式 TCP/IP协议的详细信息参看<TCP/IP协议详解>三卷本.下面是TCP报文格式图:图1 TCP报文格式 上图中有几个 ...
- 抓包分析TCP的三次握手和四次握手
问题描写叙述: 在上一篇<怎样对Android设备进行抓包>中提到了,server的开发者须要我bug重现然后提供抓包给他们分析.所以抓好包自己也试着分析了一下.发现里面全是一些TCP协议 ...
- 三次握手、四次握手、backlog
TCP:三次握手.四次握手.backlog及其他 TCP是什么 首先看一下OSI七层模型: 然后数据从应用层发下来,会在每一层都加上头部信息进行封装,然后再发送到数据接收端,这个基本的流程中每个数 ...
- tcp三次握手和四次握手
建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资 ...
- TCP/IP 三次握手和四次握手
三次握手建立连接: 第一次握手:客户端发送syn包(seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己 ...
- TCP/IP具体解释--三次握手和四次握手 Dos攻击
TCP连接的状态图 TCP建立连接的三次握手过程,以及关闭连接的四次握手过程 贴一个telnet建立连接,断开连接的使用wireshark捕获的packet截图. 1.建立连接协议(三次握手) (1) ...
- TCP:三次握手、四次握手、backlog及其他
TCP是什么 首先看一下OSI七层模型: 然后数据从应用层发下来,会在每一层都加上头部信息进行封装,然后再发送到数据接收端,这个基本的流程中每个数据都会经过数据的封装和解封的过程,流程如下图所示: 在 ...
随机推荐
- Spark Mllib里决策树二元分类使用.areaUnderROC方法计算出以AUC来评估模型的准确率和决策树多元分类使用.precision方法以precision来评估模型的准确率(图文详解)
不多说,直接上干货! Spark Mllib里决策树二元分类使用.areaUnderROC方法计算出以AUC来评估模型的准确率 具体,见 Hadoop+Spark大数据巨量分析与机器学习整合开发实战的 ...
- HTML5利用FormData对象实现显示进度条的文件上传
摘自:https://blog.csdn.net/q1056843325/article/details/53759963 自己做是按这个实现的,兼容性还不错 完整简约的解决方案 下面的代码清单是包括 ...
- 快色排序算法(C语言描述)
快速排序 算法思想 快速排序采用了一种分治策略,学术上称之为分治法(Divide-and-Conquer Method). 哨兵(如下算法中的key) 每趟排序将哨兵插入到数组的合适位置,使得哨兵左侧 ...
- HttpServeletRequest
一.HttpServeletRequest 接口(javax.servlet.http) 定义:public interface HttpServletRequestextends ServletRe ...
- jQuery中slim版本与普通版本的区别
在jQuery3中,推出了一个slim版本.slim,百度翻译:细长的; 苗条的,纤细的; 微小的; 无价值的. 区别概述: slim即简化版,比普通版本缺少Ajax和特效模块模块. 官方发布地址:h ...
- Android RecyclerView使用GridLayoutManager导致间隙变大的问题
我用recyclerView的时候设置LayoutManager为Grid,添加decoration为Grid,作为二级列表时,多次点击一级列表来跳转的时候,两张图之间的间隙在逐渐变大,后来发现是因为 ...
- ApexSQL Log中的Redo Script跟原始SQL不一致问题
最近遇到一个误更新数据的问题,使用ApexSQL Log做挖掘事务日志的时候,发现ApexSQL Log生成的Redo Script跟原始SQL是有区别的.它们并不是完全一致的.只是逻辑上等价而已.如 ...
- BZOJ 3992: [SDOI2015]序列统计 NTT+快速幂
3992: [SDOI2015]序列统计 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1155 Solved: 532[Submit][Statu ...
- 在SAP C4C里触发SAP ERP的ATP check和Credit check
在C4C里创建一个新的Sales Quote: 添加三个行项目: 执行action "Request External Pricing"会从ERP更新pricing信息,触发ATP ...
- Android(java)学习笔记136:利用谷歌API对数据库增删改查(推荐使用)
接下来我们通过项目案例来介绍:这个利用谷歌API对数据库增删改查 1. 首先项目图: 2. 这里的布局文件activity_main.xml: <LinearLayout xmlns:andro ...