TCP三次握手和四次握手

刚刚学完这个知识,感觉很重要,在此记录下来,参考资料,《计算机网络》 谢希仁 第六版

TCP报文格式

注意:在理解三次握手之前必须理解首部中的这几个字段的含义

首部的重要字段

序号(seq):TCP连接中传送的字节流中的每一个字节都按顺序编号,首部中的序号字段的意思是本报文段所发送的数据的第一个字节的编号

确认号(ack):期望收到对方下一个报文段的第一个数据字节的编号,也就是说确认号与发送方下一次发送过来的报文段的序号(seq)相等。

若确认号是N,则表示我方已正确收到了N-1为止的所有数据。

确认(ACK):仅当ACK为1的时候确认号(ack)才有效,由于连接建立后就要发送数据,所以连接建立后传输的所有报文段ACK都要为1。

同步号(SYN):SYN=1,ACK=0表示这是一个请求连接的报文段,

SYN=1,ACK=1表示这是一个同意连接的报文段。

终止(FIN):FIN=1时,表示此报文段的发送方的数据已发送完成,要求释放连接。

三次握手

大白话:

1.A对B说,我想和你连(SYN=1,ACK=0),我要是发送数据了就从x+1开始(seq=x,TCP规定SYN=1的报文段不携带数据,但是要消耗掉一个序号)

2.B对A说,可以啊(SYN=1,ACK=1),我要是接收你的数据就从x+1开始收吧(ack=x+1),我发送数据的话,从y+1开始(seq=y,此处同上不携带数据,消耗掉一个序号)

3.A对B说,我知道你同意了,我要是接收你的数据就从y+1开始收(ack=y+1)。

TCP规定,ACK=1的报文段可以携带数据,但是如果不携带数据则不消耗序号。

此处没有携带数据,所以下一次A发送数据还是从x+1开始的(seq=x+1)

此时连接就建立了。

为什么要使用三次握手呢?两次为什么不行呢?

这主要是为了防止已失效的连接请求报文段又突然传到了B,进而产生错误。

我们假设使用两次握手,即A向B请求连接,B向A发送同意连接的报文后,连接建立。

有一种情况,A向B发送了请求连接,但是这个请求在网络中间堵车了,A见B迟迟不回答,就再次发送了一个请求,

第二次请求,B直接收到了,返回一个同意连接这个连接就建立了。之后传输,结束,释放,完事。

但是还没完,过了很久,第一个堵车的请求才到了B,B向A发送了同意连接后就等待A的数据了,但是A此时并没有连接

的要求,就直接将同意连接的报文丢弃了,B要等很久才知道A根本就没连,它的许多资源都白白浪费了。

如果采用三次握手,B要是没有收到A的确认(B等待确认的时间要短的多),就知道A并没有连接,B就会放弃。

四次握手

依旧大白话:

1.A对B说,我传给你的最后一个数据是u-1(seq=u),我发完了,现在想走了(FIN=1),你回个话。(FIN报文段即使不携带数据,也要消耗一个序号)

2.B对A说,你传给我的最后一个数据是u-1(ack=u+1,之前的报文段消耗了一个序号),我下一步要发送的数据是从v开始的(seq=v)。

你发送完了,可是我没有发送完啊,等着让我发完!然后B就开始把剩下的数据给A。(如果B还有数据要给A的话)

3.B的剩余数据发送完之后,就对A说,我发送给你的最后一个数据的序号是w-1(seq=w),你传给我的最后一个数据是u-1(ack=u+1),

现在我的数据也发完了,我想走了(FIN=1)。

4.A说我给你的最后一个数据是u-1(seq=u+1),我收到你的最后一个数据是w-1(ack=w+1,FIN报文要消耗掉一个序号),你可以走了。

之后B的连接就完全关闭了,但是A的连接要等2MSL个时间才会完全关闭。

为什么?

看课本去吧~

至于为什么选择使用四次握手,我认为原因是

A单方面提出的分手,是因为它已经将数据传送完成了,因此向B提出分手(第一次握手)

B事先不知道A要提出分手,所以它要将善后工作处理好,将剩余的数据发给A, 通知A等一下(第二次握手)

中间可能经历很多B向A的数据传输

B将善后工作处理完了,要通知A一下,让A知道B的数据已经发完了(第三次握手)

A要通知B,我知道你将数据发完了,你可以走了(第四次握手)

B是个好人。/(ㄒoㄒ)/~~

为了照顾新手,我屏蔽了很多细节和其它知识点,要想详细了解TCP的工作原理,要仔细阅读相关书籍。

您的批评指正是我最大的动力,希望各位看官发现错误后及时给我留言,在下感激不尽...

