知道一些基础的人都知道,上篇知识点讲过了:网工协议基础(1) OSI七层模型,里面提及OSI设计了个七层模型作参考。

欢迎关注微信公众号【厦门微思网络】。www.xmws.cn专业IT认证培训19周年
主要课程:思科、华为、红帽、ORACLE、VMware、CISP、PMP等认证培训及考证

后来有大佬发现,觉得七层模型好复杂,那还是简化一下吧,分为两层,软件部分叫应用层,硬件部分叫物理层。

但是,改了以后又有人跳出来说,这样改的太简单了,失去了精髓,所以,就有了今天的主角,TCP/IP,作为两个新成员,夹在软硬件两层之间。

TCP 协议的作用

互联网由一整套协议构成。TCP 只是其中的一层,有着自己的分工。

图 | TCP 是以太网协议和 IP 协议的上层协议,也是应用层协议的下层协议。

最底层的以太网协议(Ethernet)规定了电子信号如何组成数据包(packet),解决了子网内部的点对点通信。

图 | 以太网协议解决了局域网的点对点通信

但是,以太网协议不能解决多个局域网如何互通,这由 IP 协议解决。

图| IP 协议可以连接多个局域网

IP 协议定义了一套自己的地址规则,称为 IP 地址。它实现了路由功能,允许某个局域网的 A 主机,向另一个局域网的 B 主机发送消息。

图 | 路由器就是基于 IP 协议,局域网之间要靠路由器连接。

路由的原理很简单。市场上所有的路由器,背后都有很多网口,要接入多根网线。路由器内部有一张路由表,规定了 A 段 IP 地址走出口一,B 段地址走出口二,......通过这套"指路牌",实现了数据包的转发。

图 | 本机的路由表注明了不同 IP 目的地的数据包,要发送到哪一个网口(interface)。

IP 协议只是一个地址协议,并不保证数据包的完整。如果路由器丢包(比如缓存满了,新进来的数据包就会丢失),就需要发现丢了哪一个包,以及如何重新发送这个包。这就要依靠 TCP 协议。

简单说,TCP 协议的作用是,保证数据通信的完整性和可靠性,防止丢包。

TCP 数据包的大小

以太网数据包(packet)的大小是固定的,最初是1518字节,后来增加到1522字节。其中, 1500 字节是负载(payload),22字节是头信息(head)。

IP 数据包在以太网数据包的负载里面,它也有自己的头信息,最少需要20字节,所以 IP 数据包的负载最多为1480字节。

图 | IP 数据包在以太网数据包里面,TCP 数据包在 IP 数据包里面。

TCP 数据包在 IP 数据包的负载里面。它的头信息最少也需要20字节,因此 TCP 数据包的最大负载是 1480 - 20 = 1460 字节。由于 IP 和 TCP 协议往往有额外的头信息,所以 TCP 负载实际为1400字节左右。

因此,一条1500字节的信息需要两个 TCP 数据包。HTTP/2 协议的一大改进, 就是压缩 HTTP 协议的头信息,使得一个 HTTP 请求可以放在一个 TCP 数据包里面,而不是分成多个,这样就提高了速度。

图 | 以太网数据包的负载是1500字节,TCP 数据包的负载在1400字节左右。

TCP 数据包的编号(SEQ)

一个包1400字节,那么一次性发送大量数据,就必须分成多个包。比如,一个 10MB 的文件,需要发送7100多个包。

发送的时候,TCP 协议为每个包编号(sequence number,简称 SEQ),以便接收的一方按照顺序还原。万一发生丢包,也可以知道丢失的是哪一个包。

第一个包的编号是一个随机数。为了便于理解,这里就把它称为1号包。假定这个包的负载长度是100字节,那么可以推算出下一个包的编号应该是101。

这就是说,每个数据包都可以得到两个编号:自身的编号,以及下一个包的编号。接收方由此知道,应该按照什么顺序将它们还原成原始文件。

图 | 当前包的编号是45943,下一个数据包的编号是46183,由此可知,这个包的负载是240字节。

TCP 数据包的组装

收到 TCP 数据包以后,组装还原是操作系统完成的。应用程序不会直接处理 TCP 数据包。

对于应用程序来说,不用关心数据通信的细节。除非线路异常,收到的总是完整的数据。应用程序需要的数据放在 TCP 数据包里面,有自己的格式(比如 HTTP 协议)。

TCP 并没有提供任何机制,表示原始文件的大小,这由应用层的协议来规定。比如,HTTP 协议就有一个头信息Content-Length,表示信息体的大小。

对于操作系统来说,就是持续地接收 TCP 数据包,将它们按照顺序组装好,一个包都不少。

操作系统不会去处理 TCP 数据包里面的数据。一旦组装好 TCP 数据包,就把它们转交给应用程序。TCP 数据包里面有一个端口(port)参数,就是用来指定转交给监听该端口的应用程序。

图 | 系统根据 TCP 数据包里面的端口,将组装好的数据转交给相应的应用程序,上图中 21端口是 FTP,服务器 25端口是 SMTP 服务,80端口是 Web 服务器。

应用程序收到组装好的原始数据,以浏览器为例,就会根据 HTTP 协议的Content-Length字段正确读出一段段的数据。这也意味着,一次 TCP 通信可以包括多个 HTTP 通信。

慢启动和 ACK

服务器发送数据包,当然越快越好,最好一次性全发出去。但是,发得太快,就有可能丢包。带宽小、路由器过热、缓存溢出等许多因素都会导致丢包。线路不好的话,发得越快,丢得越多。

最理想的状态是,在线路允许的情况下,达到最高速率。但是我们怎么知道,对方线路的理想速率是多少呢?答案就是慢慢试。

TCP 协议为了做到效率与可靠性的统一,设计了一个慢启动(slow start)机制。开始的时候,发送得较慢,然后根据丢包的情况,调整速率:如果不丢包,就加快发送速度;如果丢包,就降低发送速度。

Linux 内核里面设定了(常量TCP_INIT_CWND),刚开始通信的时候,发送方一次性发送10个数据包,即"发送窗口"的大小为10。然后停下来,等待接收方的确认,再继续发送。

默认情况下,接收方每收到两个 TCP 数据包,就要发送一个确认消息。"确认"的英语是 acknowledgement,所以这个确认消息就简称 ACK。

ACK 携带两个信息:

  • 期待要收到下一个数据包的编号

  • 接收方的接收窗口的剩余容量

发送方有了这两个信息,再加上自己已经发出的数据包的最新编号,就会推测出接收方大概的接收速度,从而降低或增加发送速率。这被称为"发送窗口",这个窗口的大小是可变的。

图 | 每个 ACK 都带有下一个数据包的编号,以及接收窗口的剩余容量。双方都会发送 ACK。

注意,由于 TCP 通信是双向的,所以双方都需要发送 ACK。两方的窗口大小,很可能是不一样的。而且 ACK 只是很简单的几个字段,通常与数据合并在一个数据包里面发送。

图 | 上图一共4次通信。第一次通信,A 主机发给B 主机的数据包编号是1,长度是100字节,因此第二次通信 B 主机的 ACK 编号是 1 + 100 = 101,第三次通信 A 主机的数据包编号也是 101。同理,第二次通信 B 主机发给 A 主机的数据包编号是1,长度是200字节,因此第三次通信 A 主机的 ACK 是201,第四次通信 B 主机的数据包编号也是201。

即使对于带宽很大、线路很好的连接,TCP 也总是从10个数据包开始慢慢试,过了一段时间以后,才达到最高的传输速率。这就是 TCP 的慢启动。

数据包的遗失处理

TCP 协议可以保证数据通信的完整性,这是怎么做到的?

前面说过,每一个数据包都带有下一个数据包的编号。如果下一个数据包没有收到,那么 ACK 的编号就不会发生变化。

举例来说,现在收到了4号包,但是没有收到5号包。ACK 就会记录,期待收到5号包。过了一段时间,5号包收到了,那么下一轮 ACK 会更新编号。如果5号包还是没收到,但是收到了6号包或7号包,那么 ACK 里面的编号不会变化,总是显示5号包。这会导致大量重复内容的 ACK。

如果发送方发现收到三个连续的重复 ACK,或者超时了还没有收到任何 ACK,就会确认丢包,即5号包遗失了,从而再次发送这个包。通过这种机制,TCP 保证了不会有数据包丢失。

图 | Host B 没有收到100号数据包,会连续发出相同的 ACK,触发 Host A 重发100号数据包。

欢迎关注微信公众号【厦门微思网络】。www.xmws.cn专业IT认证培训19周年
主要课程:思科、华为、红帽、ORACLE、VMware、CISP、PMP等认证培训及考证

