C++服务器 (二) IP详解一

本文深入浅出地介绍了网络基础知识,包括Internet起源、TCP/IP协议、IP协议的概念及其与计算机交流的关系,对比了OSI模型与IP模型的差异,详细解释了数据在网络中的传输过程,以及UDP传输方式的数据封装。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  今天我给大家讲解的是C++服务器的第一小节,首先给大家介绍的是一些网络的基础知识,重点讲一下我们常说的ip是什么。

  这些知识点大家网上也都是可以搜到,如果有我介绍的不详细的部分大家可以通过百度来搜索。

  首先internet大家都知道是起源于美国,因为当时二战的缘故导致计算机和网络十分快速的发展,早在1992年时internet上的主机就已经超过了一百万台,现在网络更是已经成为我们生活中必不可缺的一部分。

  那我们常说的TCP/IP到底是什么,IP的全称internet protocol中文名字叫做互联网协议,这里听起来感觉ip和我们之前所理解的有些不同,之前在我看来ip是一个地址,是一个名字,不同的电脑有不同的ip也就是他们在互联网中的不同的代号,但是实际上ip是一种协议。我们人和人之间交流的方式有很多种,比如眼神,比如手势,比如语言,这些方式都是可以的,假如你现在要通过语言和一个阿拉伯人进行谈话但是他不懂汉语你不懂阿拉伯语那这时候应该怎么办呢?这和计算机之间的交流也是一样的,既然是网络,那么计算机之间也是需要进行沟通的那他们是怎么进行沟通的呢?那就必须有一套标准让所有计算机都能理解能相互沟通的标准。目前最流行的标准就是TCP/IP,这是起源于美国国防部的一种方式。我们现在用的版本是TCP/IP的v4版本。在1983年TCP/IP正式成为了标准。而我们现在用的windows在win95的时候正式采用了TCP/IP标准。

  在正式详细介绍TCP/IP之前先给大家介绍一个另外模型,OSI模型,全称是open system interconnection model

这个模式情况下是将你的数据进行分层处理,当你从一个计算机向另一个计算机传输数据的时候先从的数据层打包,然后表示层,会话层层层打包在物理层打包结束之后,将打包结束后的数据传输给另一个电脑,然后接受数据的电脑开始对应一层层解密你的数据。这种传输模式不仅仅是正常传输过程十分麻烦,同样当你的数据传输出现问题的时候在发送数据计算机的传输层出现问题的时候,接受信息的电脑传输层在翻译的时候也需要找到对应的错误,这样导致数据传输过程十分的复杂。这种分层传输方式也挺清晰不够就是过于复杂。

  对比起来我们的IP模型就有适当的简化我们这里host A发送一个数据然后通过中间的协议将数据进行适当的转化,然后当数据到达我们另一个计算机host B的时候再通过同一份协议将数据转换回去。

 

我们看IP模型。这里在进行转换的时候也通过了四层application就是我们真正使用的程序也就是我们的客户端,例如我们qq的客户端,之后我们的数据需要通过transport这一层,也就是我们说的TCP这一层,再往下就是internet也就是我们说的IP层,再往下就是link电路层,更加抽象一点就可以理解成网线。通过网线传输到接受信息的计算机,但是在网线传输的过程中我们可以看出来并不是单纯的数据在网线中进行传输,中间还是经过了我们的internet也就是ip层,这具体的原因是什么我们在后边会给大家进行介绍。这里我们也并不只是必须通过我们的网线传输,只要是遵循我们的协议其他方式也都可以,例如我们的wifi并不需要你通过网线进行数据传输。在transport层传输的时候我们就会进行选择,例如我们发送一个快递我们是通过飞机发送过去还是大陆带过去还是海运在transpo阶段我们就会进行一个选择,当确定好之后我们就会进入internet就是将数据进行简单的传送,例如我现在想要通过飞机进行运送那我就将我的数据送到机场,如果通过快递那我就带上数据去邮局。最后这些都确定好之后,数据就会在link层进行数据传输。当数据到达最后接受计算机的时候同样和发送一样层层对数据进行解析。如果过程中吗没有出现问题这时候我们就成功拿到了数据。

 上边算是对网络传输的一种科普下边就是我们正式的内容

我们来看一下数据进入协议栈的封装

假如我们现在有个程序需要进行数据传输,比如我们现在进行的数据传输是通过UDP的方式进行传输,我们就要在transport层选择好udp方式进行传输,并且在我们拿到的原始数据前边加上我们一个udp header这样就知道我们这次的数据是通过udp方式进行传输的。

然后数据进入internet在这一层会加入ip header这样是告诉大家我们这次传输的数据是通过ip协议进行传输的,在link层的时候会对数据加上一个frame header和frame footer,link不同于其他层这里我们不仅加了头还加了尾。这里的尾主要作用就是来检查我们数据在传输过程中是不是出现了错误,他在传输过程中不断的进行计算,与frame data中的数据进行核对保证在传输过程中数据并没有发生错误。一般来说传输的时候frame data数据的长度是有要求的,最短是46个字节,如果不够就需要通过加上0来进行填补。那最大多少呢?目前的最大是1500个字节。1500字节叫做mtu也就是最大传输单元。如果当我们的数据大于这个的时候,我们就需要在internet层进行划分,这就是为什么我们在link层中传输的时候为什么还要不断的进入internet可能在传输过程中将消息进行重新打包再次传输过去。

  简单介绍之后,今天再介绍一个小的知识点。那就是debug和release版本。

  先给大家看一一段代码。

  #define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

#include<stdlib.h>

 

void test(int a, int b, int c)

{

printf("a: %p\n", &a);

printf("b:\n");

printf("c:%p\n", &c);

}

int main()

{

int a = 0;

int b = 0;

int c = 0;

test(a, b, c);

system("pause");

}

将这段程序在两个不同版本下进行运行。

首先在debug版本下进行

可以发现a和c的地址之间的差值是8,也就是说有两个数,一个是a另一个应该就是我们定义的b了,但是在release版本下运行的时候

这时候两个变量之间的差值已经变成4了,这里大家都需要思考一下。之后我还会更加详细的介绍debug和release两个版本的区别给大家发出来。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值