概要

网络是个很多人都知道, 却又是很多人都说不清楚的东西, 对于一般用户来说, 没什么问题. 但对于一个软件开发人员来说, 至少要能够大致描述自己的程序中网络部分是如何运作的.

因为, 目前几乎任何程序都和网络有关, 纯粹的单机程序几乎已经绝迹. 如果弄不清楚网络的运作机制, 除了网络相关问题往往束手无策, 而网络问题往往是开发过程中很难遇到的.

下面就以一次 HTTP 请求为例, 尽量简要的说明网路的方方面面.

基本概念

网络中一些常见的基本概念, 弄清楚之后有助于了解网络的构造.

网线

这是最常见的网络设备, 通过网线(无线网除外), 我们才将一个个网络设备连接在一起, 网线承担的责任就是就是把我们的数据都通过电信号传输到不同的地方.

集线器

收到的网络包广播到整个网络.

交换机

收到的包根据 MAC 地址表转发到指定的端口, 交换机的端口有 MAC 模块, 但是没有 MAC 地址 交换机的 MAC 地址表主要包含 2 个信息:

  • 设备的 MAC 地址
  • 设备连接在交换机的哪个端口上

交换机的特殊操作:

  • 当发现包要发回原端口时, 直接丢弃包
  • MAC 地址表找不到指定地址时, 交换机无法判断应该把包发到哪个端口, 只能将包转发到除了源端口之外的所有端口

二层交换机 所谓的二层交换机, 其实和一般的交换机在功能上没有什么区别, 就是更高级, 性能更好的交换机而已.

路由器

路由器是基于 IP 设计的, 路由器中的每个端口都有 IP 地址和 MAC 地址 通过路由器转发的包, 其中接收方 MAC 地址就是路由器端口的 MAC 地址.

路由器和交换机

现在的路由器其实包含了交换机的功能, 如果只是纯粹的路由器, 包的传输功能其实是交给交换机来完成的. 路由器设计成只负责 IP 层是有重要意义的, 这样具体的传输就可以委托给其他各种传输技术.

路由器和集线器

路由器是按照 IP 规则传输包的设备(IP) 集线器是按照以太网规则传输包的设备(MAC) 也就是说, 网络包的传输过程中, IP 协议头部中的目的 IP 可以不变, 但是 IP 协议头部中 MAC 是不断变化的, 传输过程中, 中间经过了几次路由器就会变化几次.

接入网

接入网就是指连接互联网与家庭, 公司网络的通信线路.

互联网与家庭, 公司的网路结构基本一样, 不同点主要有 2 个:

  • 距离不同, 互联网上的设备之间距离一般都很远
  • 路由的维护方式不同

接入网中的术语:

  • ADSL: Asymmetric Digital Subscriber Line. 不对称数字用户线
  • FTTH: Fiber To The Home. 光纤到户
  • BAS: Broadband Access Server. 宽带接入服务器, 本质是一个功能强大的路由器
  • PPP: Point-to-Point. 点对点协议, 它是电话线, ISDN 等通信线路所使用的一种协议, 集成了用户认证, 配置下发, 数据压缩, 加密等功能
  • PPPoE: PPP over Ethernet. 以太网的点对点协议
  • IX: Internet eXchange. 互联网交换中心, IX 的核心就是大型的, 高速的交换机

IP

IP 地址由 网络号+主机号 组成

常用的 IP 地址有 A, B, C 3 类:

  1. 后 24 位是主机号, 就是 A 类 IP 地址
  2. 后 16 位是主机号, 就是 B 类 IP 地址
  3. 后 8 位是主机号, 就是 C 类 IP 地址

主机号全是 0, 表示整个子网, 主机号全是 1, 表示向子网上所有设备发送包, 即 广播

DNS

DNS 查询消息由 3 部分组成:

  1. 域名 要访问的域名: 比如 google.com, microsoft.com
  2. Class 用来识别网络信息, DNS 设计之初并不只是针对互联网的, 所有有这个字段. 现在 DNS 只用在互联网, 这个字段一直是 IN
  3. 记录类型 A-IP 地址, MX-邮件服务器地址, PTR-IP 反查域名, CNAME-域名相关别名 NS-DNS 服务器 IP

