TCP协议详解(三次握手,传输数据,四次挥手)

2023-11-01

首先来了解一下什么是TCP(传输控制协议):简单点来讲TCP它是一种网络通信协议,旨在通过internet发送数据包。TCP是OSI层中的传输层协议(第四层),用于通过传输和确保通过支持网络和internet传递消息来在远程计算机之间创建连接。
TCP协议的特点:
(1)TCP协议是面向连接的传输层协议,在数据传输前必须建立连接,数据传输之后释放连接。
(2)TCP提供可靠交付的服务,所谓可靠是指在传输过程中无重复,无丢失,无错误。但是同时会增加开销。
(3)每一条连接都是点对点连接(一对一)
(4)面向字节流,所谓字节流指的是以传输过程中流入进程和流出进程的字节序列,虽然传输过程中是一个一个数据报,但这只是为了方便传输,之后在目的端重新装配。
(5)TCP提供全双工通信,所谓全双工是指一端既可以是客户端,也可以是服务器端。

tcp通信过程包括三个步骤:
1):建立TCP连接通道(三次握手)
2):传输数据(超时重传,快速重传,流量控制,拥塞控制等等。)
3):断开连接(四次挥手)

三次握手过程:

在这里插入图片描述
第一次握手: 客户端发送syn包到服务器,并进入syn_sedn状态,等待服务器确认;
SYN=1,ACK=0表示请求连接。
X表示本次字节流的初始序号。
TCP规定:此时没有数据传输,但是消耗一个序号。
第二次握手: 服务器接受syn包,必须确认客户的syn(ack=x+1),同时自己也发送一个 syn包(seq=y),即syn+ack包,此时服务器进入syn_recv状态;
SYN=1,ACK=1表示同意连接的应答响应。
Y表示本次字节流的初始序号。
X+1表示希望收到的字节起始序号。
第三次握手: 客户端收到服务器的syn+ack包,向服务器发送确认ack(ack=y+1),此包发送完毕,客户端和服务器进入established状态,完成三次握手。

注意: 握手过程中传送的包里不包含数据,三次握手完毕后 客户端与服务器端才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方的任意一方没有主动关闭连接之前,TCP连接将一直保持下去。

传输数据过程:

a.超时重传: 超时重传机制用来保证TCP传输的可靠性。每次发送数据包时,发送的数据报都有seq号,接收端收到数据后,会回复ack进行确认,表示某一seq号数据已经收到。发送方在发送了某个seq包后,等待一段时间,如果没有收到对应的ack回复,就会认为报文丢失,会重传这个数据包。

b.快速重传: 接收数据一方发现有数据包丢失了,就会发送ack报文告诉发送端重传丢失的报文。如果发送端连续收到标号相同的ack包,则会触发客户端的快速重传。比较超时重传和快速重传,可以发现超时重传是发送端在等超时,然后触发重传;而快速重传则是接收端主动告诉发送端数据没收到,然后触发发送端重传。

C.流量控制: 这里主要说TCP滑动窗流量控制,与网络无关。TCP头里有一个字段叫window,也就是advertised-window,这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会到时接收端处理不过来。滑动窗可以是提高TCP传输效率的一种机制。

d.拥塞控制: 滑动窗用来做流量控制。流量控制只关注发送端和接收端自身的状况,而没有考虑整个网络的通信状况。拥塞控制则是基于整个网络来考虑的。如果某一时刻网络上的延时突然增加,那么 TCP对这个事做出的应对只有重传数据,但是 重传会加重网络负担,所以会导致更大的延迟以及更多的包丢失,于是这个情况就会进入一个恶性循环,试想一下,如果一个网络内有成千上万的TCP连接都这样,那么TCP这个协议就会拖垮整个网络。所以 TCP引入了拥塞控制策略。拥塞控制策略算法主要包括:慢启动,拥塞避免,拥塞发生,快速恢复。

四次挥手过程:

在这里插入图片描述
第一次挥手: A发送一个FIN(连接释放请求),用来关闭A方到B方的数据传送,也就是A告诉B我不会再给你发送数据了,但此时B还可以接受数据。此时A进入FIN_WAIT状态。
FIN=1,表示释放连接。
seq=u,u-1表示确认的最后一个数据序号。

第二次挥手: B收到FIN(连接释放请求)后,发送一个ACK(应答响应)给对方,确认序号为收到序号+1;此时B进入CLOSE_WAIT状态。
ACK=1:除TCP连接请求报文段以外,TCP通信过程中所有数据报的ACK都为1,表示应答。
seq= v:v-1是B向A发送的最后一个字节的序号。
ack=u+1表示希望收到从第u+1个字节开始的报文段,并且已经成功接收了前u个字节。

第三次挥手: B发送一个FIN(连接释放请求),用来关闭B到A的数据传送, B便进入LAST-ACK状态。

第四次挥手: A收到FIN(连接释放请求)后,向B发送ACK确认应答,此时A进入TIME-WAIT状态。完成第四次挥手。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP协议详解(三次握手,传输数据,四次挥手) 的相关文章

  • 10 个基本的 Python 编码约定

    10 个基本的 Python 编码约定 1 使用描述性变量名 2 遵循 PEP 8 标准 3 使用文档字符串记录函数 4 避免全局变量 5 DRY Don t Repeat Yourself 不要重复自己 6 使用列表表达式 7 使用异常进

