计算机网络通信过程

简介: 计算机网络通信过程

计算机通讯过程

两台计算机通过TCP/IP协议通讯的过程如下所示:

上图对应两台计算机在同一网段中的情况,如果两台计算机在不同的网段中,那么数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器,如下图所示:

链路层有以太网、令牌环网等标准,链路层负责网卡设备的驱动、帧同步(即从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。交换机是工作在链路层的网络设备,可以在不同的链路层网络之间转发数据帧(比如十兆以太网和百兆以太网之间、以太网和令牌环网之间),由于不同链路层的帧格式不同,交换机要将进来的数据包拆掉链路层首部重新封装之后再转发。

网络层的IP协议是构成Internet的基础。Internet上的主机通过IP地址来标识,Inter-net上有大量路由器负责根据IP地址选择合适的路径转发数据包,数据包从Internet上的源主机到目的主机往往要经过十多个路由器。路由器是工作在第三层的网络设备,同时兼有交换机的功能,可以在不同的链路层接口之间转发数据包,因此路由器需要将进来的数据包拆掉网络层和链路层两层首部并重新封装。IP协议不保证传输的可靠性,数据包在传输过程中可能丢失,可靠性可以在上层协议或应用程序中提供支持。

网络层负责点到点(ptop,point-to-point)的传输(这里的“点”指主机或路由器),而传输层负责端到端(etoe,end-to-end)的传输(这里的“端”指源主机和目的主机)。传输层可选择TCP或UDP协议。

TCP是一种面向连接的、可靠的协议,有点像打电话,双方拿起电话互通身份之后就建立了连接,然后说话就行了,这边说的话那边保证听得到,并且是按说话的顺序听到的,说完话挂机断开连接。也就是说TCP传输的双方需要首先建立连接,之后由TCP协议保证数据收发的可靠性,丢失的数据包自动重发,上层应用程序收到的总是可靠的数据流,通讯之后关闭连接。

UDP是无连接的传输协议,不保证可靠性,有点像寄信,信写好放到邮筒里,既不能保证信件在邮递过程中不会丢失,也不能保证信件寄送顺序。使用UDP协议的应用程序需要自己完成丢包重发、消息排序等工作。

目的主机收到数据包后,如何经过各层协议栈最后到达应用程序呢?其过程如下图所示:

以太网驱动程序首先根据以太网首部中的“上层协议”字段确定该数据帧的有效载荷(payload,指除去协议首部之外实际传输的数据)是IP、ARP还是RARP协议的数据报,然后交给相应的协议处理。假如是IP数据报,IP协议再根据IP首部中的“上层协议”字段确定该数据报的有效载荷是TCP、UDP、ICMP还是IGMP,然后交给相应的协议处理。假如是TCP段或UDP段,TCP或UDP协议再根据TCP首部或UDP首部的“端口号”字段确定应该将应用层数据交给哪个用户进程。IP地址是标识网络中不同主机的地址,而端口号就是同一台主机上标识不同进程的地址,IP地址和端口号合起来标识网络中唯一的进程。

虽然IP、ARP和RARP数据报都需要以太网驱动程序来封装成帧,但是从功能上划分,ARP和RARP属于链路层,IP属于网络层。虽然ICMP、IGMP、TCP、UDP的数据都需要IP协议来封装成数据报,但是从功能上划分,ICMP、IGMP与IP同属于网络层,TCP和UDP属于传输层。

网络编程基础

什么是socket?

  • socket可以看成是用户进程与内核网络协议栈的编程接口。
  • socket不仅可以用于本机的进程间通信,还可以用于网络上不同主机的进程间通信。

IPv4套接口地址结构通常也称为“网际套接字地址结构”,它以“sockaddr_in”命名,定义在头文件<netinet/in.h>中

struct sockaddr_in {
uint8_t  sin_len; //4
sa_family_t  sin_family; //4
in_port_t sin_port; //2
struct in_addr  sin_addr; //4
char sin_zero[8]; //8
}; 
  • sin_len:整个sockaddr_in结构体的长度,在4.3BSD-Reno版本之前的第一个成员是sin_family.
  • sin_family:指定该地址家族,在这里必须设为AF_INET
  • sin_port:端口
  • sin_addr:IPv4的地址;
  • sin_zero:暂不使用,一般将其设置为0

通用地址结构用来指定与套接字关联的地址。

struct sockaddr {
  uint8_t  sin_len;
  sa_family_t  sin_family;
  char sa_data[14]; //14
}; 
  • sin_len:整个sockaddr结构体的长度
  • sin_family:指定该地址家族
  • sa_data:由sin_family决定它的形式。

网络字节序

  • 大端字节序(Big Endian)
    最高有效位(MSB:Most Significant Bit)存储于最低内存地址处,最低有效位(LSB:Lowest Significant Bit)存储于最高内存地址处。
  • 小端字节序(Little Endian)
    最高有效位(MSB:Most Significant Bit)存储于最高内存地址 处,最低有效位(LSB:Lowest Significant Bit)存储于最低内存地址处。
  • 主机字节序
    不同的主机有不同的字节序,如x86为小端字节序,Motorola 6800为大端字节序,ARM字节序是可配置的。
  • 网络字节序
    网络字节序规定为大端字节序。

字节序转换函数

uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);

说明:在上述的函数中,h代表host;n代表network s代表short;l代表long。

地址转换函数

