【计算机网络】TCP协议详解

这篇具有很好参考价值的文章主要介绍了【计算机网络】TCP协议详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. TCP协议头部格式

2. TCP协议原理 

2.1 可靠传输机制

2.1.1 确认应答机制

2.1.2 超时重传机制

2.1.3 连接管理机制(三次握手,四次挥手)

2.1.4 流量控制

2.1.5 拥塞控制 

2.2 效率机制 

2.2.1 滑动窗口 

2.2.2 延迟应答 

2.2.3 捎带应答 

3. 粘包问题 

4. TCP的异常情况 

5. TCP协议特点总结

6. 基于TCP的应用层协议 


1. TCP协议头部格式

tcp协议,网络,tcp,网络协议,网络

  • 源/目的端口:表示数据从哪个进程发送,发送到哪个进程去
  • 32位序号:发送的数据按照一个字节一个编号存放进去
  • 32位确认号:用于给对方的响应,值为收到TCP报文段的序号值加1(表示当前的应答报文针对的是哪个消息进行的确认应答)
  • 4位TCP报头长度:表示TCP头部有4个字节(32位),所以TCP头部最大长度为15*4=60
  • 6个boolean值标志位:

URG:紧急指针是否有效
ACK:确认号是否有效
PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走
RST:对方要求重新建立连接,把携带RST标识的称为复位报文段
SYN:请求建立连接,把携带SYN标识的称为同步报文段
FIN:通知对方,要关闭连接了,把携带FIN标识的称为结束报文

  • 16位窗口大小:进行流量窗口控制
  • 16位校验和:检验数据是否一致
  • 16位紧急指针:标识哪部分数据是紧急数据

2. TCP协议原理 

TCP协议是对数据传输提供的一个管控机制,主要体现在可靠和效率两个方面,即在保证数据可靠传输的情况下尽可能的提高效率 

2.1 可靠传输机制

2.1.1 确认应答机制

向对方发送一个数据报,对方要返回一个确认应答的数据报 

实现的方式:序号和确认序号保证了响应应答针对的是哪一条消息的应答

tcp协议,网络,tcp,网络协议,网络

说明:

  • 发送的数据是基于TCP报头中的“32位序号”来保存的,一个字节对应一个序号
  • 确认应答的数据是基于TCP报头中的“32位确认序号”来保存的,ack(确认信息)标志位置为1,返回某个序列号,说明某个序列号之前的数据全部接收到
  • 有了确认应答,它才可以继续发送后边的数据

2.1.2 超时重传机制

发送的数据报可能因为网络拥堵等原因,超过一定时间,还没有收到确认应答的数据报,就需要重新发送 

  • 没有收到确认应答,可能是因为发送数据时候就已经发生了丢包

tcp协议,网络,tcp,网络协议,网络  

  • 也可能是因为ACK丢包了 

 tcp协议,网络,tcp,网络协议,网络

这种情况,主机B可能会接收到许多重复的数据,TCP内部有去重操作,接收的数据会放在操作系统内核的接收缓冲区中,接收缓冲区可以是一个内存空间,视为是一个阻塞队列,对于收到的数据,TCP会根据序号检查这个数据是不是在缓冲区中已经存在,如果存在则丢弃,如果不存在则放进去

超时时间如何确定?

如果超时时间设置的太长,会导致重传的效率
如果超时时间设置的太短,会导致频繁发送重复的数据

因此TCP协议为了保证在任何环境中都能有较高性能的通信,系统会动态的计算这个超时时间

  • 超时以500ms为一个单位,每次判定超时重发的时间都是500ms的整数倍
  • 重发一次,仍然不能收到应答,等待2*500ms后再进行重传
  • 仍然等不到应答,等待4*500ms进行重传,以此类推,以指数形式增长
  • 累积到一定重传次数,TCP协议认为网络或者对端主机出现异常,强制关闭连接

2.1.3 连接管理机制(三次握手,四次挥手)

真正发送数据之前,要先通过三次握手建立连接,不需要发送数据了,通过四次挥手断开连接

三次握手

