未央微网站建设,弹出网站代码,早晨网站建设,衡水网站优化推广(#xff61;#xff65;∀#xff65;)#xff89;#xff9e;嗨#xff01;你好这里是ky233的主页#xff1a;这里是ky233的主页#xff0c;欢迎光临~https://blog.csdn.net/ky233?typeblog 点个关注不迷路⌯▾⌯ 目录
一、预备知识
1.理解源IP地址和目的IP地址
… (∀)嗨你好这里是ky233的主页这里是ky233的主页欢迎光临~https://blog.csdn.net/ky233?typeblog 点个关注不迷路⌯▾⌯ 目录
一、预备知识
1.理解源IP地址和目的IP地址
2.端口号
1.概念
2.理解 端口号 和 进程ID
3.理解源端口号和目的端口号
4.套接字
3.认识TCP协议
4.认识UDP协议
5.网络字节序
6.socket编程接口
1.socket 常见API
2.sockaddr结构 一、预备知识
1.理解源IP地址和目的IP地址
在IP数据包头部中, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址.
通过IP地址公网IP标定了主机的唯一性也就代表着可以把数据送到对方的机器中。
但是在通常情况下把数据送到对方的机器中是目的吗
事实上不是我们的两个主机在通信而是两台主机上的客户端进程在通信所以真正的网络通信其实是进程间通信将数据在主机间转发仅仅是手段机器收到之后需要将数据交付给指定的进程所以我们需要端口号才能交给进程。
2.端口号
1.概念
端口号是标定特定主机上的网络进程的唯一性
端口号是一个2字节16位的整数;端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理;IP地址 端口号能够标识网络上的某一台主机的某一个进程;一个端口号只能被一个进程占用 所以任何一个发出的报头里面一定要包含IP和PORT
2.理解 端口号 和 进程ID
我们之前在学习系统编程的时候, 学习了 pid 表示唯一一个进程; 此处我们的端口号也是唯一表示一个进程. 那么这两者之间是怎样的关系?
其实这两者没有任何关系进程pid是进程的端口号是网络的两个没必要产生关联要达到解耦
不是所有的进程都需要端口号不是所有的进程都作为客户端和服务器而每个进程都有pid
并且一个进程可以绑定多个端口号但是一个端口号不能被多个进程绑定
3.理解源端口号和目的端口号
传输层协议(TCP和UDP)的数据段中有两个端口号, 分别叫做源端口号和目的端口号. 就是在描述 数据是谁发的, 要 发给谁;
4.套接字
最后的结论我们的源ip加端口号port其中ip代表了全网的唯一性端口号代表了自己主机上进程的唯一性所以我们把这两个叫做套接字
所以网络通信的本质通过源ip源端口号标定了源主机唯一的一个进程通过目的ip和目的端口号标定了目的主机唯一的一个进程也叫做进程间通信我们把这种叫做套接字编程
3.认识TCP协议
此处我们先对TCP(Transmission Control Protocol 传输控制协议)有一个直观的认识
传输层协议有连接可靠传输面向字节流
4.认识UDP协议
此处我们也是对UDP(User Datagram Protocol 用户数据报协议)有一个直观的认识
传输层协议无连接不可靠传输面向数据报
5.网络字节序
我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏 移地址也有大端小端之分, 网络数据流同样有大端小端之分. 那么如何定义网络数据流的地址呢?
网络规定所有的网络数据都必须是大端这样即使A主机是小端也要转成大端来发送B主机就直接进行接受或转换 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出;接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存;因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址.TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节.不管这台主机是大端机还是小端机, 都会按照这个TCP/IP规定的网络字节序来发送/接收数据;如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送即可; 为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络 字节序和主机字节序的转换。
#include arpa/inet.h
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
这些函数名很好记,h表示host,n表示network,l表示32位长整数,s表示16位短整数。例如htonl表示将32位的长整数从主机字节序转换为网络字节序,例如将IP地址转换后准备发送。如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回
6.socket编程接口
1.socket 常见API
// 创建 socket 文件描述符 (TCP/UDP, 客户端 服务器)
int socket(int domain, int type, int protocol);
// 绑定端口号 (TCP/UDP, 服务器)
int bind(int socket, const struct sockaddr *address,socklen_t address_len);
// 开始监听socket (TCP, 服务器)
int listen(int socket, int backlog);
// 接收请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address,socklen_t* address_len);
// 建立连接 (TCP, 客户端)
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
2.sockaddr结构
socket API是一层抽象的网络编程接口,适用于各种底层网络协议,如IPv4、IPv6,以及后面要讲的UNIX Domain Socket. 然而, 各种网络协议的地址格式并不相同。 sockaddr结构 sockaddr_in结构 虽然socket api的接口是sockaddr, 但是我们真正在基于IPv4编程时, 使用的数据结构是sockaddr_in; 这个结构里主 要有三部分信息: 地址类型, 端口号, IP地址
in_addr结构 in_addr用来表示一个IPv4的IP地址. 其实就是一个32位的整数;