#include <netinet/in.h>
#include <arpa/inet.h>
int inet_aton(const char *cp, struct in_addr *inp);
in_addr_t inet_addr(const char *cp);
char *inet_ntoa(struct in_addr in);

套接字类型

  • 流式套接字(SOCK_STREAM)
    提供面向连接的、可靠的数据传输服务,数据无差错,无重复的发送,且按发送顺序接收。
  • 数据报式套接字(SOCK_DGRAM)
    提供无连接服务。不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。
  • 原始套接字(SOCK_RAW)

图书推荐

🔥从大师视角诠释计算常识

做一个穿行于数字世界与现实世界的智者

计算机和通信系统,以及由它们所实现的许多事物遍布我们周围。其中一些在日常生活中随处可见,比如笔记本电脑、手机和互联网。今天,在任何公共场所,都会看到许多人在使用手机查询交通路线、购物以及和朋友聊天。与此同时,大部分计算机世界却是隐形的,比如电子设备、汽车、火车、飞机、电力系统和医疗设备中的计算机。这种几乎不可见的基础设施对我们产生了巨大的影响,如果没有这些在后台运行的系统,我们所处的现代社会将会坍塌。大多数情况下,它们确实在正确地执行任务,一切运转正常。但我们会不时得到令人不安的警示,这发生在当这些系统出现问题时,或当我们听到各种系统正在悄悄收集、共享,甚至滥用这些数据时。

下面推荐一本书,该书对计算机和通信系统如何工作进行了详细和透彻的解释。本书展示了当今的计算和通信世界是如何运作的,从硬件到软件,再到互联网和Web。

书名:《普林斯顿计算机公开课》

作者:布莱恩·W. 柯尼汉(Brian W. Kernighan)

译者:戴开宇

出版社:机械工业出版社

内容简介:从1999年开始,每年秋天,普林斯顿大学都有一门大受欢迎的计算机课程。Kernighan教授正是这门课程的主讲,他从科学家视角诠释的计算常识,使来自各个专业的学生都深深受益。

基于课程讲义,Kernighan教授撰写了D is for Digital(2011)和本书第1版(2017),而今,这本书再度全面升级。书中沿用简洁易懂的风格来讲解硬件、软件、通信和数据知识,并更新了大量时事案例来讨论随着疫情的变化和在线工作的增加而带来的隐私和安全问题。这使得本书不仅成为每个人畅游数字世界的科普指南,更折射出作者的人文关怀和思想锋芒。


相关文章
|
1月前
|
NoSQL 网络协议 Linux
Redis的实现一:c、c++的网络通信编程技术,先实现server和client的通信
本文介绍了使用C/C++进行网络通信编程的基础知识,包括创建socket、设置套接字选项、绑定地址、监听连接以及循环接受和处理客户端请求的基本步骤。
44 6
|
16天前
|
网络协议 安全 5G
网络与通信原理
【10月更文挑战第14天】网络与通信原理涉及众多方面的知识,从信号处理到网络协议,从有线通信到无线通信,从差错控制到通信安全等。深入理解这些原理对于设计、构建和维护各种通信系统至关重要。随着技术的不断发展,网络与通信原理也在不断演进和完善,为我们的生活和工作带来了更多的便利和创新。
57 3
|
1月前
|
安全 物联网 物联网安全
量子通信网络:安全信息交换的新平台
【10月更文挑战第6天】量子通信网络作为一种全新的安全信息交换平台,正逐步展现出其独特的优势和巨大的潜力。通过深入研究和不断探索,我们有理由相信,量子通信网络将成为未来信息安全领域的重要支柱,为构建更加安全、高效、可靠的信息社会贡献力量。让我们共同期待量子通信网络在未来的广泛应用和美好前景!
|
2月前
|
负载均衡 网络协议 开发者
掌握 Docker 网络:构建复杂的容器通信
在 Docker 容器化环境中,容器间的通信至关重要。本文详细介绍了 Docker 网络的基本概念和类型,包括桥接网络、宿主网络、覆盖网络和 Macvlan 网络等,并提供了创建、管理和配置自定义网络的实用命令。通过掌握这些知识,开发者可以构建更健壮和灵活的容器化应用,提高应用的可扩展性和安全性。
|
2月前
|
安全 量子技术 数据安全/隐私保护
量子通信:构建安全通信网络的未来
【9月更文挑战第21天】量子通信作为信息时代的一次伟大飞跃,正引领我们迈向一个全新的安全通信纪元。其独特的绝对安全性、高效率和大容量特点,使得量子通信在构建未来安全通信网络中具有不可替代的作用。随着技术的不断发展和应用的不断拓展,我们有理由期待量子通信将在未来发挥更加重要的作用,为人类社会的信息安全保驾护航。
104 13
|
28天前
|
机器学习/深度学习 人工智能 算法
|
10天前
|
物联网 5G 数据中心
|
21天前
|
网络协议 安全 数据安全/隐私保护
网络协议:互联网通信的基石
【10月更文挑战第12天】
60 1
|
23天前
|
网络协议 Linux 应用服务中间件
Socket通信之网络协议基本原理
【10月更文挑战第10天】网络协议定义了机器间通信的标准格式,确保信息准确无损地传输。主要分为两种模型:OSI七层模型与TCP/IP模型。
|
3天前
|
边缘计算 5G 数据处理
5G网络能耗管理:绿色通信的实践
【10月更文挑战第30天】
14 0