tcp协议,网络,tcp,网络协议,网络  

  1. 客户端向服务端发送SYN,申请建立客户端到服务端的连接
  2. 服务端返回ACK(第一次SYN的应答)和SYN,申请建立服务端到客户端的连接
  3. 客户端收到数据,状态置为ESTABLISHED,表示客户端到服务端连接建立完成,并且发送ACK(第二次SYN的应答),服务端收到数据,状态置为ESTABLISHED,表示服务端到客户端的连接建立完成

三次握手主要是为了检查当前网络的情况是否满足可靠运输的基本条件,同时也是在检测双方发送和接收数据的能力是否正常 

四次挥手 

tcp协议,网络,tcp,网络协议,网络

说明:关闭的时候服务端申请关闭或者客户端申请关闭都可以

  1. 客户端发送FIN到服务端,申请关闭客户端到服务端的连接
  2. 服务端收到FIN状态置为CLOSE_WAIT,并返回ACK应答(这个动作是系统实现TCP协议栈默认执行的,不需要程序来调用代码)
  3. 服务端发送FIN到客户端,申请关闭服务端到客户端的连接(程序手动调用socket.close发送)
  4. 客户端收到FIN返回ACK应答,并进入TIME_WAIT时间等待状态,客户端等待一段时间后,状态置为CLOSED,服务端收到应答后,状态置为CLOSED

思考:

  • 为什么服务端不将ACK和FIN合并一起发送,形成三次挥手呢?

答:主要是ACK和FIN的发送时机不同,ACK是操作系统内核响应的(立即执行),而此时服务端还可能在继续发送数据,待处理完数据后由程序调用close方法后才发送FIN

  • 为什么客户端要等待一段时间状态才置为CLOSED,而不之间将状态置为CLOSED?

答:如果客户端给服务端的ACK丢包后,服务端得重新给和客户端发送FIN,此时客户端得给服务端应答,所以此时状态不能置为CLOSED,得等待一段时间(2MSL,MSL为网络上任意两点传输的最大时间)确保服务端收到客户端的应答 

2.1.4 流量控制

接收端主机处理数据的速度有限,如果发送端发送数据太快,导致接收端缓冲区被填满,这时,发送端继续发送数据的话就会造成丢包,继而引起丢包重传等一些列连锁反应,因此TCP协议根据接收端接收数据的能力,来决定发送端发送数据的速度,这个机制就叫作流量控制 

  • 接收端将自己剩余缓冲区大小存入TCP头部中的“16位窗口大小”字段 ,通过ACK通知发送端
  • 窗口大小越大,说明网络吞吐量越高
  • 发送端根据接收到这个窗口的大小,控制自己的发送速度
  • 如果接收缓冲区满了,就会将窗口设置为0,这时,发送端不在发送数据,而是定期的发送一个窗口探测报文(只是为了知道窗口的大小),让接收端将窗口大小告诉发送端

2.1.5 拥塞控制 

刚开始发送数据时,由于中间结点的网络情况不清楚,如果贸然发送大量数据,就会造成大量丢包,所以TCP协议引入慢启动的方式,先发少量数据探探路,再决定按照多大速度发送数据

此处引入拥塞窗口,刚开始时,拥塞窗口设置为1,每收到一个ACK时,拥塞窗口加1,每次发送数据的时候,拥塞窗口和流量窗口的较小的值作为实际发送的窗口,即滑动窗口的大小 

注意:上述增长方式是指数级别的,指数式增长可以快速接近丢包的极限

拥塞窗口变化的方式 

为了不增长那么快,引入一个慢启动的阈值,当拥塞窗口的大小超过了这个阈值,不在按照指数方式增长,而是按照线性方式增长,如下图所示:

tcp协议,网络,tcp,网络协议,网络

开始时,慢启动的阈值为窗口的最大值,线性增长到一定程度时会发生丢包
网络拥塞时,拥塞窗口置1,慢启动阈值变为拥塞窗口/2,重新开始增长

2.2 效率机制 

2.2.1 滑动窗口 

前面的确认应答机制指出,对每一个发送的数据都对应有一个ACK确认应答,这样采取一发一收的方式有一个很大的缺点就是效率太差,为了提高效率采用滑动窗口,即一次性发送多个数据

tcp协议,网络,tcp,网络协议,网络

  • 窗口大小:指无需等待而可以继续发送数据的最大值,上图的窗口大小为4000个字节(四个段)
  • 具体如何设置窗口大小:min(流量窗口的大小,拥塞窗口的大小) 
  • 窗口如何滑动:接收到的ACK下一个是n,滑动到n-1的位置

