什么是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连接传送的数据,无差错,不丢失,不重复,并且按序到达

面向字节流

相关推荐

  1. 什么TCP

    2024-07-17 06:36:03       21 阅读
  2. 什么TCP粘包?

    2024-07-17 06:36:03       37 阅读
  3. 什么TCP/IP协议

    2024-07-17 06:36:03       23 阅读
  4. TCP什么、UDP什么,它们有什么区别

    2024-07-17 06:36:03       28 阅读
  5. TCP和UDP的区别什么

    2024-07-17 06:36:03       61 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-17 06:36:03       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-17 06:36:03       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-17 06:36:03       57 阅读
  4. Python语言-面向对象

    2024-07-17 06:36:03       68 阅读

热门阅读

  1. STM32微控制器的高级控制算法(内附资料)

    2024-07-17 06:36:03       28 阅读
  2. Python编码规范详解

    2024-07-17 06:36:03       22 阅读
  3. 类和对象-继承-菱形继承问题以及解决方法

    2024-07-17 06:36:03       23 阅读
  4. LlaMa 2

    2024-07-17 06:36:03       23 阅读
  5. IPython的文件魔术:%%file命令全攻略

    2024-07-17 06:36:03       26 阅读