ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Linux系统编程——网络(TCP与UDP)

Linux系统编程——网络(TCP与UDP) 进程间通信方式1.同一主机传统管道有名管道无名管道信号IPC共享内存信号量信号队列2.不同主机socket ---不同主机之间的通信 //网络eg两个电脑进行通信找到对方的电脑并且找到电脑中的进程物理基础 --- 物理层面的联通通路5g、4g、有线网络光纤、卫星通信软件层面联通 --- 软件上的规定协议 --- 网络协议APRA阿帕网早期的ARPA网使用NCPNetwork Control Protocol协议不支持不同类型的操作系统不同类型的计算机之间的通信不支持纠错功能OSI模型Open System Interconnect (开放系统互连参考模型)为了解决不同体系结构的网络的互联问题分为7层 ---理想模型7.应用层6.表示层 //加密传输的需要 --- 数据的格式化加密解密gzip5.会话层 //连接状态长连接短链接连接的质量问题网络断开连接状态keep-close keep-alive4.传输层 //传输控制协议TCP、UDP、协议、文件、视频、音频TCP下载文件传输文件UDP音频视频3.网络层IP NAT //怎么找到对方2.数据链路层 封装成帧差错控制交换机 --- 全双工实时的工作数据的格式化 --- 大量数据交换时字节为单位字节大小端帧校验1.物理层 bit流说明1.物理层主要定义物理设备标准如网线的接口类型光纤的接口类型各种传输介质的传输速率主要作用是传输彼特流就是由10转化为电流强弱来进行传输到达目的地之后再转化为10就是数模转换与模数转换这一层数据叫做“比特”一帧[0101 0110]2.数据链路层定义了如何让格式化的数据以帧为单位进行传输以及如何让控制对物理介质的访问这一层通常还提供错误检测和纠正以确保数据的可靠传输这一层传输的数据:帧数据 (按到一定格式组织起来的一组数据)3.网络层路由器给在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择internet的发展使世界各地访问信息的用户数增加。网络层就是管理这些连接的层路由器就是在这一层工作这一层传递的数据“数据包段4.传输层transmit control定义了一些传输数据的协议和端口号如TCP传输控制协议传输效率低可靠性强用于传输可靠性要求高数据量大的数据UDP用户数据报协议于TCP相反用于传输可靠性要求低数据量小的数据主要是将从下层接收的数据进行分段和传输到达目的地之后再进行重组常常把这一层数据叫做段传输控制层 --- 控制传输过程 --- 根据实际需要 --- 通过不同的协议来实现5.会话层通过传输层端口号传输端口与接收端口建立数据传输的通路主要在系统之间发起会话或者接受会话请求设备之间需要互相认识可以是IP也可以是MAC或者是主机名6.表示层可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取例如 PC程序与另一台计算机进行通信 其中一台计算机使用扩展二一十进制交换码(EBCDIC) 而另一台则使用美国信息交换标准码ASCII来表示相同的字符。 如有必要表示层会通过使用一种通格式来实现多种数据格式之间的转换7.应用层最靠近用户的OSI层这一层为用户的应用程序例如电子邮件、文件传输和终端仿真提供网络服务实际情况TCP/IP模型网际互连模型4层实用模型工业标准TCP/IP协议栈应用层 --- 应用程序传输层 --- 端口号TCP/UDP网络层 --- IP地址物理层 --- 网卡驱动4层--- tcp/ip -标准应用层 --- 应用程序传输层 --- 端口号TCP/UDP网络层 --- IP地址网络接口层 --- 网卡驱动5层 osi 与 tcp/ip 模型之间的一种非标准形式应用层 --- 应用程序传输层 --- 端口号TCP/UDP网络层 --- IP地址数据链路层物理层 --- 网卡驱动函数接口socket1.socket是一个函数接口用来使用网络功能的2.linux一切皆文件的思想---socket也是一种特殊的文件----专门用来进程网络通信的文件linux网络编程基于TCP协议基于UDP协议TCP协议TCP(transmit control protocol):(类似 打电话)---可靠(1.面向连接 2.可靠传输 3.字节流)特点1.面向连接就是在进行通信之前必须建立好一条逻辑上的通路2.提供可靠传输四个无无丢失无失序无差错无重复3.字节流建立连接三次握手目的建立连接应用场景1.对可靠性要求较高的场合2.QQ微信等 软件的登录时UDP协议UDP(User Datagram Protocol):(类似 生活中的广播)特点不通过可靠传输在数据发送时不需要建立连接1.无连接2.不保证可靠传输3数据报应用1.小数据但是对速度要求较高(QQ.及时文本信息语音等)实时性要求较高场合2.广播组播3.无线网的传输网路编程TCP通信模型 --- CS 模型 (Client Server 客户端服务器模型) ----重点 BS 模型 (Browser Server 浏览器服务器模型) P2P模型 (Peer to Peer 点对点)CS通信模型TCP通信过程两个阶段1.建立连接2.通信客户端客户端一般都是主动的一方1.socketbind可选2.connect3.read / write4.close服务器端1.socket2.bind3.listen4.accept5.read / write6.close客户端#include sys/types.h /* See NOTES */ #include sys/socket.h int socket(int domain, int type, int protocol);功能创建通信的一端参数domainName Purpose Man page AF_UNIX, AF_LOCAL Local communication unix(7) AF_INET IPv4 Internet protocols ip(7) AF_INET6 IPv6 Internet protocols ipv6(7)typeSOCK_STREAM //流式套接字TCP协议使用SOCK_DGRAM //数据报套接字UDP协议使用protocol协议TCP / UDP给0表示默认协议根据type来决定返回值成功 返回socket的文件描述符失败 -1 errno被设置2.connect#include sys/types.h /* See NOTES */ #include sys/socket.h int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);功能发起连接请求参数sockfd 用到的socket的fdaddr 要通信的地址对于客户端来说就是服务器的地址IP端口号addrlen 表示addr参数地址的大小返回值成功 0失败 -1并且errno被设置struct sockaddr_in { sa_family_t sin_family; /* address family: AF_INET */ in_port_t sin_port; /* port in network byte order */ struct in_addr sin_addr; /* internet address -- ip地址 */ }; /* Internet address. */ struct in_addr { uint32_t s_addr; /* address in network byte order */ };字节序网络字节序大端将端口号转换为网络字节序的端口号htons uint16_t htons(uint16_t hostshort);功能将hostshort值转换为网络字节序并返回将IP地址转换为网络字节序的IP地址inet_addr in_addr_t inet_addr(const char *cp);功能将字符串形式的IP地址点分十进制转换为网络字节序形式的IP地址并返回网络中的地址IP地址1.IP地址是网络中主机的唯一标识它由网络地址和主机号组成网络地址是子网的唯一标识类似于区号主机号是子网内每台主机的编号IP的本质在现在(IPv4)的网络中IP地址是32bit的二进制数采用大端字节序.2.表示方法点分十进制将32位二进制码划分为4个字节每个字节转化成相应的十进制数字节之间用“.”来分隔3.IP地址的分类A、B、C、D、E4.子网掩码作用用来区分网络号也可以获取主机号进程网络中找到主机IP找到主机中的进程端口号端口号作用用来标识一个网络进程ip端口号 网络中进程的唯一地址服务器端#include sys/types.h /* See NOTES */ #include sys/socket.h int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);功能给sockfd绑定一个名字地址信息参数sockfd 用到的socket的fdaddr 要通信的地址对于客户端来说就是服务器的地址IP端口号addrlen 表示addr参数地址的大小返回值成功 0失败 -1并且errno被设置#include sys/types.h /* See NOTES */ #include sys/socket.h int listen(int sockfd, int backlog);功能将sockfd设置为监听套接字被动套接字参数sockfd 要设置的socketbacklog 表示等待队列的大小返回值成功 0失败 -1并且errno被设置#include sys/types.h /* See NOTES */ #include sys/socket.h int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);功能从listen的等待队列中提取第一个连接请求完成连接同时创建一个socket表示已经连接好的socket最后返回这个已经连接好的socket的fd参数sockfd 监听套接字的fdaddr 用来保存对端地址信息addlen 值结果参数必须初始化sizeof客户端地址类型返回值成功 返回已经连接好的socket的fd失败 -1并且errno被设置如果想知道客户端的地址信息struct sockaddr_in cliaddr; socklen_t addrlen sizeof(cliaddr); accept(sockfd, ( struct sockaddr *)cliaddr, addrlen)char *inet_ntoa(struct in_addr in);功能将网络字节序的IP地址转换为字符串形式的IP地址并返回注意客户端 只有一个socket服务器 有两个socket1.监听的socket2.通信的socketUDP协议特点无连接、不可靠、数据报编程CS通信UDP客户端主动的角色1.socket2.bind可选3.sendto4.recvfromUDP服务器被动的角色1.socket2.bind3.recvfrom4.sendto收发函数sendto //可以指定发送到哪里 --- 发数据recvfrom //可以接收对端的地址 --- 接收数据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);功能sendto将数据发送到指定的地址中通过sockfd参数sockfd 表示socket对应的fdbuf 存放数据的一块内存空间len 表示要发送的字节数flags 发送的标志MSG_DONWAIT //非阻塞0 默认方式dest_addr 目标地址 --- 代表要发送到的目的地址addrlen 代表目标地址数据的长度sizeofdest_addr返回值成功 返回发送出去的字节数失败 返回-1并且errno被设置ssize_t recv (int sockfd, void *buf, size_t len, int flags); ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);功能从socket中接收消息参数sockfd 表示socket对应的fdbuf 存放数据的一块内存空间len 表示要读取的字节数flags 读取的标志MSG_DONWAIT //非阻塞0 默认方式dest_addr 代表数据的源地址addrlen 源地址大小值结果参数socklen_t addrlen sizeof(src_addr);返回值成功 返回读取到的字节数失败 返回-1并且errno被设置
返回列表