操作系统内核为了维护这个滑动窗口,需要开辟发送缓冲区来记录当前还有哪些数据没有应答,只有应答过的数据才能从缓冲区中删掉

如果出现了丢包,如何确保可靠传输?

  • 情况一:数据已经收到,返回的ACK应答丢包

tcp协议,网络,tcp,网络协议,网络

这种情况下,部分ACK丢了不要紧,因为可以通过后续的ACK进行确认 

  • 情况二:发送数据的时候就已经丢包 

tcp协议,网络,tcp,网络协议,网络

说明:

  • 当1001~2000这段报文丢失后,发送端一直会收到1001这样的ACK
  • 如果发送端主机连续三次收到相同的ACK如1001应答,那发送端主机就会重新发送1001~2000数据
  • 此时,接收端收到1001~2000数据后,再次返回的ACK应答就是7001了,因为2001~7000数据都已经接收到了,被放到接收端操作系统内核的接收缓冲区了

这种机制,即时不超时也会发生重传,称作“高速重发控制”也叫“快重传机制” 

2.2.2 延迟应答 

如果接收端主机接收到数据时,立刻返回ACK应答,这时候返回的流量窗口就比较小,但是流量窗口越大,网络吞吐量越大,传输效率就越高,所以等待一部分时间,待接收端处理完一部分数据 ,就可以将流量窗口设置为大一点的值,这样网咯吞吐量大,效率高

延迟是为了高吞吐量,但是也不能无限延迟

  • 数量限制,每隔n个包就应答一次
  • 时间限制,超过最大延迟时间,就应答一次

具体的数量和时间,不同操作系统有差异,一般n取2,超时时间取200ms 

2.2.3 捎带应答 

服务端接收到客户端的消息后,因为延迟应答机制,导致ACK不一定立即返回,可能ACK返回的时机和应用代码中返回响应的时机重合了,此时九江

3. 粘包问题 

TCP是面向字节流的,可以多次的接收和发送,对于应用层来说,一连串的字节数据,不知道从哪到哪算一个完整的应用层数据包,对应发送多少次算一个应用层完整格式的数据,和接收多少次算一个应用层完整格式的数据就不知道了

如何解决粘包问题?明确包的边界

  • 对于定长的包,每次都按照固定大小读取即可
  • 对于变长的包,可以在包与包之间明确分隔符(应用协议,程序员自己定,只要保证分隔符和正文不起冲突即可) 

4. TCP的异常情况 

  • 进程终止:进程终止会释放文件描述符,仍然可以发送FIN,和正常关闭没有什么区别
  • 机器重启:和进程终止的情况相同
  • 机器掉电/网线断开:接收端认为连接还在,一旦接收端有写入操作,接收端发现连接已经不在了就会进行reset,即使没有写入操作,TCP自己也内置了一个保活定时器,会定期询问对方是否还在,如果对方不在,也会把连接释放
  • 另外,应用层的某些协议,也有一些这样的检测机制,例如HTTP长连接中,也会定期检测对方的状态,例如QQ,在QQ断线之后,也会定期尝试重新连接 

5. TCP协议特点总结

  • 有连接:通过三次握手建立连接后才可接发数据,TCP协议是全双工的,即每端既可以发也可以收
  • 可靠传输:网络数据传输是一跳一跳的,经过路途中的设备可能发生数据丢失,可靠传输是可能发生数据丢失但有机制保证对方能接收到
  • 面向字节流:可以多次的收发数据(连接没有关闭时,可以多次的接收和发送数据)
  • 有接收缓冲区和发送缓冲区:发送数据时,是先写到发送缓冲区,再刷新缓冲区(flush)
  • 大小不受限制:多次的收发数据,每次的数据可以很大 

6. 基于TCP的应用层协议 

  • HTTP
  • HTTPS
  • SSH
  • Telnet
  • FTP
  • SMTP

也包括自己写TCP程序时自定义的应用层协议 文章来源地址https://www.toymoban.com/news/detail-802317.html