时间: 2024-10-10 14:47:00

TCP三次握手和四次握手的相关文章

抓包分析TCP的三次握手和四次握手

问题描写叙述: 在上一篇<怎样对Android设备进行抓包>中提到了,server的开发者须要我bug重现然后提供抓包给他们分析.所以抓好包自己也试着分析了一下.发现里面全是一些TCP协议和HTTP协议.所以要想进行抓包分析,必须先了解TCP的原理.这里介绍了TCP的建立连接的三次握手和断开连接的四次握手. 问题分析: 1.TCP建立连接的三次握手 1.1前言:介绍三次握手之前,先介绍TCP层的几个FLAGS字段,这个字段有例如以下的几种标示 SYN表示建立连接, FIN表示关闭连接. ACK

三次握手、四次握手、backlog

TCP:三次握手.四次握手.backlog及其他 TCP是什么 首先看一下OSI七层模型: 然后数据从应用层发下来,会在每一层都加上头部信息进行封装,然后再发送到数据接收端,这个基本的流程中每个数据都会经过数据的封装和解封的过程,流程如下图所示: 在OSI七层模型中,每一层的作用和对应的协议如下图所示: 说回TCP,简单说TCP(Transmission Control Protocol)即传输控制协议,是一种面向连接的.可靠的.基于ip的传输层协议. TCP协议头部格式 要学习TCP协议,首先

网络连接的三次握手及四次握手

网络连接的三次握手及四次握手   一个数据从一台主机传输到另一台主机,看似平淡无奇,但是稍微了解就知道其底层其实是非常复杂的,下面我们说一下OSI(Open System Interconnection)开放系统互连,一个数据要经过7个过程的层层打包,然后到对方电脑后再层层解包来完成.     第一层:物理层(physical)也是最底层了,把打包好的数据通过二进制进行传输.为启动.维护以及关闭物理链定义了电气规范.机械规范.过程规范和功能规范.     第二层:数据链路层(data link)

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

原文链接地址:http://www.2cto.com/net/201310/251896.html TCP/IP协议的详细信息参看<TCP/IP协议详解>三卷本.下面是TCP报文格式图 上图中有几个字段需要重点介绍下:   (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记.   (2)确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1.   (3)标志位:共6个,即URG.ACK.PSH.RST

TCP/IP的三次握手和四次握手 Dos攻击

TCP连接的状态图 TCP建立连接的三次握手过程,以及关闭连接的四次握手过程 贴一个telnet建立连接,断开连接的使用wireshark捕获的packet截图. 1.建立连接协议(三次握手) (1)客户 端发送一个带SYN标志的TCP报文到服务器.这是三次握手过程中的报文1. (2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志.因此它表示对刚才客户端SYN报文的回应:同时又标志SYN给客户端,询问客户端是否准备好进行数据通 讯. (3) 客户必须再次

TCP/IP 三次握手和四次握手

三次握手建立连接: 第一次握手:客户端发送syn包(seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态: 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手. 握手过程中传送的包里不包含数据,三次握手

TCP协议三次握手连接四次握手断开和DOS攻击

转载:http://blog.csdn.net/fw0124/article/details/7452695 TCP连接的状态图 TCP建立连接的三次握手过程,以及关闭连接的四次握手过程 贴一个telnet建立连接,断开连接的使用wireshark捕获的packet截图. 1.建立连接协议(三次握手)(1)客户 端发送一个带SYN标志的TCP报文到服务器.这是三次握手过程中的报文1.(2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志.因此它表示对刚才客

TCP三次握手和四次握手最直接的理解

网上有非常多文章讲TCP为什么建立连接时须要三次握手,关闭连接时须要四次握手.讲了非常多原理.反而让非常多人难以理解. 事实上仅仅有一句话:TCP连接是两个端点之间的事.因为TCP连接是可靠连接,所以无论是建立连接还是关闭连接,须要两个端点都要发送请求和收到确认 其次要理解TCP的通道是全双工的.是能够读和写数据的,理解这个之后就明确了为什么关闭连接时须要四次握手. 首先讲三次握手.建立连接时不涉及到读写通道,仅仅是两个端点的请求和确认.要记住是两个端点之间的,两个端点是平等的关系. 从clie

TCP/IP协议三次握手与四次握手流程解析(转)

一.TCP报文格式 下面是TCP报文格式图: 上图中有几个字段需要重点介绍下:  (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记.  (2)确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1.  (3)标志位:共6个,即URG.ACK.PSH.RST.SYN.FIN等,具体含义如下:  (A)URG:紧急指针(urgent pointer)有效.  (B)ACK:确认序号有效.  (C)PSH: