软件工程师需要了解的网络知识:从铜线到HTTP(三)—— TCP/IP

JohnLui:程序员,Swift Contributor,正在写《iOS 可视化编程与 Auto Layout》

那些首部

一个 HTTP 请求发送到服务器上,需要在头部按顺序加上 TCP首部、IP首部、以太网首部,这样才能保证这个 HTTP 请求的二进制数据能够在复杂的网络环境中得到可靠的传输:这三个首部在经过各种网络设备时会被大量修改以实现正确传输:以太网首部在经过交换机时并不会被修改,但是 IP首部 和 TCP首部 在经过路由器时会被修改。

TCP/IP 概述

当我们通过书本、博文等了解 TCP/IP 技术时,均将这两者作为两层来讲,似乎他们就是网络标准中的两个不同的虚拟化层级,但事实并没有这么简单。

我的虚拟化观

当初我学习《计算机组成原理》这本书的时候,我印象最深刻的就是里面对于计算机“虚拟化”的描述:只看计算机的硬件部分,其本质就是多层虚拟化:用逻辑电路、加法电路、积分电路、微分电路等模拟出算数逻辑单元、再和寄存器一起虚拟出运算器和控制器,配合由六个三极管组成一位的 SRAM 虚拟出的 L1、L2、L3 缓存,再配合由电容构成的 DRAM 虚拟出的“线性数组”内存,再由各种总线相互连接,实现了一个可以被操作系统软件控制的基础硬件平台。之后,这个基础硬件平台和操作系统一起虚拟出提供基本计算和逻辑判断服务的 CPU 以及可以被 C 指针读取的一个又一个内存存储单元。

计算机本身就是一层有一层虚拟化的产物,其复杂性远超我们日常生活中的复杂机械设备如汽车。计算机是一个纯粹的“人造”产物,是人类智能的集中体现。计算机从最底层的电路到最上层浏览器中显示出一个字,这背后正是虚拟化思想降低了复杂度,让人脑这个超低内存的计算机能够建造出如此纷繁复杂的计算机大厦。

TCP/IP 的关系

IP 技术是从 TCP 技术中拆分得来的,如此多层的虚拟化显然不是一开始就这么设计的,人脑是趋利避害的,不会随意提高复杂度。

TCP/IP 技术源于美国军方自 1969 年起开始建设的控制点分散的网络系统 ARPAnet。1975 年,ARPAnet 的规模达到一百多台计算机,只靠传统的硬件协议(如以太网协议)已经很难再支撑更大规模的网络了,于是开始研发 TCP/IP 技术,并在 1980-1983 年间完成了内部转换。1983 年,支持异构网络的完全架空的 TCP/IP 协议正式发布。此处的异构网络指的是 ARPAnet、以太网、令牌环网、光纤网络(如 FDDI 和现在常说的 FTTH)、PPP 网络(如电话拨号 PPPoE)等 OSI 1-2 层的网络。

就在 1983 年,TCP/IP 被 Unix 4.2 BSD 系统采用。随着 Unix 的成功,TCP/IP 逐步成为 Internet 的标准网络协议,兼容多种物理实现。

TCP/IP 和以太网

以太网诞生后,提供了一种简单的容易扩展的多台计算机相连接的电信号传输系统,能够一次性传输特定长度的 0、1 信息。以太网和 TCP/IP 是独立发展的,以太网是当前最成功的局域网技术,TCP/IP 则是整个 Internet 的标准协议:无论是局域网内常用的以太网,还是 FDDI 光纤网络,甚至是 LTE 4G 网络,都支持 TCP/IP 协议在其之上运行。从这个角度来看,TCP/IP 才是 Internet 的本体。

TCP/IP 协议簇是先有实现后有协议的,是从一个已经商用的成熟的网络架构中拆分出来的。

IP 首部

像以太网帧拥有首部一样,IP 报文也是用首部来描述属性信息的。

详解图

以下为 ip 首部详解图(IPv4):

简单解释

