当前位置: 首页 > news >正文

什么是TCP

 

 

1. TCP 是⾯向连接的、可靠的、面向字节流的传输层通信协议

 

288374abe30f4bf8a442bfd8da8bfd64.png

 

 

 面向连接:只能一对一连接,不能一对多

 

 可靠:无论的网络链路中出现了怎样的链路变化,TCP 都可以保证⼀个报文⼀定能够到达接收端(依靠各种机制)

 

 字节流:消息是没有数据边界的(管道也是),不管消息多大都可以传输,并且消息是有序的

 

 

 

 

2. 什么是TCP连接?

⽤于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗口大小称为连接

所以一个TCP连接是需要客户端和服务端达成三个信息的共识:

Socket:IP地址 + 端口号

序列号:用来解决乱序问题

窗口大小:流量控制

 

 

3.TCP协议段格式

b55996f709fe412487733957fea86820.png

源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去

32位的序列号:占4个字节,TCP是面向字节流的,所以在每一个TCP连接中传送的字节流的每一个字节都是按顺序编号,整个要传送的字节流的起始序号必须在建立时设置,通过SYN包传给接收方,主要解决网络包乱序(去重)的问题(接收方更加关心)

32位的确认应答号:占4个字节,是期望收到对方下一个报文段的第一个数据字节的序号,比如说:A给B发送了一个 6 7 8,B返回的应该是 7 8 9,如果A只收到了一个9,那就说明9之前的所有数据B都已经正确收到,主要解决不丢包的问题(发送方更关心)

4位首部长度(也有叫数据偏移):表示该TCP头部有多少个32位bit(有多少个4字节); 所以TCP头部最大长度是15 * 4 = 60

6位保留:保留为今后使用,目前应置为0

URG(紧急:URGent):当URG = 1时,表示当前报文段中存在优先处理的数据,也叫带外数据(OOB:out of band),不要按原来的排队顺序发送,会把数据紧急插入到本报文段的最前面,这时就和后面的的16位紧急指针配合使用,可以理解为一种数据的插队机制

ACK(确认:ACKnowledegment):仅当ACK = 1时,确认号字段才有效,ACK = 0时,确认号无效

PSH(推送:Push):提示接收端应用程序立刻从TCP缓冲区把数据读走,比如:A和B正在通信,A端的一个进程希望立刻获得B端的回应,这时A端就把PSH置为1,立即创建一个报文段发送出去,B端收到后,尽快交付给上层的进程,不需要等待缓冲区填满再向上交付

RST(复位:Reset):RST = 1时,说明TCP连接出现了问题,必须释放连接,然后再重新建立连接,RST还可以用来拒绝一个非法的报文段或者拒绝打开一个连接,RST也可以叫做重置位

SYN(同步:SYNchronization):在连接建立时用来同步序号,当SYN = 1,ACK = 0时,说明这是一个连接请求报文段,如果对方同意,在响应报文段中SYN = 1,ACK = 1

FIN(完结:Finis):用来释放一个连接,当FIN = 1时,表示数据发送完毕,并要求断开连接

16位窗口大小:占2字节,窗口指的是发送本报文段的一方的接收窗口(而不是自己的发送窗口),窗口值会告诉对方:从现在开始,我只要多少的数据,是因为接收方的缓冲区大小是有限制的,窗口字段明确指出了现在允许对方发送的数据里量

16位校验和:占2字节,发送端填充, CRC校验. 接收端校验不通过, 则认为数据有问题. 此处的检验和不光包含TCP首部, 也包含TCP数据部分

16位紧急指针:占2字节,紧急指针只有在URG = 1时才有意义,实际是一段偏移量,指出紧急数据的末尾在报文段的位置

 

 

 

4.TCP主要特点

TCP是面向连接的运输层协议

每一条TCP连接只能由两个端点,每一条TCP连接只能是点对点的

TCP提供可靠交付的服务,通过TCP连接传送的数据,无差错,不丢失,不重复,并且按序到达

面向字节流

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • vue3+TS从0到1手撸后台管理系统
  • rust + python+ libtorch
  • python用selenium网页模拟时xpath无法定位元素解决方法2
  • Spark中的JOIN机制
  • 集合的定义和特点
  • springboot个人证书管理系统-计算机毕业设计源码16679
  • <数据集>夜间车辆识别数据集<目标检测>
  • 设计模式-概述*
  • 记录些MySQL题集(9)
  • 深入解析PHP框架:Symfony框架详解与应用
  • 使用MovaXterm连接VMware的centos
  • 数据库管理-第221期 Oracle的高可用-04(20240717)
  • OpenCV下的单目标定,双目标定与立体校正(calibrateCamera, stereoCalibrate and stereoRectify)
  • Linux网络编程-socket套接字使用详解
  • 简约唯美的404HTML源码
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • CentOS从零开始部署Nodejs项目
  • classpath对获取配置文件的影响
  • isset在php5.6-和php7.0+的一些差异
  • js写一个简单的选项卡
  • Making An Indicator With Pure CSS
  • Rancher如何对接Ceph-RBD块存储
  • session共享问题解决方案
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • Spring Cloud中负载均衡器概览
  • Zepto.js源码学习之二
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 记录一下第一次使用npm
  • 如何解决微信端直接跳WAP端
  • 听说你叫Java(二)–Servlet请求
  • 怎么把视频里的音乐提取出来
  • Python 之网络式编程
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • (33)STM32——485实验笔记
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (vue)页面文件上传获取:action地址
  • (二)PySpark3:SparkSQL编程
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!
  • (转)Linux整合apache和tomcat构建Web服务器
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .apk 成为历史!
  • .env.development、.env.production、.env.staging
  • .Net CoreRabbitMQ消息存储可靠机制
  • .net core使用ef 6
  • .NET MVC 验证码
  • .Net Winform开发笔记(一)
  • .NET企业级应用架构设计系列之开场白
  • @Not - Empty-Null-Blank
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • [《百万宝贝》观后]To be or not to be?
  • [ajaxupload] - 上传文件同时附件参数值
  • [c#基础]值类型和引用类型的Equals,==的区别