DNS 消息示例: a) 域名: google.com b) Class: IN c) 记录类型: A DNS 会根据这条消息, 返回 goole.com 的 IP 地址

以太网

以太网是一种网络类型, 它有 3 个基本特征:

  1. 将包发送到 MAC 头部的接收方 MAC 地址代表的目的地
  2. 用发送方 MAC 地址识别发送方
  3. 用以太类型识别包的内容

无线局域网也符合以太网的特征, 只是识别包内容不用以太类型, 用的是其他类型

以太网有 全双工半双工 2 种方式:

  • 全双工: 发送和接收可以并行的方式
  • 半双工: 某一时刻只能进行发送或者接收其中一种操作

协议栈

协议栈主要是 TCP/IP 协议, 其他还有 UDP, ICMP, ARP 等等

  • UDP 协议虽然没有 TCP 可靠, 但是效率高, 它的适用场景比如 DNS, 音频, 视频的在线播放等等
  • ICMP 用于告知网络包传输过程中产生的错误以及各种控制消息
  • ARP 用于根据 IP 地址查询相应的以太网 MAC 地址

网络连接过程

通信过程(浏览器 -> 服务器)

  1. 创建套接字(创建套接字阶段) 套接字并不存在实体, 是一块用于存放控制信息的内存空间. 这些控制信息包括: 通信对象的 IP, 端口, 通信进行状态等等.
  2. 将管道连接到服务器端的套接字上(连接阶段) 连接实际上是通信双方交换控制信息, 在套接字中记录这些必要信息并准备数据收发的一连串操作. 连接的头部有 TCP, IP 协议的信息, 这些信息就是为了确保传输能够准确, 高效. TCP 头部有端口号, IP 头部有 IP 地址
  3. 收发数据(通信阶段) 通过 MTU, MSS 控制发送频率 通过 ACK 确认是否正确收到网络包
    • MTU: Maximun Transmission Unit, 最大传输单元
    • MSS: Maximun Segment Size, 最大分段大小
  4. 断开管道并删除套接字(断开阶段) 断开连接的操作由客户端或者服务端发起均可.

客户端和服务端

服务器和客户端对于 socket 通信来说是没有区别的, 唯一的区别在于调用 socket 库的方式上.

  • 客户端 (1). 创建套接字(创建套接字阶段) (2). 用管道连接服务器端的套接字(连接阶段) (3). 收发数据(收发阶段) (4). 断开管道并删除套接字(断开阶段)

  • 服务端 (1). 创建套接字(创建套接字阶段) (2-1). 将套接字设置为等待连接状态(等待连接阶段) (2-2). 接受连接(接受连接阶段) (3). 收发数据(收发阶段) (4). 断开管道并删除套接字(断开阶段)

服务端的套接字和套接字描述符

服务端的套接字, 需要 4 种信息来确认:

  • 客户端 IP 地址
  • 客户端端口号
  • 服务端 IP 地址
  • 服务端端口号

有了这 4 种信息, 就可以确定服务端的套接字, 为什么还要套接字描述符来指定套接字呢? 因为:

  • 等待连接的套接字中没有客户端 IP 地址和端口号
  • 使用描述符这一种信息比较简单

