传输层协议——TCP
TCP协议
TCP全称为“传输控制协议”,要对数据的传输进行一个详细的控制。
特点
- 面向连接的
- 可靠性
- 字节流
TCP的协议段格式

- 源/目的端口:表示数据从哪个进程来,到哪个进程
- 4位首部长度:表示该TCP头部有多少字节(注意它的单位是4字节),因为TCP报头的范围为[20,60],所以4位首部长度范围就是[5,15]
- 16位校验和:校验报文是否符合要求,不符合直接丢弃
6位标记位
- URG:紧急指针是否有效
- ACK:确认号是否有效
- PSH:提示服务端立刻将TCP缓冲区的数据读走
- RST:对方要求重新建立链接
- SYN:请求建立连接,我们携带SYN标识的称为同步报文段
- FIN:通知对方,本端将断开连接。
我将从下面的几个场景中来阐述一下TCP中协议段格式的每个含义。
ACK确认应答机制

当我们主机A发送数据的时候,主机B需要给主机A发送“已收到”(ACK),这时主机A开知道数据已经发送到了主机B。但如果主机B想要发数据给主机A,那么就又要需要一次write了,所以效率其实是不高的,所以有了后面的捎带应答。
捎带应答
我们发现,很多情况下,客户端服务器在应用层也是 "一发一收"的.意味着客户端给服务器说了 “How are you”,服务器也会给客户端回一个 “Fine,thank you”;那么这个时候 ACK就可以搭顺风车,和服务器回应的 "Fine, thank you"一起回给客户端
32位序号和32位确认序号
32位序号:在建立连接的时候,计算机会随机生成一个随机数作为初始值,当传送一次数据的时候,会累加上数据的大小。 用来解决网络中乱序的问题
32位确认序号:发送端接受到确认应答后,可以认为这个序号之前的序号全部被收到了。用来解决网络中丢包的问题
三次握手与四次挥手
TCP建立连接

- 一开始的时候,客户端和服务端都是CLOSED状态,然后服务端去监听某个端口,然后处于LISTEN状态
- 客户端就会去建立连接,然后会先初始化序号(clinet_isn),将SYN标记位置为1,然后将整个报头发送过去,之后客户端除以SYN_SENT状态
- 服务端收到了来自客户端携带的SYN报头后,也会先初始化自己的序(server_isn)号,然后将确认应答设置为clinet_isn+1,,将TCP报头中ACK和SYN设置为1,然后将报文发送给客户端。之后状态为SYN_REVD
- 最后客户端收到了来自服务端的数据,将TCP中ACK置为1,将确认序号设置为server_isn+1,然后将报文发送给服务端(这次可以携带数据),之后客户端状态为ESTABLISHED。
从上面的三次握手中可以看到,第二次服务端返回ACK和SYN的时候,其实就用到了捎带应答。 而且注意 前两次握手是不能发送数据的,而第三次是可以的。
四次挥手

- 客户端首先会先发送携带FIN的报文给服务端,表示要断开连接。之后状态设置为FIN_WAIT_1
- 服务端收到该报文后,就向客户端发送 ACK 应答报文,接着服务端进入 CLOSE_WAIT 状态。
- 客户端收到服务端的 ACK 应答报文后,之后进入 FIN_WAIT_2 状态。
- 这时,服务端可能需要处理数据。之后会发送FIN报文,之后状态为LAST_ACK
- 客户端收到服务端的 FIN 报文后,回一个 ACK 应答报文,之后进入 TIME_WAIT 状态
- 服务端收到了 ACK 应答报文后,就进入了 CLOSE 状态,至此服务端已经完成连接的关闭。
- 客户端在经过 2MSL 一段时间后,自动进入 CLOSE 状态,至此客户端也完成连接的关闭。
2MSL:刚好是客户端发送数据到服务端的时间 + 服务端发送数据回到客户端的时间(这样就确保再2MSL之后,再无数据处理了)
其实你看,三次握手因为捎带应答,合并成了一次,而四次挥手中,不合并是因为,服务端可能还会发送数据给客户端。
之所以被称为四次挥手,你看图中,是不是客户端和服务端都会发送FIN和ACK来表示自己要断开连接,一来一回刚好4次。
为什么是三次握手?1次可以吗?2次可以吗?4次可以吗?
先来回答一下为什么是三次握手
- 需要确保通信是正常的。3次刚好可以验证TCP全双工
- 确保双方OS是健康的,且愿意通信(各自发送ACK)
再聊一聊如果TCP1次和2次握手会发生什么事
- 我们要知道建立连接是需要消耗资源的,所以如果有人恶意的发送大量SYN报文呢,并且不想接受数据,这样看,1次和2次握手是不是很不合理呢?
4次握手可以吗?
- 当然可以,但是没必要,因为3次握手已经是最少可靠的连接建立了,并且保证了全双工。
超时重传机制
TCP要保证所有的数据包可以达到对方,就必须要有超时重传的机制。

