摘要:
UNIX系统进程间通信机制(IPC),例如管道,FIFO,消息队列,信号量和共享存储,可以允许一台计算机上的进程通信。
而套接字网络进程通信接口,不仅实现了一台计算机的通信,还能够进行网络进程间通信。
一、四层协议栈
数据链路层
网卡接口的网络驱动程序,处理数据在物理媒介上的传输;不同的物理网络具有不同的电气特性,网络驱动程序隐藏实现细节,为上层协议提供一致的接口 数据链路层常用协议:地址解析协议(ARP)和反向地址解析协议(RARP),实现IP地址与机器物理地址(通常为MAC地址)之间的相互转换 网络层 实现数据包的路由和转发 常用协议:IP、ICMP
网络层
IP协议:逐跳发送模式;根据数据包的目的地IP地址决定数据如何发送;如果数据包不能直接发送至目的地,IP协议负责寻找一个合适的下一跳路由器,并将数据包交付给该路由器转发 ICMP协议:因特网控制报文协议,用于检测网络连接 传输层 为两台主机的应用程序提供端到端通信
传输层
使用的主要协议:TCP、UDP
传输层 TCP:传输控制协议,为应用层提供可靠的、面向连接的、基于流的可靠服务;使用超时重发、数据确认等方式确保数据被正确发送至目的地
UDP:用户数据报协议,为应用层提供不可靠的、无连接的、基于数据报的服务;不保证数据能正确发送
应用层
应用程序逻辑实现
常用协议:ping、telnet、DNS、HTTP、FTP、DHCP等
二、HTTP协议
主要特点
无连接:无连接是指每次连接只处理一个请求;服务器处理完客户请求,并收到客户应答后,即断开连接,节省传输时间
无状态:无状态是指协议对于事务处理没有记忆能力;应答较快,但传输数据量较大
HTTP URL:
定位网络资源 http://host[:port][abs_path]
HTTP请求
由三部分组成:请求行、消息报头、请求正文
格式:Method Request-URI HTTP-Version CRLF
Method:请求方法,GET、POST等
Request-URI:统一资源标识符
HTTP-Version:请求的HTTP协议版本
CRLF:回车换行
HTTP响应
由三部分组成:状态行、消息报头、响应正文
状态行格式:HTTP-Version Status-Code Reason-Phrase CRLF
HTTP-Version:服务器HTTP协议版本
Status-Code:服务器返回的响应状态码
Reason-Phrase:状态码的文本描述
HTTP状态码
状态代码有三位数字组成,首数字定义响应类别
1xx:指示信息,表示请求已接收,继续处理;
2xx:成功;
3xx:重定向,要完成请求必须进行更进一步的操作;
4xx:客户端错误,请求有语法错误或请求无法实现;
5xx:服务器端错误,服务器未能实现合法的请求
常见状态代码 200:OK,请求成功;400:Bad Request,请求有语法错误,不能被服务器所理解;401:Unauthorized,请求未经授权;403:Forbidden,服务器收到请求,但是拒绝提供服务;404:Not Found,请求资源不存在;500:Internal Server Error,服务器发生不可预期的错误;503:Server Unavailable,服务器不能处理客户请求
三、套接字
#include <sys/socket.h> int socket(int domain, int type, int protocal);
参数:名空间、通信类型和协议
名空间:PF_LOCAL(本地)或PF_INET(Internet)
通信类型:SOCK_STREAM(连接类型)或SOCK_DGRAM(数据报类型)
协议:传递0,让系统自动选择协议(通常为最佳协议)
返回值:套接字描述符
int close(int fd); //释放套接字 int connect(int sockfd, const struct sockadddr* addr, socklen_t addrlen);
参数: sockfd为套接字文件描述符;
addr为指向套接字地址结构体的指针(服务器地址);
addrlen为服务器地址字符串的长度
返回值:0表示连接成功,-1表示连接失败
ssize_t send( int sockfd, const void * buf, size_t len, int flags ); ssize_t sendto( int sockfd, const void * buf, size_t len, int flags, const struct sockaddr * dest_addr, socklen_t addrlen ); ssize_t sendmsg( int sockfd, const struct msghdr * msg, int flags );
int bind( int sockfd, const struct sockaddr * addr, socklen_t addrlen ); int listen( int sockfd, int backlog ); int accept( int sockfd, struct sockaddr * addr, socklen_t addrlen );
来源:https://www.cnblogs.com/pusidun/p/5725180.html