随机推荐

  • 串口与普通IO口的区别

    General Purpose Input Output 通用输入 输出 简称为GPIO 或总线扩展器 人们利用工业标准I2C SMBus或SPI接口简化了I O口的扩展 当微控制器或芯片组没有足够的I O端口 或当系统需要采用远端串行通信
  • Linux SVN 搭建(YUM)安装

    原文地址 http www centoscn com CentosServer ftp 2014 0202 2409 html 安装说明 系统环境 CentOS 6 2 安装方式 yum install 源码安装容易产生版本兼容的问题 安装
  • 正则验证

    一 校验数字的表达式 数字 0 9 n位的数字 d 2 至少n位的数字 d n m n位的数字 d m n 零和非零开头的数字 0 1 9 0 9 非零开头的最多带两位小数的数字 1 9 0 9 0 9 1 2 带1 2位小数的正数或负数
  • 遍历dataframe中的某列,找出含有空格的元素

    工作上需要处理一个数据 把一个较大数据中的姓名列和账号列全部遍历一遍 然后看是否数据里面含有空格 一开始想法是用for循环 一行一行遍历df数据 这个方法效率太慢 搜索一下 有个博主发现了一个map函数 太厉害了 我直接用了 准备先贴我的代
  • IDEA中POM 项目parent中的dependencyManagement中的依赖版本号报红

    现象 IDEA中作为管理依赖的parent项目的pom文件中 在dependencyManagement中的dependency 如果指定的版本在本地仓库不存在 并且在子项目中也未引用的时候 会报红 疑惑 只是引用了很常见的依赖 并且版本官
  • 如何编写一个含有抄底信号的副图指标

    如果你作为通达信软件源代码的程序维护员 如何编写一个含有抄底提示的副图指标 请看下面的的示例教程 python语言 python 导入所需的库 import talib 计算移动平均线 def moving average data per
  • 【哈佛积极心理学笔记】第6讲 乐观主义

    第6讲 乐观主义 How can we create consciously and subconsciously a positive environment where we actually can take out the most
  • 小白学习一周 Linux命令

    文件系统管理相关命令 clear 清屏 pwd 打印当前工作目录 tmp 打开文件夹 cd 改变当前工作目录 mkdir 创建一个新文件夹 mkdir 在根目录下创建一个新文件夹 mkdir p 套娃创建文件夹 rmdir 删除当前目录下的
  • 图像数据处理 pytorch

    coding utf 8 Transfer Learning Tutorial Author Sasank Chilamkurthy
  • 双非计算机学硕报录比竟然有28:1?深圳大学20考研居然如此爆炸!

    深圳大学是一所双非大学 计算机学科评估B 软件工程学科评估没有 由于计算机实力在双非中很强 而且地处广东深圳 是信息行业和互联网行业比较发达的地区 因此深圳大学很受考生欢迎 但是深圳大学也很难考 深圳大学基本所有计算机相关专业都考408 这
  • 【Git】(一)基本操作

    读完本文后 您会了解 1 如何在本地配置GIT环境 2 环境配置成功后 如何从远端下载一个已有仓库到本地 1 配置全局用户名 邮箱 git config global user name username git config global
  • LeetCode 0198. House Robber

    问题简析 作为职业小偷 我要去打家劫舍 但是注意如果两家相邻房子在同一夜被打劫了 则会触发警报 现在给定一个非负整数构成的数列 代表连续的若干房屋中的财产数量 计算一晚上最多能偷多少钱 例如 nums 1 2 3 1 最大值为1 3 4 n
  • 论文End To End speech里一种seq2seq

    在End To End speech里介绍了一种更好的seq2seq的模型 效果我没有实际比较过 但是思路值得学习 接下来分享下 我的理解 虽然这篇论文讲的是Text To speech 但是主要模型架构使用的是seq2seq 主要的改进也
  • 高效真实的云渲染算法

    高效真实的云渲染算法 转 原文链接 http www cnblogs com effulgent archive 2008 10 06 1305029 html 原文 Realistic and Fast Cloud Rendering N
  • 飞书与IAI国际广告奖,协同实现国内营销史上的创新“云终审”

    防疫时期 线下营销活动暂停或无限延期 转型线上迫在眉睫 而想要高效地进行线上远程办公 一套实用而全面的线上协同工具不可或缺 今天的主角 IAI国际广告奖 是由中国传媒大学广告学院与IAI国际广告研究所联合主办的中国大型广告作品案例评选活动
  • 随笔:MySQL 查询事务状态字段说明

    今天一个朋友想查看一下的MySQL层事务提交状态经历的过程 比如我们常说的prapare flush sync commit 几个阶段 但是找了一下发现视乎没有视图可以看到一共看了3个地方 information schema INNODB
  • Elasticsearch实战(十二)---搜索推荐 match_phrase_prefix及fuzzy错误拼写模糊查询

    Elasticsearch实战 搜索推荐 match phrase prefix 文章目录 Elasticsearch实战 搜索推荐 match phrase prefix 1 搜索推荐场景 1 1 准备数据 2 搜索推荐实现 2 1 ma
  • nginx报404 not found错误解决

    一般报404错误都是因为nginx做了伪静态 去除了框架的index php 访问某域名时 去掉index php目录时达到效果一样 如 www test1 index php test2跟www test1 test2效果一致 在vhos
  • stm32flash碰到hex文件出错,读取超慢, 占用内存超多的问题解决

    这个问题是因为sdcc生成的hex的每行的地址并不是排序的好的 有些高的地址在前面 低的地址在后面 这样的话 stm32flash这个hex c并不能处理这个情况 里面有一个逻辑是用来填补0xff的 当后面的地址比前面大 一减得负数 但是变
  • TCP协议详解(三次握手,传输数据,四次挥手)

    首先来了解一下什么是TCP 传输控制协议 简单点来讲TCP它是一种网络通信协议 旨在通过internet发送数据包 TCP是OSI层中的传输层协议 第四层 用于通过传输和确保通过支持网络和internet传递消息来在远程计算机之间创建连接