局域网中的主机之间通信
局域网中的主机之间通信
局域网中的主机间通信分为 2 种:
两台主机处于同一网段
两台主机之间处于不同网段
局域网中处于同一网段中的主机通信
假如:主机 A 要和主机 B 通信,主机 A 知道主机 B 的 IP 地址。知道 IP 地址是通信的前提。首先,要通进行通信,IP 地址和 MAC 地址是必不可少的,IP 地址已经知道了,那么主机 A 必须要知道主机 B 的 MAC 地址,先在 ARP 表中查看有无该 IP 地址,如果有,就找出对应的硬件 MAC 地址,如果没有,主机 A 广播发送 ARP 请求来获取目的 MAC 地址,说 who is 192.168.1.102 ?
当 IP 地址是 192.168.1.102 的主机 B 收到后,会回复主机 A ,说 “我是 192.168.1.102 ,我的 MAC 地址是:xx-xx-xx-xx-xx-xx”(ARP应答)。这样一来,主机 A 就知道主机 B 的 MAC 地址了,当然,由于主机 A 在广播发送的 ARP 报文时,主机 A 的 MAC 地址被作为源 MAC 地址而封装在 MAC 帧中,所以主机 B 收到广播报文后 ...
碎玉零珠————计算机网络
OSI 七层模型
理论上的网络通信模型
应用层:最靠近用户的层,负责处理特定的应用程序细节。这一层提供了网络服务与用户应用软件之间的接口。例如,Web 浏览器、FTP 客户端和服务器、电子邮件客户端等。
表示层:确保从一个系统发送的信息可以被另一个系统的应用层读取。它负责数据的转换、压缩和加密。例如,确保数据从一种编码格式转换为另一种,如 ASCII 到 EBCDIC。
会话层:管理用户的会话,控制网络上两节点间的对话和数据交换的管理。它负责建立、维护和终止会话。例如,建立一个会话令牌,以便在网络上的两个节点之间传递。
传输层:提供端到端的通信服务,保证数据的完整性和正确顺序。这一层包括 TCP 和 UDP 等。
网络层:负责在多个网络之间进行数据传输,确保数据能够在复杂的网络结构中找到从源到目的地的最佳路径。这层使用的是 IP(Internet Protocol)协议。
数据链路层:在物理连接中提供可靠的传输,负责建立和维护两个相邻节点间的链路。包括帧同步、MAC(媒体访问控制)。
物理层:负责在物理媒介上实现原始的数据传输,比如电缆、光纤和无线信号传输。涉及的内容包括电压、接口、针 ...
虚函数与虚表
虚函数与虚表
普通类的内存布局和带虚函数类的内存布局123456789101112131415161718192021#include <iostream>using namespace std;class NonVirtualClass {public: void foo(){}};class VirtualClass {public: virtual void foo(){}};int main() { cout << "Size of NonVirtualClass: " << sizeof(NonVirtualClass) << endl; cout << "Size of VirtualClass: " << sizeof(VirtualClass) << endl;}
这里 NonVirtualClass 的大小为1,而 Vir ...
虚调用
虚调用的定义
虚调用 是相对于 实调用 而言,它的本质是 动态联编 。
在发生函数调用的时候,如果函数的入口地址是在编译阶段静态确定的,就是是 实调用 。
如果函数的入口地址要在运行时通过查询虚函数表的方式获得,就是 虚调用 。
虚函数 的几种 实调用 的情形不通过指针或者引用调用虚函数
虚调用 不能简单的理解成 “对虚函数的调用” ,因为对虚函数的调用很有可能是实调用。
12345678910111213141516171819202122232425262728293031#include <iostream>using namespace std;class A {public: virtual void show() { cout << "In A" << endl; }};class B : public A {public: void show() { cout << "I ...
C++ 的几种类型转换
C++ 的几种类型转换
在 C 语言中,我们大多数是用 (type_name) expression 这种方式来做强制类型转换,但是在 C++ 中,更推荐使用四个转换操作符来实现显式类型转换:
static_cast
dynamic_cast
const_cast
reinterpret_cast
static_cast
用法: static_cast <new_type> (expression) 。其实 static_cast 和 C 语言 () 做强制类型转换基本是等价的。主要用于以下场景:
基本类型之间的转换
将一个基本类型转换为另一个基本类型,例如将整数转换为浮点数或将字符转换为整数。
12int a = 42;double b = static_cast<double>(a); // 将整数a转换为双精度浮点数b
指针类型之间的转换
将一个指针类型转换为另一个指针类型,尤其是在类层次结构中从基类指针转换为派生类指针。这种转换不执行运行时类型检查,可能不安全,要自己保证指针确实可以互相转换。
12345class Base { ...
排序算法
各种排序算法的原理和时间复杂度
快速排序:一轮划分,选择一个基准值,小于该基准值的元素放到左边,大于的放在右边,此时该基准值在整个序列中的位置就确定了,接着递归地对左边子序列和右边子序列进行划分。时间复杂度O(nlogn),最坏的时间复杂度是O(n^2)。需要排序的对象越有序,快速排序的退化程度越高,即时间复杂度越趋向于O(n ^ 2)。通过随机选择枢轴,可以有效地避免这种情况。随机选择使得每次分区都有较大概率是平衡的,从而保持了快速排序的平均时间复杂度 O(n * logn);
123456789101112131415161718192021222324252627282930313233343536void QuickSort(vector<int>& nums, int left, int right){ if (left >= right) return; int pivot = rand() % (right - left + 1) + left; swap(nums[pivot], nums[right ...