最近在筹划写一个聊天室,所有就了解了一些计算机网络方面的知识,就想着输出一下……这两天看到网络的很好的定义:用物理设备将各个“局域网”相连组成更大的“局域网”。
计算机网络模型
- 应用层:
文本传输协议,比如说你的QQ发消息被被别人抓包了,但是只要他不知道QQ应用层的协议,他就无法破解。抓包很有意思的,我最近刚接触了一些这方面的东西,找个机会写一下。常见的有HTTP(超文本传输协议),FTP(文本传输协议),DNS(域名系统) - 传输层:
传输层协议的任务是向不同的向位于不同主机上的应用程序提供端到端的服务。你有没有想过,你的QQ消息,为什么发送过来的时候没有发送到微信上,在网络层就是通过端口号等一系列,区分不同进程。分为TCP和UDP两种.TCP(传输控制协议),UDP(用户数据报协议)。 - 网络层
关注的是如何将包(数据)从源主机发送到目标主机,也就是区分不同主机。
- 将数据分解成足够小的片段以便进行传输
- 在英特网上进行路由传输
- 为传输层提供服务
常见的协议有IP(网络协议),ARP(地址解析协议)。
- 数据链路层
最底层是数据链路层,它由设备驱动和到底层物理媒介的硬件接口。数据链路层在物理链接上传输帧并处理来自接受者的确认。这一层可能会进行物理检测,重传以及流量控制。一些数据链路层还可能会将大的网络包分割成多个帧并在接受者端对这些帧进行重组。从应用程序编程的角度来讲通常可以忽略数据链路层,因为所有的通信细节都是由驱动和硬件来处理的。如果是子网络就采用广播方式发送,否则采用路由的方式发送。
这是整个发送模型:- 在应用层通过文本协议进行加密,
- 在传输层加头,如果是TCP协议,里面有源端口与目的端口,32位序列号,32位确认序列号,16位窗口大小,16为校验和……如果是UDP几乎只包含端口。
- 到了网络层,加头,里面有版本号,源IP,目的IP……
- 到了数据链路层,头里面就含有目的物理地址,源物理地址,类型……
聊天室需要自己写一个应用层的文本协议,简单的可以写一个结构体,也可以用JSON,XML等来构造。
其实在聊天室的服务端客户端模型中,socktet 套接字 在创建的时候type
参数选择TCP或者UDP,其实还可以选择原始套接字,网卡的混杂模式,就抓包开始了……,这个一定要写一篇聊一聊。其他的你是不需要关心的,内核中已经写好了有关的代码,你直接调用就OK了。
int socket(int domain, int type, int protocol);
IP地址的分配,这块还没聊,那我就简单说一下。
IPv4,IP协议的版本,现在已经有了IPv6,因为IPv4是32字节,随着主机的不断增多,32为已经不能满足,所以有了128位的IPv6。是通过IP与子网掩码的组合,掩码全为1(10进制255)的地方,代表网络,后部分代表主机。