TCP协议的三次握手过程和四次挥手过程以及为什么要这样? ------一二熊猫

news/2024/7/7 15:20:30

TCP三次连接过程

很久没有复习TCP三次握手四次挥手,复习一下。
在这里插入图片描述
SYN、RST是用于连接的建立和清除,含SYN的报文被叫做SYN报文段。
建立连接时:
第一步,客户端的TCP首先向服务器端的TCP发送一个特殊的TCP报文。该报文段中不包含应用层数据。报文首部包含一个标志位为SYN被置为1,同时客服端选择一个随机的序列号seq(client_isn)并将其放在该起始的TCP SYN报文段中,该报文段会发送给服务器端。报文段中的SYN=1表示这是建立连接报文,seq为客户端的随机序列号。

第二步,一旦TCPSYN报文段的ip数据报到达服务器主机,服务器就会从该数据报中取出TCPSYN报文段,为该TCP分配TCP缓存和变量,并向该客户端发送允许连接的报文段。首先将这个要回复的报文段的标志位SYN置为1,其次将该报文段的首部确认号字段被置为client_isn+1,即ack=x+1;最后服务器会选择自己的初始序号(server_isn)即seq=y,并将其放置到TCP的报文段首部的序号字段中。(这个允许连接的报文段实际上表明了:“我收到了你发起的SYN分组,该分组带有初始序号clien_isn。我同意建立连接。我自己的序列号是server_isn”),该报文段被称为SYNACK报文段。报文段的SYN=1是表示这是建立连接报文,ACK是对客户端报文段的确认,seq=y是服务器发送自己的初始序列号,ack=x+1是指期待接受到对方的下一个字节的序号。

第三步,在收到SYNACK报文后,客户也要给该连接分配缓存和变量。客户主机则向服务器发送另一个报文段。这个报文段对服务器的允许连接报文段进行了确认,客户端将值server_isn+1放置到TCP报文段首部确认字段中来完成此项工作。SYN被置为0,因为已经建立了连接。
其中ACK是对服务器端报文段的确认,seq=x+1是传输给对方自己的下一个报文序号,也就是对上一次接受到服务器报文后给与的序号同步,ack=y+1是期待服务器的下一个字节的序号。

为什么需要三次连接,二次连接不行吗?

三次连接的必要性:
原因一:为了防止重复连接

TCP三次握手主要是为了防止旧的连接引起的重复连接问题。

由于没有第三次握手,服务器只能选择建立连接或拒绝连接,但是服务器并不知道这次连接违不违法,所以每收到一个 SYN 就会建立一个新的连接,服务器就会建立多个冗余的无效链接,造成不必要的资源浪费(SYN洪泛攻击)。若是TCP是三次握手,那么客户在收到ack=x+1的序号后就可以判断当前是否为历史连接,如果是历史连接,客服端就会发送终止报文RST,告诉服务器终止这次连接,若不为历史连接,那么就发送指令给服务器来建立连接。

通俗的说:
假如客户端发出了连接请求,但因为网络波动导致服务器并没有收到来自客户端的请求连接,于是客户端又重发了一次连接请求,客户端和服务器经过两次握手就建立好连接。双方开始传输数据,数据传输完成以后,双方断开连接。过一段时间后,原本在网络传输中搁置的连接请求到达了服务器。服务器以为是客户端又发出来一次新的连接请求,于是就向客户端发送确认报文段,同意建立连接(两次握手只需要服务器发出确认报文段,就建立好连接)。此时服务器一直在等待客户端发送的数据,一直浪费着系统资源。

原因二:为了同步初始化序列

首先客户端发送一个序号为seq=200的数据包给服务器,服务器方接受到后就会返回一个ack=200+1的确认,当客服端前后发送了很多数据报到达服务器端时,由于网络原因,数据包不会按发送顺序到达。服务器对收到的数据包进行确认时只会一个个按序确认,比如发送了ack=900+1的确认数据报,就说明前900序号的数据报都收到了。若是只收到seq=900的数据包而下一个到达的是seq=1000的数据包,那么一般就会将其丢弃掉或者保留下来等待所有失序的数据报到来。

