IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> TCP相关 -> 正文阅读

[网络协议]TCP相关

一、三次握手

TCP:传输控制协议。面向连接的,可靠的。

在建立连接时,tcp协议采用经典的三次握手机制。

三次握手中TCP报文的seq,ack,SYN和ACK起到了关键性作用。Seq是报文中32位二进制的数据号,ack是32位的确认号(和ACK区分开)。SYN和ACK则都是1位的标志位。?

三次握手的具体实现过程:

1. 第一次握手:Client(客户端主机A)向Server(服务器主机B)发送一个连接请求,在这个包中,标志位SYN=1,发送序号seq=x。Client(客户端)进入SYN_SEND(已发送)状态,等待Server(服务器)确认。

2. 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,确认序号ack=x+1,随机产生一个发送序号SEQ=y,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD(已接收)状态。

3.第三次握手:Client收到确认后,检查确认序号ack是否为x+1,标志位ACK是否为1,如果正确,则将标志位ACK置为1,确认序号ack=y+1,并将该数据包发送给Server,Server检查确认序号ACK是否为y+1,标志位ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED(已建立)状态。

三次握手的目的:

三次握手的目的是要确认对方收到了自己的数据包,或者说双方都要确认彼此的收发能力正常这个目标就是通过“确认号(ack)”字段实现的。计算机会记录下自己发送的数据包序号Seq,待收到对方的数据包后,检测“确认号(ack)”字段,检查ack=seq+1是否成立。

个人理解:

在三次握手中,服务器和客户端各自发送了一个seq,并且收到了对应的ack = seq+1。从而确定了双方接收,发送的能力都没有问题。

第一次握手:服务器收到客户端数据包,服务器确服务器接收能力客户端发送能力正常

第二次握手:? 客户端收到服务器数据包, 客户端确认服务器发送能力,接收能力客户端发送能力,接收能力正常。

第三次握手:服务器再次收到客户端数据包,服务器确认了服务器发送能力正常。

至此,双方都确认了彼此的收+发能力都正常,连接建立。

?

  • TCP的三次握手一定能保证传输可靠吗?
  • 不能
  • 三次握手比两次更可靠,但也不是完全可靠,而追加更多次握手也不能使连接更可靠了。因此选择了三次握手。比如:第三次握手时失败,此时客户端会认为连接正常,而此时服务器端连接尚未建立
  • 世界上不存在完全可靠的通信协议。从通信时间成本空间成本以及可靠度来讲,选择了“三次握手”作为点对点通信的一般规则。这是“两军通信”问题。

二、四次挥手

在TCP断开连接时,会发送四个数据包用于确认断开,称为四次挥手。

?四次挥手具体过程:

第一次挥手:当客户A要断开TCP连接时,发送一个包,其中标志位fin=1,ACK=1,发送序号seq=x,确认序号ack=y。Client进入FIN_WAIT_1状态(已发送fin,等待回复)。
第二次挥手:客户B知道A要断开后,发送一个确认包,其中标志位ACK=1发送序号,seq=y确认序号ack=x+1,Server进入CLOSE_WAIT状态(被动关闭)。
第三次挥手:客户B也断开TCP连接,此时发送一个包,其中,标志位fin=1,发送序号seq=y+1,Server进入LAST_ACK状态(确认请求)。
第四次挥手:客户A收到B的断开请求后,Client进入TIME_WAIT状态,接着发送一个确认包,标志位ACK=1,发送序号seq=x+1,确认序号ack=y+2;Server进入CLOSED状态(关闭)。

由于TCP连接是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。

为什么关闭连接是四次挥手呢?

因为服务器收到FIN报文时,往往并不能直接关闭socket,因为可能有一些数据还没有发送完成。因此在四次挥手过程中,第二和第三次挥手是分两步进行。而在建立连接时,不需要考虑关闭问题,这两步可以合为一次握手。

为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

1.保证可靠关闭。如果在此时第四次握手没有成功,服务端则会继续发送FIN,而客户端会再次返回ACK,以确保服务端能够正确收到ACK并关闭。

2.保证所有的数据都已经发送。假设客户端在关闭之后又重新建立连接,TCP协议判断不同连接的依据是socket pair,而新连接的端口号又可能和老连接相同。此时如果有残存在网络中的数据,则会被认为是新连接的数据,产生混乱。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-11-22 12:42:59  更:2021-11-22 12:44:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:33:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码