文章目录
- 协议
- 网络协议栈(osi)
- 局域网
- IP
- IP和Mac地址
- 端口号
- TCP和UDP
- 网络字节序
协议
(网络协议的)意义:为了让计算机传输之间将信息正确传输给目标机器
不同系统之间能接入网络是因为定制了一套通用的协议以便支持不同系统间的网络通信
1.网络通信的问题:
将数据可靠的从A传给B
a.保证将数据交给下一个主机
b.在转发过程中保证目标主机的定位问题,路径选择问题
c.如果报文出现错误,或者丢失
d.传达的数据还要解决如何处理使用数据的问题
2.网络的解决方案-------网络的层状结果(软件也是如此,如:继承)
好处:完成软件的解耦合,方便后续进行维护
网络协议栈(osi)
实际在正常通信中的实现是TCP/IP的五层协议用于解决网络通信的问题
操作系统不同,但是网络大同小异
局域网
1.重谈协议
2.局域网中,多台主机能直接通信吗?如何通信?
以快递包裹为例:
快递单本身就是一种约定,本身就是一种协议
长距离发送时:
快递=快递单+信息
快递单== 报头
报头本质:结构化字段创建的对象,叫做协议报头
同一个局域网中,两台主机之间能直接通信,为什么:
每一张网卡,mac地址是唯一的(可通过一些虚拟手段,虚拟出来),48个bit,8个bytes
局域网通信原理:
数据在传输时有报头,A->B时,报头中携带谁发给谁,B,C,D…所有人都能收到,
B在收到信息后,根据报头确认是发给他的,所以要接受
其他人收到信息后,根据报头不是发给他的,所以会丢弃
在局域网中,A向B发送,B向A发送,D向B发送,E向D发送........这样的信息多了之后,如果发生信息碰撞,消息就废除了
所以有了碰撞避免的操作,A向B发送,B向A发送,C向A发送,此时某一步操作就会先让步,来避免碰撞
在一个碰撞域(局域网)中,要正确的发送消息,任何时刻.只允许一台主机在局域网中发送消息(如何破坏一个局域网:不断向一个局域网内发送垃圾报文)
主机越多,发生碰撞的概率会越来越大,所以交换机在这时就会发生作用,这种基于碰撞概率的局域网叫做以太网,手机上类似(运动会网差,丢包就是这个原因)
封装一定要考虑解包的问题:
每层协议都要理解:
1.如何将报文中,报头和有效载荷分离;
2.任何协议,都要解决如何将自己的有效载荷交付给上层的那个协议
共性,即:每层协议都要解决这两个问题
IP
win下查看ip:
ipconfig:
实际是:[0,255],[0,255],[0,255],[0,255]
点分十进制,c/c++视角来看,都是字符串
如果我们想让我们写的服务让别人看到,必须要"具备公网IP"(后续理解)
云服务器的公网IP,是由运营商虚拟出来的
IP地址,用来表示互联网中的一台主机都是指公网IP(先这么理解以便更好的学习)
对于一个IP地址4个字节表示网络IP即可:
4*8=32(在实际网络传输中用的就是这种)
进行举例说明一下:
IP和Mac地址
以送快递为例:
从哪来-----到哪去—终极目标 ----->IP地址
上一战从哪来-----下一站到哪去-------当下目标(一直在变)-------->Mac地址
局域网的标准不统一,所以还存在其他的一些
以往了解即可(这个令牌相当于一把锁,令牌环的报头…了解即可)
现象:
某一层要发的就是另对应的一层要收的
mac报头是一直在变换,但是IP报头(目的IP)不变
源IP可能变(以后说)
端口号
对网络通信而言,本质都是进程间的通信
对于双方而言,1.先把数据能达到自己的机器(通过IP),
2.找到指定的进程(port:端口号)
ip用来识别网络中的唯一一台机器
端口号用来识别指定机器中进程的唯一性
通过{ip,port}就能确定互联网中的唯一一个进程
如何理解端口号?:
本质:uint16_t port; 16个bit的一个无符号整数 16bit==2byte
意义:1.用于标识当前主机上的唯一的一个网络进程
2.在发送信息时,网络进程和port进行绑定关联,这样就能让双方时间进行相互交流
按照上层理解,进程有了pid,为什么还有port?
1.其他模块(进程管理)和网络进行解耦
2.port专用来进行网络通信
例如:
一般而言,一个进程和一个端口号相关联:
一个进程可以和多个端口号关联,但是
一个端口号不能和多个进程进行关联
eg:
欠费时:10086+转人工(工号)
IP + port
TCP和UDP
关系如下:
网络字节序
数据的存储有:大端存储,小端存储
不同的机器,存储方案不同
发送主机在发送数据时,会将缓冲区的数据按照内存地址的从低到高的顺序发送
接受主机在接受数据时,会将数据从网上接受的字节以此保存在接收缓冲区,也是按照内存地址的从低到高的顺序进行保存
eg:
数据
0xaa bb cc dd
大:aa bb cc dd
小:dd cc bb aa
但是存在的问题是
因此,网络规定,发送的数据到达网络必须是大端
同时这样可读性较好
C语言下的网络字节序相关函数
喜欢不妨三连再走~~~