网络编程简单基础知识

一,IP协议:它在源地址和目的地址之间,传送一种称为数据包的东西,它还提供对数据大小的重新组装功能,以适应不同的网络对包大小的要求。(源地址IP:发送方IP 目的地址IP :对方,接受方地址)

现在有两种版本:IPv4,IPv6
IPv4:4个字节,32位整数
IPv4:8个字节,64位整数
由于基于IPV4的应用很多,IPV4还是目前的主流。

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
二,我们再想想,有了IP地址,我们就可以实现通信了吗?比如我们使用的聊天工具QQ。
我们主机上的那么多应用在运行,发送方发送给我们,数据怎么正确的知道是QQ软件中的数据呢。
端口号:
1.端口号是一个2字节16位的整数
2.端口号是用来标识一个进程,告诉操作系统,当前的这个数据交给那个进程来处理
3.IP地址+ 端口号,能识别出网络上某一台主机的某一个进程
4.一个端口号只能被一个进程占用

源端口号和目的端口号:
快递:我们寄快递,肯定要填 地址 + 姓名
地址就如我们的IP地址
姓名就如我们的端口号

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
三,面向数据报,面向字节流:
认识TCP协议: ————– 认识UDP协议:
传输层协议 ——————– 传输层协议
有连接 ————————- 无连接
可靠传输 ———————- 不可靠传输
面向字节流 ——————– 面向数据报

面向数据报:UDP是面向报文的,发送方的UDP对应用层交下来的报文,不合并,不拆分,只是在其上面加上首部后就交给了下面的网络层,也就是说无论应用层交给UDP多长的报文,它统统发送,一次发送一个。而接收方,接到后直接去除首部,交给上面的应用层就完成任务了。它需要应用层控制报文的大小

面向字节流:TCP是面向字节流的,它把上面应用层交下来的数据看成无结构的字节流来发送,可以想象成流水形式的,发送方TCP会将数据放入“蓄水池”(缓存区),等到可以发送的时候就发送,不能发送就等着,TCP会根据当前网络的拥塞状态来确定每个报文段的大小。

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
四,网络字节序
我们知道每个主机的内存存储方式有大小端之分,那么我们的网络数据流同样也有大小端之分。

发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出
接受主机把从网络上接到的字节一次保存在接受缓存区中, 也是按内存地址从低到高的顺序保存
因此,网络数据流的地址应该按照这样的规定:先发出的数据是低地址,后发出的数据是高地址

TCP/IP 协议这样规定,网络数据流应该采用大端字节序,即低地址高字节。
不管这台主机是大端机还是小端机,都会按照TCP/IP规定的网络字节序来发送/接受数据
如果单钱发送机是小端,就需要先将数据转成大端数据再发送,否则忽略,直接发送即可。

#include<arpa/inet.h>

uint32_t htonl(uint32_t hostlong); //本函数将一个32位数从主机字节顺序转换成网络字节顺序
uint16_t htons(uint16_t hostshort);//将主机的无符号短整形数转换成网络字节顺序
uint32_t ntonl(uint32_t netlong);//将一个无符号长整形数从网络字节顺序转换为主机字节顺序。
uint16_t ntons(uint16_t netshort);//将一个无符号短整形数从网络字节顺序转换为主机字节顺序。

h表⽰示host,n表⽰示network,l表⽰示32位⻓长整数,s表⽰示16位短整数
如果参数为小端数据,则函数把该参数转换为大端序,返回参数。如果参数为大端序,则直接把参数返回。

猜你喜欢

转载自blog.csdn.net/Shawei_/article/details/81454861