上图中每一行表示 32 位二进制数据。拥有 ip 首部特征的数据会被交换机、路由器、电脑网卡等以太网设备当做有效的 IP 报文(也称“IP数据报”)。

重要数据描述

  1. 总长度:界定了本次 ip 报文的长度,便于读取有效数据
  2. 源地址:本次 ip 报文是由那个 ip 地址发出的
  3. 目的地址:本次 ip 报文需要发给哪一台设备

源地址和目的地址均为 32 位(4 个字节)。我们常见的一个 IPv4 地址为:192.168.1.1,IPv4 地址范围为 0.0.0.0 - 255.255.255.255,255 为 2 的 8 次方减一,也就是说用八位二进制可以表示 0-255,四个八位即为 32 位。

小 tip

1 字节等于八位,字节这个单位的出现是因为一个内存地址对应的数据长度为八位,是一个内存相关概念,在理解网络时我们最好抛弃这个概念,全部使用位。

结论

ip 层实际上就是规定了一个首部,里面最重要的数据是源 ip 地址和目的 ip 地址。

TCP 首部

重要数据描述

  1. TCP 首部中最重要的数据是源端口和目的端口
  2. 他们各由 16 位二进制数组成,2^16 = 65536,即端口范围为 0-65535
  3. 我们可以需要注意到,目的端口号这个重要数据是放在 TCP 首部的,和 IP 首部、以太网帧首部毫无关系

TCP 复杂的特性我们下一篇再解读。

原文发布于微信公众号 - 前端黑板报(FeHeiBanBao)

原文发表时间:2018-03-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏SAP最佳业务实践

想学FM系列(7)-SAP FM模块:主数据(5)-基金计划程序

3.1.4 基金计划程序 基金计划程序是可选账户分配要素,可以用它来进行跨公司、跨年度的框架内预算控制,比如一个大型项目。它同其他账户分配要素不同,它可以直接进...

3728
来自专栏芋道源码1024

Java 面试题 —— 老田的有赞面试经历

好像是清明节还是五一劳动节来着,我还在睡觉,就接到一面面试官的电话,说现在有时间吗,能够接受下电话面试吗?我勒个去,今天过节、我被电话吵醒的,现在人都没清醒、这...

1952
来自专栏AI科技评论

开发 | 如何在 i5 上实现 20 倍的 Python 运行速度?

Intel Distribution for Python 在今年二月进行了更新——英特尔发布了 Update 2 版本。以“加速”为核心的它,相比原生 Pyt...

4226
来自专栏SDNLAB

OpenFlow会不会城头变幻大王旗?

2695
来自专栏刘望舒

一个妹子的Android秋招面试总结(已拿BAT等7家口头offer)

在2018Android暑期实习面试总结曾介绍过个人情况、自学经历、校招流程和复习重点,这部分就不再赘述。那么本篇先以日历形式回顾秋招之路,方便各位参考某厂的处...

1K2
来自专栏斑斓

代码诊所

几年前,我有机会负责一个项目的咨询。团队很小,目标是对旧有系统的后端用Java改写,而团队的开发人员全为C程序员。我的工作职责是负责项目设计、开发,以及担任项目...

4116
来自专栏CDA数据分析师

一个初级python web后端开发工程师的面试总结

原文链接:https://blog.csdn.net/ayocross/article/details/56509840

1653
来自专栏奇点大数据

算法之旅(2)——朴素的存取

上次我们说到算法最基本的处理规则和算法在计算机底层所藉由的工作方式。这次我们来说说计算机中最简单的算法,最朴素的数据存取。 也许有的朋友觉得这种问题太底层,简直...

2385
来自专栏JAVA技术zhai

聊聊面试中关于并发问题的应对方案

2827
来自专栏AI研习社

如何在 i5 上实现 20 倍的 Python 运行速度?

Intel Distribution for Python 在今年二月进行了更新——英特尔发布了 Update 2 版本。以“加速”为核心的它,相比原生 Pyt...

43013

扫码关注云+社区

领取腾讯云代金券