到了这里,关于【计算机网络】TCP协议详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机网络-TCP协议

    TCP被称为面向连接的,因为在应用程序开始互传数据之前,TCP会先建立一个连接,该连接的建立涉及到 三次“握手 ”。 TCP的连接不是一条真实存在的电路,而是一条逻辑链接 ,其共同状态仅保留在两个通信端系统的TCP程序中。 TCP连接也是点对点的,即TCP连接只能存在于一

    2024年02月08日
    浏览(56)
  • 【计算机网络】TCP协议

    实验目的 应用所学知识: 1. 熟悉 TCP 的协议格式。 2. 理解 TCP 对序列号和确认号的使用。 3. 理解 TCP 的流量控制算法和拥塞控制算法。 实验步骤与结果 1.任务一: 将Alice.txt上传到服务器: 使用wireshark捕获数据包,看到计算机和gaia.cs.umass.edu之间的一系列 TCP 和 HTTP 通信,包

    2023年04月20日
    浏览(55)
  • 05.计算机网络——TCP协议

    TCP协议——TCP全称为 “ 传输控制协议 (Transmission Control Protocol)”,对数据的传输进行一个详细的控制。 源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去; 32位序号/32位确认号: 用来支持确认应答和按序到达 4位TCP报头长度: 表示该TCP报头有多少个4字节大小; 6位标志位

    2024年02月16日
    浏览(51)
  • 【计算机网络篇】TCP协议

    ✅作者简介:大家好,我是小杨 📃个人主页:「小杨」的csdn博客 🐳希望大家多多支持🥰一起进步呀! TCP(Transmission Control Protocol)是一种在计算机网络中广泛使用的传输层协议,用于在网络上可靠地传输数据。 TCP 提供了可靠的、面向连接的通信,并负责数据的划分、排

    2024年02月11日
    浏览(52)
  • 【计算机网络】传输层协议 -- TCP协议

    认识可靠性 现在的计算机大多都是基于冯诺依曼体系结构的 虽然这里的输入设备、输出设备、内存、CPU是在同一个机器上的,但是它们彼此间却是相互独立的。如果它们之间要进行通信,那就必须要用“线”连接起来,其中连接内存和外设之间的“线”叫做IO总线,连接CP

    2024年02月14日
    浏览(56)
  • 【计算机网络】UDP协议与TCP协议

    端口号(Port)标识了一个主机上进行通信的不同的应用程序; 在TCP/IP协议中, 用 “源IP”, “源端口号”, “目的IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信(可以通过netstat -n查看); 服务器的同一个服务会使用多进程或者多线程的方式,对于不同的客户端请

    2024年01月25日
    浏览(60)
  • 【计算机网络】UDP/TCP 协议

    端口号(Port)标识了一个主机上进行通信的不同的应用程序。在 TCP/IP 协议中, 用 “源IP”, “源端口号”, “目的IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信(可以通过netstat -n查看)。 0 - 1023: 知名端口号,HTTP, FTP, SSH 等这些广为使用的应用层协议,它们的

    2024年03月14日
    浏览(62)
  • 【计算机网络-传输层】TCP 协议

    端到端通信 :提供应用进程间的端到端通信(逻辑通信)。因此传输层又称为端到端协议。 差错检测 :对首部和数据部分进行检测。 两种协议 :面向连接的 TCP、无连接的 UDP。 复用和分用 : 概念 解释 传输层 TCP 复用 发送方的部分应用进程的报文在传输层使用 TCP 协议进

    2023年04月13日
    浏览(50)
  • 【计算机网络】UDP/TCP协议

    我们先来看一张图; 在研究UDP前我们先来回答两个问题: 有效载荷如何与报头分离? 如何将有效载荷交付? 第一个问题由于在报头里面有16位UDP长度(表示的是有效载荷+报头长度),而报头长度8字节是固定的,所以分离时我们只需要用整个报文的大小减去固定的8字节报头数据即

    2024年02月08日
    浏览(65)
  • 【计算机网络】TCP|IP协议

    目录 前言 什么是TCP/IP协议? TCP/IP协议的层次结构 TCP/IP协议的工作原理 TCP/IP协议的重要性 结语   TCP/IP协议是当今互联网世界中最重要的网络协议之一,它是网络通信的基石,为数据在网络中的传输提供了可靠性和有效性。本文将深入探讨TCP/IP协议的重要性、基本原理以及其

    2024年02月03日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包