原文:https://blog.csdn.net/qq_39290490/article/details/80981745
套接字--IP地址+端口号
1.IP地址----确认插入互联网中的某一台主机
IP数据包头中有两个IP地址:源IP地址与目的IP地址,源MAC地址与目的MAC地址
2.端口号=进程号,确定某台主机上的某一个进程
3.套接字确定了互联网中某台主机上的某一个进程。
4.PID表示惟一的一个进程,在任何场景都适用,而端口号也表示唯一一个进程,在网络场景下适用。
5.一个进程可能绑定多个端口号,而一个端口号不能绑定多个进程。以打电话为例,10086相当于进程IP,而客服相当于端口号。
6.在ICP/IP协议中,用本地地址(源IP地址)、本地端口号(源端口号)、远程地址(目的IP地址)、远程端口号(目的端口号)、协议(协议号)这样的五元组来表示两个不同主机间的一个完整通信。一般在一个网络环境中进程的唯一标识由三元组标识:协议、本地地址、本地端口号
网络字节序
网络数据流同样有大小端之分。
1.大小端
数据的高字节对应内存的低地址,数据的低字节对应内存的高地址,这样的为大端,否则为小端
2.为方便主机双方通信无障碍,TCP/IP协议规定网络数据流必须采用大端字节序
3.不论这台主机是大端机还是小端机,都采用TCP/IP协议来收发数据。即大端数据直接收发,小端数据先转为大端数据再收发。数据
发送时先发内存低地址,再发内存高地址。接收也是先内存低地址接收,再内存高地址接收,数据从高字节到低字节。即低地址发送
高字节接收,高地址发送低字节接收
socket编程接口
创建套接字(TCP/UDP,客户端+服务器)
int socket(int domain, int type, int protocol);
domain是用于创建套接字所使用的协议族,协议族决定了socket的地址类型。通信中对应的地址有:
AF_UNIX(只在本机内通信的套接字)
AF_INET(IPv4协议)
AF_INET6(IPv6协议)
type是指定socket类型。主要是:
SOCK_STREAM:创建TCP流套接字,提供面向连接的可靠的数据传输。
SOCK_DGRAM:创建UDP流套接字,提供无连接不可靠的数据传输。
protocol:指定协议,通常设置为0。
绑定套接字(TCP/UDP,服务器)
int bind(int socket,const struct sockaddr *address,socklen_t address_len);
socket即创建出来的套接字;address是一个const struct sockaddr*指针,指向要绑定的协议地址;addr_len是对应的地址长度。
通常服务器在启动的时候会绑定一个地址,用于提供服务,客户可通过它来连接服务器。而客户端不需要指定,系统自动分配一个端口号和IP地址。
监听套接字(TCP/UDP,服务器)--将套接字状态有创建变为监听,等待客户连接请求
int listen(int sockfd, int backlog);
接收套接字(TCP,服务器端)
int accept(int socket,struct sockaddr *address,socklen_t address_len);
建立连接(TCP,客户端)
int connect(int socket,const struct sockaddr *address,socklen_t address_len);
connect函数的第一个参数即为客户端的socket描述字,第二参数为服务器的socket地址,第三个参数为socket地址的长度。客户端通过 调用connect函数来建立与服务器的连接。