最后更新:2022-07-21 20:24:01 手机定位技术交流文章
进程间通信方式有七种:无名管道、有名管道、信号、消息队列、共享内存、信号灯集、socket 套接字通信。
前六种只能实现同主机的进程间通信,而socket 套接字既可以实现同主机的进程间通信,也能实现不同主机的进程间通信。
APRANET阶段
1968年6月, DARPA提出了资源共享计算机网络
(Resource Sharing Computer Networks),目的在于
连接所有DARPA计算机,这个网络叫做ARPAnet,
Apanet是内部的最早形式
早期的ARPAnet使用网络控制协议(Network Control
协议,NCP),不能连接不同类型的计算机,也不能
同样类型的操作系统,没有错误修正
TCP/IP两步协议
1974年12月,双方正式发表了第一份详细的TCP协议,
但是当一个数据包丢失时,这个协议不能有效地纠正
TCP/IP协议分为两个不同的协议:
传输控制协议TCP用于检测网络传输中的错误
专门用于连接不同网络的互联网协议IP
OSI开放系统互连模型
它是由国际标准化组织(ISO)提出的。
*物数网传会表应
TCP/IP协议集群的系统结构
实际生产过程中,由于OSI开放系统互连模型太过繁琐,所以没人使用,
但是他的思想思路是正确的,后面提出的其他体系结构,都是基于OSI开放系统互连模型而来的。
TCP/IP协议家族是互联网的行业标准。
应用程序层HTTP:超文本传输协议,
FTP:文件传输协议,
TFTP:简单的文件传输协议(使用TCP),
SMTP: 简单的邮件传输协议.
网络卡驱动物理接口开关
传输层TCP:传输控制协议,面向连接,可靠,
UDP: 用户数据报告协议, 不连接, 不可靠, 快速传输.
网络层IP:互联协议,
ICMP:互联网控制信息协议,IP与路由器之间发送消息的 ping命令所使用的协议
IGMP:互联网集团管理,集团广播协议
路由器
网络接口和物理层(链接层) FTP
ARP:通过IP获取对方的MAC地址的地址分析协议
RARP:通过MAC地址获取IP地址的反向地址分析协议
数据包装和解包装:(bitstream)
应用程序层:用户数据(通常为128字节)
传输层:TCP头(源端口和目的地端口)20字节
网络层:IP头(源IP地址和目的地IP地址)20字节
连结层:以太网头(目的MAC地址和源MAC地址)14字节(最大1,500字节的Linux数据不是以太网头)
LINUX核心的五个功能:
流程管理:计时器转动和上下文转换
内存管理:内存的分配和回收
文件管理:将0的一大堆转换为人类能够识别的字符
设备管理:所有文件
网络管理:网络协议堆栈(网络协议堆栈可以理解为内核提供的函数)
TCP和UDP是相同的:
同样的事情:这是一个传输层协议
差异:TCP是一种可靠的基于连接的传输协议,提供高可靠性的通信、数据错误无误、无损、无序和无重复的通信
适用于高传输质量要求以及大量数据传输,如用户登录帐户管理、密码等。
UDP用户数据报告协议是一个不可靠、不连结的协议,它允许在数据发送之前进行高效率的数据传输,因为不需要连接
适合发送小尺寸数据(如DNS服务器对IP地址查询时),适合于广播、组播式通信。即时通讯软件,音视频通讯。
TCP环服务器: 两个阻塞功能.
UDP兼容服务器: 阻塞函数.
网络编程基础知识:
字符串序列:存储多字符串整数的序列。
小终端序列:数据低级地址Intel、AMD
高级序列:数据高级地址低级ARM/Motorola
判断你自己的主人序列 吗?
#include <stdio.h>
int main(){
int m = 0x12345678;
char *p = (char *)&m;
if(*p == 0x78){
printf("小端n");
}else if(*p == 0x12){
printf("big endn");
}
return 0;
}
不同类型的CPU主机不一定具有相同的序列,因此发送器和接收器的数据可能不相同,因此网络序列的概念被发明
指定在网络中传输的数据必须是大端序列。
在 什么 情况 下 应 考虑 序列 转换 问题?
1.数据大于一个字节,并作为整体发送(字符串不需要)
我不知道这两个通信的主机序列。
如何将一个小端序列转换成一个大的端序列?
#include <stdio.h>
int main(){
unsigned int m = 0x12345678;
unsigned int n = 0;
char *p = (char *)&m;
char *q = p+3;
unsigned char temp = 0;
temp = *p;
*p = *q;
*q = temp;
p++;
q--;
temp = *p;
*p = *q;
*q = temp;
printf("%#x --> %#xn", m, n);
return 0;
}
字符串序列转换函数: h(host) n(network) l(long) s(short)
unint32_t htonl //主机转网络 4字节
uint16_t htons //主机转网络 2字节
uint32_t ntohl // 4字节网络接收器
uint16_t ntohs //网络转主机 2字节
//以htonl为例
#include <arpa/inet.h>
#include <stdio.h>
int main(){
unsigned int m = 0x12345678;
unsigned int n = htonl(m);
printf("%#x --> %#xn", m, n);
return 0;
}
打印结果:0x12345678 --> 0x78563412
插座函数也是一个特殊的文件描述符,通常称为插座
SOCK_STREAM:TCP使用
Sock_DGRAM:UDP使用
原始索克DOC_RAW:直接访问IP/ICMP等低级协议
IP地址:是网络中的主机的数目。
IP地址与MAC地址之间的区别:每个网络卡都有在工厂出厂时的唯一标识符,称为MAC地址。
一种在本地网络中通信时使用MAC地址通信的设备,在交换时在链层中工作。
如果您在网络中使用IP地址进行通信,路由器是在网络层中工作的设备。
IP地址i分为IPV4(4字节32位)和IPV6(16字节128位)
为什么IPV4和IPV6得分?
因为IPV4地址不够,但也不需要使用IPV6,因为现在有许多技术可以弥补IPV4的不足,
与NAT技术一样,一个IP地址可以通过路由器发送到一个本地网络IP地址,该地址使用本地网络的IP地址,其内部性能与
如果数据退出 LAN, 通过 NAT 技术将包中的源 IP 地址从 LAN IP 转换为公共网络 IP 。
通过百度查询的IP地址由运营商收取费用.
IP地址的表示:它被称为点-by-point十位数,是一个字符串,在计算机中,它是一个未签署的4位元格式。
IPV4地址由网络号码和主机号码组成。
IPV4地址分类:
网络号 主机号 规定最高位 范围 使用单位
A 1字节 3字节 0 0.0.0.0 - 127.255.255.255 政府/大公司/学校
B 2字节 2字节 10 128.0.0.0-191.255.255.255 中等规模的公司
C 3字节 1字节 110 192.0.0.0-223.255.255.255 个人
192.168.1.255 广播地址
D 1110 [224-239] 组播
E 11110 [240-255] 保留测试用的
子网掩护:由一系列连续的零和连续的零组成,用于获取与IP地址的网络号码,并与它们进行操作,从不能限制的网络段内容纳最多数量的主机。
如,ip地址是192.168.70.8 子网掩码设置成 255.255.255.0
取与运算可以得到的结果:192.168.70.0 ----这是网络号,网络号相同时,才能进行通信
本节共有256个IP地址:
其中 192.168.70.0 是网络号,是不能占用的
192.168.70.255 是广播的地址,也不能占用
交换设备也需要占有IP地址,通常是同一区域网络内最小的数目。
192.168.70.1
因此可以容纳的主机数目:266-1-1-1(网络交换机也可以作为IP主机计算)=254
192.168.70.x 网段将子网掩码设置成 255.255.255.128,同一子网能容纳的最大主机数?
这样,同一段可以分成两个子网
第一个子网IP地址范围:192.168.70.0~192.168.70.127
第二个子网IP地址范围:192.168.70.128~192.168.70.255
每个子网都必须减少到一个网络号码广播地址网络交换地址
因此,子网掩饰不一定是255255255。 交换设备的IP地址不一定是最小的数目。
IP地址转换的功能:
inet_addr()
将指定 bystrptr 的字符串转换为32位网络序列二进制值。
in_addr_t inet_addr(const char *strptr);
inet_ntoa()
将32位网络序列二进制地址转换为点对点十进制字符串。
char *inet_ntoa(stuct in_addr inaddr);
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, const char *argv[])
{
unsigned char ip_str[] = "192.168.70.10";
unsigned int ip_int = 0;
ip_int = inet_addr(ip_str);
unsigned char *p = (unsigned char *)&ip_int;
printf("%d.%d.%d.%dn", *p, *(p+1), *(p+2), *(p+3));
//执行结果 192.168.70.10 ----网络字节序的无符号4字节整型
return 0;
}
端口号: 为了区分 host 接收的处理包到哪个进程,使用端口号区分。
端口编号范围: 0-65535, 使用未签名短号存储.
使用通用服务端口号:
FTP:21
SSH:22
TFTP:69
HTTP:80/8080
TCP的三个握手和四个波浪:
三次握手:
发生在建立连接的过程中的,有客户端主动发起,在客户端的connect函数(listen函数)和服务器的accept函数之间发生的
SYN:seq->SYN:seq,ACK->ACK
为什么三次握手?不要两、四次握手?
三个握手主要用于确认双方的沟通初始数据的能力,并进行同步。 两个缺少一个确认,还有四个。
序列数是一个由通信双方保持的随机值,它自动增长,在超过4个字符时从0重新积累。
四次挥手:
中断过程完成,由发起主动中断的当事人(一般是客户)发起
FIN->ACK->FIN->ACK
本文由 在线网速测试 整理编辑,转载请注明出处。