TCP是稳定的网络传输协议,它需要一个序列号来确保自己的稳定性。这个序列号就是为了防止数据报的重复或者漏发,以及解决数据报顺序颠倒问题。当客户端发送一个带初始序列号的报文段到达服务器端时,需要服务器回答一个已经接受到这个初始序列号的ACK应答报文,服务器端发送的数据报中也有服务器方的初始序列号,也需要得到客户端的应答回复,这样一来一回就能确保双方的序列号同步。

TCP四次挥手

当客户应用进程发送一个关闭连接的命令后,客户端TCP会向服务器端TCP发送一个带特殊标志位的报文段,这个特殊标志位为FIN=1;当服务器接收到这个报文段后就向发送方发送一个确认报文段,然后服务器发送它自己的终止报文段,其FIN标志位也置为1。最后,客户端再对这个服务器的终止报文进行确认。这个时候这个TCP连接的所有资源在双方的主机上都被释放了。
具体访问博文:TCP四次挥手

自我学习笔记记载。


http://www.niftyadmin.cn/n/3075837.html

相关文章

比较DFS和BFS的优点和缺点及名称词汇

dfs和bfs用邻接表和邻接矩阵存储图,时间复杂度为O(N E)和O(N2),若遍历整个图,空间复杂度均为O(N) 如果已经知道解离根节点比较近,那么BFS更好 如果整体上每个节点的边很多,那么BFS消耗的内存会很大 如果一棵树很深而解…

[OOD-More C++ Idioms] 内部类 (Inner Class)

内部类 (Inner Class) 目的 不用通过多重继承就可以实现多套接口,同时可以自然地向上转换(Up-casting)。在单个抽象下提供相同接口的多个实现。别名 动机 两个独立类库通过不同的接口提供的虚函数签名可能冲突,如果这时需要同时实现这两个函数就会出现问题。示例如下…

最近使用git的错误----“failed to push some refs to ...”与“On branch master Your branch is up to date with ‘”

第一种错误 使用命令 git push origin master 报如下错误: failed to push some refs to … 这是因为你往git上已经推送了一部分代码或文件夹,你删掉了其中的一部分,再次推时就会出现这种不允许把本地代码覆盖上去的情况。这个时候你有两种…

【从翻译mos文章】rac数据库,HC_lt;SIDgt;.dat其他文件Oracle_Home用例下。

rac数据库。HC_<SID>.dat其他文件Oracle_Home用例下。参考原始&#xff1a;RAC database HC_<SID>.dat is used by instance of different Oracle_Home (Doc ID 1618161.1)适用于&#xff1a;Oracle Database - Enterprise Edition - Version 11.2.0.0 and laterIn…

基于内容的图像检索系统设计与实现--颜色信息--纹理信息--形状信息--PHASH--SHFT特征点的综合检测项目,包含简易版与完整版的源码及数据!

百度云提取源码以及数据包&#xff0c;直接下载压缩包解压就可以使用&#xff0c;数据就在压缩包文件dataset中。 简化版&#xff1a;只有-颜色信息–纹理信息–形状信息–PHASH–SHFT特征点的综合检测 [百度云链接&#xff0c;提取码&#xff1a;6666] 戳我 完整版&#xff1…

学习笔记,奇安信笔试题第二题输入问题:[1,2,3,4,5,6]。以及读入时不知道数量输入回车结束的问题,如“1 2 3 4 5 6”回车结束。

之前做题遇到一些输入的问题&#xff0c;平时我们写代码的时候大多数时候是知道输入数据的个数&#xff0c;所以我们在循环读入的时候可以设置结束条件&#xff0c;但是会遇到随机个数的输入&#xff0c;这里做一下学习记录。 #include<iostream> #include<vector>…

Oracle添加数据文件创建表空间,创建用户代码

1,添加数据文件创建表空间 1 CREATE TABLESPACE "TEST1" DATAFILE D:\ORACLE\11G\ORADATA\ORCL\TEST1.DBF SIZE 100M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED LOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO 部署时需要根据需要改动部分: TABL…

Spring线程池开发实战及使用spring注解

2019独角兽企业重金招聘Python工程师标准>>> 本文提供了三个Spring多线程开发的例子&#xff0c;由浅入深&#xff0c;由于例子一目了然&#xff0c;所以并未做过多的解释。诸位一看便知。 前提条件&#xff1a; 1&#xff09;在Eclipse创建一个Java项目&#xff0c…