网络浅析(<<网络是怎么连接的>> 总结)的更多相关文章

  1. 计算机网络通信TCP/IP协议浅析 网络发展简介(二)

    本文对计算机网络通信的原理进行简单的介绍 首先从网络协议分层的概念进行介绍,然后对TCP.IP协议族进行了概念讲解,然后对操作系统关于通信抽象模型进行了简单介绍,最后简单描述了socket   分层的 ...

  2. IOS 网络浅析-(十三 SDWebImage 实用技巧)

    IOS 网络浅析-(十三 SDWebImage 实用技巧) 首先让我描述一下为了什么而产生的实用技巧.(在TableView.CollectionView中)当用户所处环境WiFi网速不够快(不能立即 ...

  3. android——网络操作(一)连接网络

    连接网络 一,包含许可 <uses-permissionandroid:name="android.permission.INTERNET"/> <uses-pe ...

  4. 记一次网络原因导致的mysql连接中断问题(druid)

    date: 2018-04-19 21:00 tag: java,mysql,exception,mat,调试,jvm 工具: gceasy.io, MAT 线上系统出现一个诡异的bug,通过heap ...

  5. keras搭建密集连接网络/卷积网络/循环网络

    输入模式与网络架构间的对应关系: 向量数据:密集连接网络(Dense层) 图像数据:二维卷积神经网络 声音数据(比如波形):一维卷积神经网络(首选)或循环神经网络 文本数据:一维卷积神经网络(首选)或 ...

  6. Linux网络——查看网络连接情况的命令

    Linux网络——查看网络连接情况的命令 摘要:本文主要学习了Linux中用来查看网络连接情况的命令. hostname命令 hostname命令用于显示和设置系统的主机名称,设置只是临时生效,永久生 ...

  7. [转] - Linux网络编程 -- 网络知识介绍

    (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...

  8. JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)

    本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...

  9. UNIX网络编程——网络IPC:套接字

    UNIX网络编程——网络IPC:套接字 Contents 套接字接口 套接字描述符 寻址 字节序 地址格式 地址查询 绑定地址 建立连接 数据传输 套接字选项 带外数据 UNIX域套接字 使用套接字的 ...

随机推荐

  1. Hexo + GitHub 搭建个人博客

    对于程序员来说,搭建和维护一个个人博客十分必要​,写博客既是对所学知识的整理和总结,同时也能向他人展现自己的学习成果.这篇教程就是基于 Hexo 和 GitHub 来搭建属于自己的个人博客,简单快捷, ...

  2. V8引擎的垃圾回收策略

    V8 的垃圾回收策略主要基于分代式垃圾回收机制.所谓分代式,就是将内存空间分为新生代和老生代两种,然后采用不同的回收算法进行回收. 新生代空间 新生代空间中的对象为存活时间较短的对象,大多数的对象被分 ...

  3. 千星项目.Net Core 2.1移植填坑记--OpenAuth.Core诞生

    背景 很早就有把OpenAuth.Net----最好用的.net权限管理工作流框架(好吧!我在吹牛

  4. Spring Boot 2.2 增加了一个新功能,启动飞起~

    前几天栈长分享了一个好玩的框架:一个比Spring Boot快44倍的Java框架!,是不是感觉 Spring Boot 略慢?今天讲一下 Spring Boot 添加的这个新特性,可以大大提升 Sp ...

  5. [ZJOI2007] 捉迷藏

    idea1 可能会死掉的想法:考虑点分治维护每个分治中心x到达分治块内的个点距离,具体是用堆维护分治快内的x的儿子y到y的子树内的所有点距离(记为C[y]),取所有C[y]的top+e(x,y)放入x ...

  6. ASP.NET Core 实战:Linux 小白的 .NET Core 部署之路

    一.前言  最近一段时间自己主要的学习计划还是按照毕业后设定的计划,自己一步步的搭建一个前后端分离的 ASP.NET Core 项目,目前也还在继续学习 Vue 中,虽然中间断了很长时间,好歹还是坚持 ...

  7. PyCharm:选择性忽略 PEP8 警告

    PyCharm 是个很强大的 python IDE,PEP 8 的告警提示也很好用,但是函数名不能包含大写字母等少数几个规范真心觉得不好,作为一名处女座强迫症患者,代码下面的波浪线这种东西是绝对不允许 ...

  8. 一套代码小程序&Web&Native运行的探索01

    前言 前面我们对微信小程序进行了研究:[微信小程序项目实践总结]30分钟从陌生到熟悉 并且用小程序翻写了之前一个demo:[组件化开发]前端进阶篇之如何编写可维护可升级的代码 之前一直在跟业务方打交道 ...

  9. nmap命令总结

    一.nmap是什么 nmap是一款网络扫描和主机检测的非常有用的工具,不局限于仅仅收集信息和枚举,同时可以用来作为一个漏洞探测器或安全扫描器.它可以适用于winodws,linux,mac等操作系统. ...

  10. Java基础系列-equals方法和hashCode方法

    原创文章,转载请标注出处:<Java基础系列-equals方法和hashCode方法> 概述         equals方法和hashCode方法都是有Object类定义的. publi ...