- 主机A发送数据给主机B,但由于网络的原因,数据没有到达主机B
- 主机A在一个特定的时间间隔(这个时间间隔在不同的内核版本中是不同的)内没有收到主机B的数据,就会重新发送(注意重新传的SYN报文是一样的)。
但是,主机 A未收到 B发来的确认应答,也可能是因为 ACK丢失了

因此主机 B会收到很多重复数据.那么 TCP协议需要能够识别出那些包是重复的包,并且把重复的丢弃掉.
所以就有了序号,可以做到去重的效果。
那么最后一个问题来了??
超时的时间怎么确定呢??
- 最理想的情况下,找到一个最小的时间,保证 “确认应答一定能在这个时间内返回”.
- 但是这个时间的长短,随着网络环境的不同,是有差异的
- 如果超时时间设的太长,会影响整体的重传效率
- 如果超时时间设的太短,有可能会频繁发送重复的包
所以TCP为了保证无论在任何环境下都能比较高性能的通信,因此会动态计算这个最大超时时间.
- Linux中(BSD Unix和 Windows也是如此),超时以 500ms为一个单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍.
- 如果重发一次之后,仍然得不到应答,等待 2*500ms后再进行重传.
- 如果仍然得不到应答,等待 4*500ms进行重传.依次类推,以指数形式递增.
重发的次数和操作系统有关。
在ubuntu20.04下是6次

