创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
更多计算机网络知识专栏:计算机网络🔥
给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ
一、TCP协议的特点
TCP 是⾯向连接的、可靠的、基于字节流的传输层通信协议
- 1.⾯向连接的:⼀定是⼀对⼀才能连接,不能像 UDP 协议可以⼀个主机同时向多个主机发送消息,也就是⼀对多是⽆法做到的
- 2.可靠的:⽆论的⽹络链路中出现了怎样的链路变化,TCP 都可以保证⼀个报⽂⼀定能够到达接收端。可靠有序,不丢不重
- 3.字节流:消息是没有边界的,所以⽆论我们消息有多⼤都可以进⾏传输。并且消息是有序的,当前⼀个消息没有收到的时候,即使它先收到了后⾯的字节,那么也不能扔给应⽤层去处理,同时对重复的报⽂会⾃动丢弃
二、TCP协议头结构
首先是源端口和目的端口,共占32个字节。这两个是UDP中也有的,但是UDP中只有这两个,没有后面的校验数据
序列号:在建立连接时由计算机生成的随机数作为初始值,发送端和接收端每发送一次数据,就累加一次数据大小。
序列号保证了网络包不会乱序
确认号:指下一次期望收到的数据的序列号,发送端收到确认应答后代表确认序号之前的网络包都已成功收到
确认应答号保证了不丢包
数据偏移:首部长度
控制位: 哪一位置为1,对应的字段变为有效
-
URG:紧急指针,标明此报文段中有紧急数据,是高优先级的数据,应尽快传送,不用在缓存里排队,配合紧急指针字段使用
-
ACK:ACK=1时确认号有效,除了最初SYN包,其余ACK都置为1
-
PSH:推送位,接收方尽快交付接收应用进程,不再等到缓存填满再向上交付
-
RST:表明TCP连接中出现严重差错,必须释放连接,然后再重新建立传输链接
-
SYN:连接请求/连接接受报文,最初需要设定序列号初始值
-
窗口:指的是发送本报文段的一方的接收窗口,即现在允许对方发送的数据量
-
检验和:检验首部和数据部分长度
-
紧急指针: URG=1时才有意义,指出本报文段中紧急数据的字节数
-
选项:最大报文段长度MSS、窗口扩大、时间戳、选择确认…
三、ACK确认应答机制
一个客户端和服务端进行数据传输的简单示例
如下图:
当客户端发送一个数据包时,它将包含一个序列号seq,以便服务端可以确认数据包的顺序
当服务端收到数据包时,它将通过发送一个带有确认号ack=N+1的ACK包来确认收到N号数据包。这个确认号N+1表示下一个期望接收的数据包序列号,也代表101之前的包我都收到了
在客户端,每次发送完一个数据包后,它都会等待服务端的确认。当客户端收到服务端返回的ack=N+1
的确认包ACK时,它会知道服务端已经成功接收到了上一个1—100的数据包。然后,客户端可以继续发送下一个数据包
四、超时重传机制
TCP在传输数据的过程中,为了确保数据的可靠传输,采用了超时重传机制
即TCP的发送方在规定的时间内没有收到确认就要重传已发送的报文段
- 情况1:数据包丢失
在客户端发送数据后,如果在规定时间没有收到服务端回复的ack(超过超时时间),那么就证明我们发送包丢失,重新给服务端重新发送上次丢失的包(没有收到ack回应的包),直到在规定时间收到服务端回复的ack
- 情况2:确认应答包丢失
在规定时间(超过超时时间)内没有收到服务端回复的ack包,就再次发送一遍数据,服务端已经接收过这个数据不会再次处理,把重复的包丢弃,然后重新回复一遍ack
往返时延RTT和超时重传时间RTO
RTT:数据从⽹络⼀端传送到另⼀端所需的时间,也就是包的往返时间
RTT表示从发送端发送数据开始,到发送端接收到来自接收端的确认(ACK),总共经历的时延。也就是从发送数据到收到ack的时间
RTT由三个部分决定:
1.链路的传播时间
2.末端系统的处理时间
3.路由器的缓存中的排队和处理时间
RTO:超时重传时间,指发送方发送数据后,等待接收方确认的时间
TCP每发送一个报文段,就会对这个报文段设置一个超时重传计时器,此时计时器设置的超时重传时间RTO应略大于TCP报文段的平均往返时延RTT,一般取RTO=2RTT
** **
大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。 |
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●) |