面试不再慌,终于有人把TCP讲明白了。。。

前言TCP(Transmission Control Protocol,传输控制协议) 是计算机网络的的重要组成部分,也是网络编程的重要内容,还有我们平时接触最多的 HTTP 也是基于 TCP 实现的。TCP 可以说是最重要的传输层协议,既然如此,作为开发人员,就有必要把 TCP 的核心概念和原理搞清楚。除此之外,诸如三次握手、四次挥手、滑动窗口和拥塞控制这些概念更是高频面试题,这就更有理由深入学习一下 TCP 了,本文就为大家详细梳理一下 TCP 的核心概念和原理。注:由于本文图片较多,标注有 b..
摘要由CSDN通过智能技术生成

如果你正在准备面试TCP,看这一篇就够了

前言

TCP(Transmission Control Protocol,传输控制协议) 是计算机网络的的重要组成部分,也是网络编程的重要内容,还有我们平时接触最多的 HTTP 也是基于 TCP 实现的。TCP 可以说是最重要的传输层协议,既然如此,作为开发人员,就有必要把 TCP 的核心概念和原理搞清楚。除此之外,诸如三次握手、四次挥手、滑动窗口和拥塞控制这些概念更是高频面试题,这就更有理由深入学习一下 TCP 了,本文就为大家详细梳理一下 TCP 的核心概念和原理。注:由于本文图片较多,标注有 by HYN 的图片为作者自制,其它来自于网络或参考资料,侵删

一、TCP 简介

第一部分先为大家介绍一下 TCP 的主要概念,并讲解一下 TCP 的三个重要特性——1. 面向连接;2. 基于字节流;3. 可靠性。

关于网络分层的概念实在是老生常谈了,下图就是两种经典的分层模型,可以看到 TCP 在网络分层中的位置。

网络分层模型

本文重点对 TCP 进行介绍,从图中可以看到 TCP 位于传输层,而且构建于网络层的 IP 协议之上,对于 TCP 最常见的介绍就是 “TCP 是一种面向连接的、可靠的、基于字节流的传输层通信协议”,那这三个形容词究竟是什么意思呢?

1.1 面向连接

面向连接意味着两个使用 TCP 的应用 (通常是一个客户端和一个服务器) 在彼此交换数据之前必须先建立一个 TCP 连接。这一过程与打电话很相似,先拨号响铃,等对方应答后后再说明是谁。详细的三次握手、四次挥手过程将在第二部分——连接管理部分进行介绍。

1.2 基于字节流

TCP 连接双方的数据交换格式是以字节 (byte,1byte = 8 bit)构成的有序但无结构的字节流。TCP 不在字节流中插入记录标识符,这被称为字节流服务(byte stream service)。如果一方的应用程序先传 10 字节,又传 20 字节,再传 50 字节 ,连接的另一方将无法了解发方每次发送了多少字节。收方可以分 4 次接收这 80 个字节,每次接收 20 字节。一端将字节流放到 TCP 连接上,同样的字节流将出现在 TCP 连接的另一端。另外,TCP 对字节流的内容不作任何解释,TCP 无法知道传输的数据字节流是二进制数据,还是 ASCI I 字符。

如果觉得上面这段话比较抽象的话,可以拿 TCP 的字节流和 UDP 的报文 (message) 进行比较( UDP:User Datagram Protocol,用户数据报协议,和 TCP 同为传输层的协议,后面会提供两者的全面对比 )。TCP 的字节流类似于自来水,连接双方都有缓冲区,可以类比成蓄水池,发送方的发送频率和每次的发送量没有固定要求,接收方也可以自由决定自己的接收频率和每次的接收量,只要把所有的数据接收完毕即可。而 UDP 的数据报则类似于瓶装水 (比如农夫山泉),发送方发送一瓶,接收方就要相应地接收一瓶。

下图描述了 TCP 连接中数据的传输过程以及 TCP 在整个过程中所扮演的角色。

TCP 在网络数据传输中的位置和角色

按照图中的流程,比如我们在浏览 B 站,在 TCP 连接建立之后,客户端的应用层协议可以向 TCP 发送无特殊格式的字节流,TCP 会将这些字节打包成报文段(segment),报文段大小视情况而定,这些报文段会被网络层的 IP 封装成 IP 数据报(IP Datagram),然后经过网络传输给服务器,而接下来服务器的操作相当于客户端的逆操作,先从 IP 数据报中拆分出 TCP 报文段,再把 TCP 报文段还原成字节流并发送给上层的应用层协议。服务器向客户端发送数据的流程也是一样的,发送方和接收方的角色互换即可。

报文段简介

上面多次提到了报文段的概念,其结构非常重要,后面的连接过程和拥塞控制等内容也要用到相关概念,先在这里介绍一下。

TCP 报文段结构

图的上半部分显示 TCP 报文段被封装在 IP 数据报中,图的下半部分则显示了 TCP 报文段和 TCP 首部的结构,TCP 首部的固定数据有 20 字节,加上选项部分最大可达 60 字节,而有效数据部分则是被打包的应用层数据。下面介绍一下 TCP 首部的结构:

  • 端口号 (Source Port and Destination Port):每个 TCP 报文段都包含源端和目的端的端口号,用于寻找发送端和接收端应用进程。这两个值加上 IP 首部中的源端 IP 地址和目的端 IP 地址就可以确定一个唯一的 TCP 连接。

  • 序号 (Sequence Number):这个字段的主要作用是用于将失序的数据重新排列。TCP 会隐式地对字节流中的每个字节进行编号,而 TCP 报文段的序号被设置为其数据部分的第一个字节的编号。序号是 32 bit 的无符号数,取值范围是 0 到 2 32 - 1。

  • 确认序号 (Acknowledgment Number):接收方在接受到数据后,会回复确认报文,其中包含确认序号,作用就是告诉发送方自己接收到了哪些数据,下一次数据从哪里开始发,因此,确认序号应当是上次已成功收到数据字节序号加 1。只有 ACK 标志为 1 时确认序号字段才有效。

  • 首部长度 (Header Length):首部中的选项部分的长度是可变的,因此首部的长度也是可变的,所以需要这个字段来明确表示首部的长度,这个字段占 4 bit,4 位的二进制数最大可以表示 15,而首部长度是以 4 个字节为一个单位的,因此首部最大长度是 15 * 4 = 60 字节。

  • 保留字段 (Reserved):占 6 位,未来可能有具体用途,目前默认值为 0.

  • 控制位 (Control Bits):在三次握手和四次挥手中会经常看到 SYN、ACK 和 FIN 的身影,一共有 6 个标志位,它们表示的意义如下:URG (Urgent Bit):值为 1 时,紧急指针生效 ACK (Acknowledgment Bit):值为 1 时,确认序号生效 PSH (Push Bit):接收方应尽快将这个报文段交给应用层 RST (Reset Bit):发送端遇到问题,想要重建连接 SYN (Synchronize Bit):同步序号,用于发起一个连接 FIN (Finish Bit):发送端要求关闭连接

  • 窗口大小 (Window): TCP 的流量控制由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端正期望接收的字节。窗口大小是一个 16 bit 字段,单位是字节, 因而窗口大小最大为 65535 字节。

  • 检验和 (Checksum):功能类似于数字签名,用于验证数

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值