网工协议基础(2) TCP/IP四层模型相关推荐

  1. OSI七层协议模型和TCP/IP四层模型

    OSI七层协议模型和TCP/IP四层模型 对于一个请求,用户一般只会在乎他的请求响应结果是啥,往往都不都不知道在这个请求背后发生了什么.now,我们来了解一下背后的故事之请求去哪了. 神图镇楼... ...

  2. 网络通信——ISO7层协议与TCP/IP 四层模型

    ISO7层协议与TCP/IP 四层模型 前言 1. ISO7层协议 2.TCP/IP四层模型 3.两者之间的关联 前言 参考链接:原文链接 1. ISO7层协议 ISO7层模型从第一层至第七层: 物理 ...

  3. 网工协议基础(4)TCP/UDP协议

    往期回顾 网工协议基础(1) OSI七层模型 网工协议基础(2) TCP/IP四层模型 网工协议基础(3) IP地址 欢迎关注微信公众号[厦门微思网络].www.xmws.cn专业IT认证培训19周年 ...

  4. 网工协议基础(3) IP地址

    往期回顾 网工协议基础(1) OSI七层模型 网工协议基础(2) TCP/IP四层模型 欢迎关注微信公众号[厦门微思网络].www.xmws.cn专业IT认证培训19周年 主要课程:思科.华为.红帽. ...

  5. java基础巩固-宇宙第一AiYWM:为了维持生计,四大基础之计网_Part_1-1(计算机网络体系_七层模型五层模型TCP/IP四层模型、TCPUDPIP的故事【TCP三握四挥】)整起

    PART1:计算机网络体系可以大致分为一下三种, 每一层有自己对应的协议,每一层都是向上一层提供服务,每个分层中所有的协议都称为协议栈 协议:网络中传输信息时的规范和规则 各层一些重要的协议 网络:通 ...

  6. TCP/IP四层模型与OSI七层参考模型(网络协议)

    TCP/IP四层模型与OSI七层参考模型 一. OSI七层参考模型 ①. 物理层 ②. 数据链路层 ③. 网络层 ④. 传输层 ⑤. 会话层 ⑥. 表示层 ⑦. 应用层 二. TCP/IP模型 ①. ...

  7. 网工协议基础(5)ARP协议

    ARP 是什么? ARP(Address Resolution Protocol ) ,即地址解析协议,负责把目的主机的IP 地址解析成目的MAC地址. 当发送者 知道目的主机的IP地址之后, 就可以 ...

  8. TCP/IP四层模型重点协议解析

    文章目录 应用层 DNS协议 NAT NAPT 传输层协议 TCP UDP UDP协议段格式 UDP特点 基于UDP的应用层协议 ※ 经典面试题 网络层协议 IP协议 数据链路层协议 以太网 以太网帧 ...

  9. OSI七层协议模型、TCP/IP四层模型学习笔记

    1. OSI七层和TCP/IP四层的关系 1.1 OSI引入了服务.接口.协议.分层的概念,TCP/IP借鉴了OSI的这些概念建立TCP/IP模型. 1.2 OSI先有模型,后有协议,先有标准,后进行 ...

最新文章

  1. TVM如何训练TinyML
  2. C语言实现随机生成0~100的数
  3. java基础50道编程题
  4. [产品] 敏捷开发软件(一)——团队看板
  5. 使用云服务器搭建我的世界(Minecraft)服务端
  6. DXP2004生成PCB不显示连线
  7. Chapter2 - Sockets and Patterns
  8. Verilog HDL实战操作①——基本门电路
  9. 程序员的三行代码情书
  10. 在OpenWRT路由器上自动更新github等网站的hosts
  11. 来到 “鹅厂” 的 2019
  12. codeforces1149B. Three Religions
  13. 【OAI】部署5GSA独立组网网络切片例程及例程解析
  14. 这个教人怎么赚钱的社群,第7年了
  15. 魅族手机使用鸿蒙系统,魅族宣布接入鸿蒙是怎么回事?魅族手机可以刷鸿蒙系统吗?...
  16. SIEMENS/西门子1214 PID/通信模板 西门子P SIEMENS/西门子1214 PID/通信模板
  17. 【STM32F767】使用RTThread和TouchGFX实现DIY数字仪表(三)——获取温湿度传感器数据
  18. 3年经验双非进oppo ,分享心得与面试技巧
  19. 【InternImage】Exploring Large-Scale Vision Foundation Models with Deformable Convolutions
  20. Java 日历的制作 心得 写给自己

热门文章

  1. 2020-11-9(有序和无序广播)
  2. 010 数据结构逆向—链表
  3. 008 数据结构逆向—数组(简单版)
  4. Codeforces Round #744 (Div. 3)【A-E1】
  5. C语言易错题集 第三部
  6. SSM解决Mapper映射文件不发布
  7. jQuery获取元素内容
  8. MyEclipse部署Tomcat服务器
  9. 【数据结构-图】2.多图详解最小生成树(多图详解+实现代码)
  10. Java 循环队列原理与用法详解