网络IPC:套接字

摘要:
套接字网络进程通信接口不仅实现了计算机的通信,而且可以进行网络进程通信。

摘要:

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,服务器不能处理客户请求

三、套接字

1. socket

#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain, int type, int protocal);

参数:名空间、通信类型和协议

名空间:AF_LOCAL,AF_UNIX(本地)或AF_INET(ipv4) AF_INET6(ipv6)

通信类型:SOCK_STREAM(连接类型)或SOCK_DGRAM(数据报类型)

协议:传递0,让系统自动选择协议(通常为最佳协议)

返回值:套接字描述符

2. bind

#include<sys/types.h>
#include<sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

struct sockaddr {
    sa_family_t sa_family;
    char        sa_data[14];
};
/*ipv4*/
struct sockaddr_in {
    sa_family_t sin_family;
    in_port_t sin_port;
    struct in_addr sin_addr;
};
struct in_addr {
    uint32_t s_addr;
};
/*ipv6*/
struct sockaddr_in6 {
    sa_family_t sin6_family;
    in_port_t sin6_port;
    uint32_t sin6_flowinfo;
    struct in6_addr sin6_addr;
    uint32_t sin6_scope_id;
}
struct in6_addr {
    unsigned char s6_addr[16];
}
/*unix*/
#define UNIX_PATH_MAX 108
struct sockaddr_un {
    sa_family_t sun_family;
    char sun_path[UNIX_PATH_MAX];
};

3. listen/connect

/*
* @param backlog defines the maximum length to which the queue of pending connections
*/
#include <sys/types.h>
#include <sys/socket.h>
int listen(int sockfd, int backlog);


#include <sys/types.h>
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

4.accept

#include <sys/types.h>
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

免责声明:文章转载自《网络IPC:套接字》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Java AES加密解密工具 -- GUI 、在线传输文件基于颜色和圆对乒乓球识别_20170329下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

pcre 使用

1、主页地址:http://www.pcre.org/下载pcre-7.8.tar.bz22、解压缩:tar xjpf pcre-7.8.tar.bz23、配置:cd pcre-7.8./configure --prefix=/usr/local/pcre-7.8 --libdir=/usr/local/lib/pcre --includedir=/usr...

网络编程传输文件

简易版服务器server import socket,struct,json sk = socket.socket() buffer = 1024 #每次接收数据的大小 sk.bind(('127.0.0.1',8090)) sk.listen() conn,addr = sk.accept() #接收 head_len = conn.recv(4) h...

teamlab与redmine试用对比报告

系统介绍 l  TeamLab 是一个免费开源的商业协作和项目管理的平台。TeamLab 主要功能包括:项目管理、里程碑管理、任务、报表、事件、博客、论坛、书签、Wiki、即时消息等等。 l  Redmine 是一个开源的、基于Web的项目管理和缺陷跟踪工具。它用日历和甘特图辅助项目及进度可视化显示,同时它又支持多项目管理。Redmine是一个自由开放 源...

Delphi中的Sender:TObject对象解析

procedure TForm1.Button1Click(Sender: TObject); begin end; 解析:Procedure是过程,TForm是窗体类,加上数字就是某个窗体,像TForm1就是Form1窗体。 Button1是你的按钮控件的名称,Button1Click就是按钮的单击事件,(Sender:Tobject)就是发送消息到对象...

关于socket buffer size的调优

为了达到最大网络吞吐,socket send buffer size(SO_SNDBUF)不应该小于带宽和延迟的乘积。之前我遇到2个性能问题,都和SO_SNDBUF设置得太小有关。但是,写程序的时候可能并不知道把SO_SNDBUF设多大合适,而且SO_SNDBUF也不宜设得太大,浪费内存啊。于是,有OS提供了动态调整缓冲大小的功能,这样应用程序就不用再...

探究 Redis 4 的 stream 类型

 redis 2 10 月初,Redis 搞了个大新闻。别紧张,是个好消息:Redis 引入了名为 stream 的新数据类型和对应的命令,大概会在年底正式发布到 4.x 版本中。像引入新数据类型这样的变化在 Redis 的发展历史上非常罕见,所以称之为大新闻一点也不为过。至少很多介绍 Redis 的资料要跟着修订了。 背景 按作者的介绍,strea...