如何理解面向字节流
在创建一个TCP的socket,内核会创建一个发送缓冲区和一个接受缓冲区
- 调用write,数据会先写入发送缓冲区中
- 如果发送的字节流太长,会被拆分成多个TCP的数据发出
- 如果发送的字节数太短,就会先在缓冲区里等待,等到缓冲区长度差不多了,或者等待时机发送出去
- 接收数据的时候, 数据也是从网卡驱动程序到达内核的接收缓冲区
- 然后应用程序可以调用 read 从接收缓冲区拿数据
- 另一方面, TCP 的一个连接, 既有发送缓冲区, 也有接收缓冲区, 那么对于这一
个连接, 既可以读数据, 也可以写数据. 这个概念叫做 全双工
就是由于这个缓冲区的原因,TCP的读和写不再需要一一匹配,例如
- 写 100 个字节数据时, 可以调用一次 write 写 100 个字节, 也可以调用 100 次write, 每次写一个字节
- 读 100 个字节数据时, 也完全不需要考虑写的时候是怎么写的, 既可以一次read 100 个字节, 也可以一次 read 一个字节, 重复 100 次
相关文章:
传输层协议——TCP
TCP协议 TCP全称为“传输控制协议”,要对数据的传输进行一个详细的控制。 特点 面向连接的可靠性字节流 TCP的协议段格式 源/目的端口:表示数据从哪个进程来,到哪个进程4位首部长度:表示该TCP头部有多少字节(注意它…...
C++相关概念和易错语法(23)(set、仿函数的应用、pair、multiset)
1.set和map存在的意义 (1)set和map的底层都是二叉搜索树,可以达到快速排序(当我们按照迭代器的顺序来遍历set和map,其实是按照中序来遍历的,是排过序的)、去重、搜索的目的。 (2&a…...
netty入门-3 EventLoop和EventLoopGroup,简单的服务器实现
文章目录 EventLoop和EventLoopGroup服务器与客户端基本使用增加非NIO工人NioEventLoop 处理普通任务与定时任务 结语 EventLoop和EventLoopGroup 二者大概是什么这里不再赘述,前一篇已简述过。 不理解也没关系。 下面会简单使用,看了就能明白是什么 这…...
通信原理-思科实验五:家庭终端以太网接入Internet实验
实验五 家庭终端以太网接入Internet实验 一实验内容 二实验目的 三实验原理 四实验步骤 1.按照上图选择对应的设备,并连接起来 为路由器R0两个端口配置IP 为路由器R1端口配置IP 为路由器设备增加RIP,配置接入互联网的IP的动态路由项 5.为路由器R1配置静…...
【Vue】vue概述
1、简介 Vue.js(简称Vue)是一款用于构建用户界面的渐进式JavaScript框架。由前Google高级软件工程师尤雨溪(Evan You)于2014年创建,是一个独立且社区驱动的开源项目。Vue.js基于标准的HTML、CSS和JavaScriptÿ…...
Docker use experience
#docker command docker load -i <镜像文件.tar> docker run -it -d --name 容器名 -p 宿主机端口:容器端口 -v 宿主机文件存储位置:容器内文位置 镜像名:Tag /bin/bash docker commit -m"提交的描述信息" -a"作者" 容器ID 要…...
Android平台RTSP|RTMP直播播放器技术接入说明
技术背景 大牛直播SDK自2015年发布RTSP、RTMP直播播放模块,迭代从未停止,SmartPlayer功能强大、性能强劲、高稳定、超低延迟、超低资源占用。无需赘述,全自研内核,行业内一致认可的跨平台RTSP、RTMP直播播放器。本文以Android平台…...
数据结构——栈(顺序结构)
一、栈的定义 栈是一种数据结构,它是一种只能在一端进行插入和删除操作的特殊线性表。这一端被称为栈顶,另一端被称为栈底。栈按照后进先出(LIFO)的原则进行操作(类似与手枪装弹后射出子弹的顺序)。在计算…...
速盾:cdn能防御ddos吗?
CDN(内容分发网络)是一种广泛应用于互联网中的技术,它通过将内容分发到全球各地的服务器上,以提高用户在访问网站时的加载速度和稳定性。然而,CDN是否能够有效防御DDoS(分布式拒绝服务)攻击是一…...
分享 2 个 .NET EF 6 只更新某些字段的方法
前言 EF 更新数据时,通常情况下,是更新全部字段的,但实际业务中,更新全部字段的情况其实很少,一般都是修改其中某些字段,所以为了实现这个目标,很多程序员通常会这样作: 先从数据库…...
vs code解决报错 (c/c++的配置环境 远端机器为Linux ubuntu)
参考链接:https://blog.csdn.net/fightfightfight/article/details/82857397 https://blog.csdn.net/m0_38055352/article/details/105375367 可以按照步骤确定那一步不对,如果一个可以就不用往下看了 目录 一、检查一下文件扩展名 二、安装扩展包并…...
08 字符串和字节串
使用单引号、双引号、三单引号、三双引号作为定界符(delimiter)来表示字符串,并且不同的定界符之间可以相互嵌套。 很多内置函数和标准库对象也都支持对字符串的操作。 x hello world y Python is a great language z Tom said, "Le…...
vue使用mavonEditor(流程图、时序图、甘特图实现)
mavonEditor 安装mavonEditor $ npm install mavon-editor --save使用 // 全局注册import Vue from vueimport mavonEditor from mavon-editorimport mavon-editor/dist/css/index.css// useVue.use(mavonEditor)new Vue({el: #main,data() {return { value: }}})//局部使用…...
Java实现短信验证码服务
1.首先这里使用的是阿里云的短信服务。 package com.wzy.util;; import cn.hutool.captcha.generator.RandomGenerator; import com.aliyun.dysmsapi20170525.Client; import com.wzy.entity.Ali; import org.springframework.stereotype.Component;/*** Author: 顾安* Descri…...
python中的线程
线程 线程概念 线程 在一个进程的内部, 要同时干多件事, 就需要同时运行多个"子任务", 我们把进程内的这些"子任务"叫做线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中, 是进程的实际运作单位。一条线程指的是进程中一个单一顺序的控制流…...
hcip学习 多实例生成树,VRRP工作原理
一、STP 和 RSTP 解决了什么问题 1、STP:解决了在冗余的二层网络中所出现的环路问题 2、RSTP:在 STP 的基础上,解决了 STP 收敛速度慢的问题,引入了一些 STP 保护机制,使其网络更加稳定 二、MSTP 针对 RSTP 的改进 …...
Docker搭建群晖
Docker搭建群晖 本博客介绍在docker下搭建群晖 1.编辑docker-compose.yml文件 version: "3" services:dsm:container_name: dsmimage: vdsm/virtual-dsm:latestenvironment:DISK_SIZE: "16G"cap_add:- NET_ADMIN ports:- 8080:50…...
【java】BIO,NIO,多路IO复用,AIO
在Java中,处理I/O操作的模型主要有四种:阻塞I/O (BIO), 非阻塞I/O (NIO), 异步I/O (AIO), 以及IO多路复用。下面详细介绍这四种I/O模型的工作原理和应用场景。 1. 阻塞I/O (BIO) 工作原理 阻塞I/O是最传统的I/O模型。在这种模型中,当一个线…...
服务器怎样减少带宽消耗的问题?
择业在使用服务器的过程中会消耗大量的带宽资源,而减少服务器的带宽消耗则可以帮助企业降低经济成本,同时还能够提高用户的访问速度,那么服务器怎样能减少带宽的消耗呢?本文就来带领大家一起来探讨一下吧! 企业可以选择…...
linux 报错:bash: /etc/profile: 行 32: 语法错误:未预期的文件结束符
目录 注意错误不一定错在最后一行 i进入编辑 esc退出编辑 :wq 保存编辑退出 :q!不保存退出 if [ $# -eq 3 ] then if [ ! -e "$1" ]; then miss1 $1 elif [ ! -e "$2" -a ! -e "$3" ]; then miss2and3…...
Rydberg原子量子门实现原理与优化技术
1. Rydberg原子平台中的量子门实现基础1.1 Rydberg原子特性与量子计算优势Rydberg原子是指外层电子被激发到高主量子数能级的原子态,这类原子具有三个关键特性使其成为量子计算的理想平台:强偶极-偶极相互作用:当两个原子同时处于Rydberg态时…...
为Alchitry Au FPGA开发板外接JTAG接口的完整指南
1. 项目概述与核心价值如果你正在使用基于Xilinx Artix-7 FPGA的Alchitry Au或Au开发板,并且已经厌倦了每次调试或烧录都要依赖板载的USB-JTAG桥接芯片,或者你的项目已经将板载USB接口挪作他用,那么为你的开发板外接一个独立的JTAG调试器&…...
pan-baidu-download:百度网盘多线程下载加速器架构解析与性能优化指南
pan-baidu-download:百度网盘多线程下载加速器架构解析与性能优化指南 【免费下载链接】pan-baidu-download 百度网盘下载脚本 项目地址: https://gitcode.com/gh_mirrors/pa/pan-baidu-download pan-baidu-download是一款基于Python开发的百度网盘命令行下载…...
光轮智能 谢晨 访谈总结机器人仿真数据产业
光轮智能 谢晨 访谈总结机器人仿真关于创始人关于数据数据金字塔数据痛点仿真数据的重要性仿真数据的质量b站链接地址公司官网关于创始人 清华物理;哥伦比亚金融;英伟达智驾仿真;小鹏智驾仿真;现为光轮智能CEO 关于数据 数据的…...
defx.nvim 安装与配置完全教程:从零开始搭建高效文件管理系统 [特殊字符]
defx.nvim 安装与配置完全教程:从零开始搭建高效文件管理系统 🚀 【免费下载链接】defx.nvim :file_folder: The dark powered file explorer implementation for neovim/Vim8 项目地址: https://gitcode.com/gh_mirrors/de/defx.nvim defx.nvim …...
如何在浏览器中一键解密所有加密音乐文件:Unlock-Music完全指南
如何在浏览器中一键解密所有加密音乐文件:Unlock-Music完全指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地…...
BiliBiliCCSubtitle终极指南:5个实战技巧高效下载B站字幕
BiliBiliCCSubtitle终极指南:5个实战技巧高效下载B站字幕 【免费下载链接】BiliBiliCCSubtitle 一个用于下载B站(哔哩哔哩)CC字幕及转换的工具; 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBiliCCSubtitle 还在为无法保存B站视频字幕而烦恼࿱…...
DeepSeek安全测试辅助Prompt工程白皮书(含17个CVE靶场验证指令模板)
更多请点击: https://intelliparadigm.com 第一章:DeepSeek安全测试辅助 DeepSeek系列大模型在代码生成、漏洞模式识别与安全上下文理解方面展现出独特优势,可作为安全测试工程师的智能协作者。其对OWASP Top 10、CWE分类体系及常见PoC结构具…...
量子机器学习与傅里叶分析:革新期权定价的混合计算范式
1. 项目概述:当量子机器学习遇见金融定价在金融工程的核心地带,期权定价一直是个计算密集型的硬骨头。传统的蒙特卡洛模拟虽然通用,但为了达到足够的精度,动辄需要百万甚至千万次的路径模拟,计算成本高昂。近年来&…...
AutoPentest:面向红队的渗透测试决策引擎架构解析
1. 这不是又一个“自动化扫描器”,而是一套能替你做决策的渗透测试工作流引擎AutoPentest这个名字,第一眼容易让人联想到Nmap加个for循环、或者Burp Suite里点几下Intruder——但实际用过的人很快会意识到:它根本不在同一个维度上。我第一次在…...
