网络IPC:套接字

a 夏天 提交于 2020-03-10 05:30:01

摘要:

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 );

  

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!