Unix环境高级编程-学习-05-TCP/IP协议与套接字

目录

一、概念

二、TCP/IP参考模型

三、客户端和服务端使用TCP通信过程

1、同一以太网下

四、函数介绍

1、socket

(1)声明

(2)作用

(3)参数

(4)返回值

(5)通信域(协议族)相关宏

(6)套接字类型相关宏

(7)协议相关宏

(8)__domain和__type的组合

 2、socketpair

(1)声明

(2)作用

(3)参数

(4)返回值

 3、shutdown

(1)声明

(2)作用

(3)参数

(4)返回值

(5)how相关宏

五、参考书籍


一、概念

名称描述
套接字用于网络通信,应用与底层网络协议的一个接口。
协议交换信息的两个部分之间相互理解的一组规则、约定和数据结构的集合。
应用层负责处理应用的特定细节。像FTP、Telnet、E-mail等协议都属于应用层协议。
传输层负责为两台机器上的应用程序提供端到端的数据通信,常用协议有TCP(传输控制协议)和UDP(用户数据报协议)。
网络层负责IP报文的路由选择,也称为IP层,最重要的功能是路由,每一个IP报文包含源地址和目的地址。常用的IP协议有IPv4和IPv6。IP协议提供无连接的、不可靠的数据报传输服务,只是尽可能传送每一个IP报文到指定的地址,但不保证报文可靠地到达。TCP应用情况下,TCP保证可靠性。UDP应用情况下,可靠性由应用自己保证。
网络接口层由设备驱动程序和网卡组成,负责发送和接收IP数据报,应用程序几乎不涉及此层。
IPv4使用32位的地址,是20世纪80年代以来一直使用的一种协议。
IPv6使用128位的地址,为了应对20世纪90年代中期网络的快速增长而设计的。
TCP是面向连接的,提供客户端和服务端之间的连接。此协议可以保证为用户提供可靠的、顺序的、不重复的和全双工的字节流。
UDP是一种面向无连接的协议,其不需要在客户端和服务端建立连接,因此不保证数据报一定到达目的地和到达的顺序。
路由指分组从源端到目的端时,决定端到端路径的网络范围的进程。概括总结就是:路由接收数据包->查看目的地址->与路由表进行匹配找到转发端口->转发到该端口。

二、TCP/IP参考模型

TCP/IP协议可以抽象成如下层次模型。套接字相当于应用程序和底层协议交互的一个接口,无论我们是从网络读取、写入、配置网络协议都要通过套接字。

三、客户端和服务端使用TCP通信过程

1、同一以太网下

客户端的信息从上至下,通过网络,从下至上到达服务端。

客户端程序将应用数据包装成TCP数据传输给TCP,TCP将自己的数据报包装成IP报文发送给IP,IP再次包装传递给以太网,服务端的IP接收来自网络驱动程序的信息,解开IP层的包装还原回TCP信息传给TCP,TCP解开其TCP包装还原为应用数据传递给服务端程序。

四、函数介绍

1、socket

(1)声明

int socket(int __domain, int __type, int __protocol)

(2)作用

在通信域__domain中创建一个类型为__type、协议为__protocol的套接字。

(3)参数

参数名描述
__domain通信域,其决定了通信时使用的网络协议族。
__type套接字类型。
__protocol协议,从协议族中选一个具体协议。如果不清楚协议族与协议的对应关系,可以使用宏IPPROTO_IP,来让系统选择默认协议。

(4)返回值

名称描述
成功返回套接字文件描述符。
失败-1

(5)通信域(协议族)相关宏

名称描述
AF_INET网络通信,IPv4英特网协议。
AF_INET6网络通信,IPv6英特网协议。
AF_UNIXUNIX通信域,同一台计算机内两个进程通过文件系统进行通信,以文件系统路径名作为套接字的地址。
AF_UNSPEC未指定。

(6)套接字类型相关宏

名称描述
SOCK_STREAM字节流套接字,提供面向连接的,双向、可靠、顺序和不重复的数据流,数据没有边界,可支持带外数据。
SOCK_DGRAM数据报套接字,支持双向通信,但不保证数据报时顺序、可靠和不重复的。
1、进程可能从数据报套接字拿到重复的数据。
2、数据发送顺序和数据接收顺序不同。
3、数据是有边界的,每次往数据报套接字写数据时,数据就会形成一个包。
4、数据报套接字没有连接,每次发包时需指定接收者的地址。
SOCK_RAW原始套接字,其可以越过高层协议直接访问底层协议(IP协议或网络的物理层)

(7)协议相关宏

名称描述
IPPROTO_IPIPv4网际协议,如果不清楚协议族与协议的对应关系,可以使用宏IPPROTO_IP,来让系统选择默认协议。
IPPROTO_IPV6IPv6网际协议
IPPROTO_ICMP英特网控制报文协议
IPPROTO_IGMP英特网组管理协议
IPPROTO_RAW原始IP数据包协议
IPPROTO_TCP传输控制协议
IPPROTO_UDP用户数据报协议
IPPROTO_SCTP流控制传输协议

(8)__domain和__type的组合

__domain和__type的组合下的默认协议(会给出名字),support表示支持组合,但无协议名。not support表示不支持。

__type\__domainAF_INETAF_INET6AF_UNIX
SOCK_STREAMTCPTCPsupport
SOCK_DGRAMUDPUDPsupport
SOCK_RAWIPv4IPv6not support

 2、socketpair

(1)声明

int socketpair(int domain, int type, int protocol, int socket_vector[2]);

(2)作用

在通信域__domain中创建两个类型为__type、协议为__protocol的套接字,通常应用于父子进程间通信,类型于管道,两个文件描述符一个用于父进程一个用于子进程,不用的一方需关闭,每个套接字都是全双工的,可读可写,但个人感觉没有管道灵活,管道适用于子进程是另外的程序,映射到标准输入输出。匿名管道相关知识点可以参考之前的博客《Unix环境高级编程-学习-04-匿名管道PIPE》。

(3)参数

参数名描述
domain通信域,其决定了通信时使用的网络协议族。
type套接字类型。
protocol协议,从协议族中选一个具体协议。如果不清楚协议族与协议的对应关系,可以使用宏IPPROTO_IP,来让系统选择默认协议。
socket_vector两个套接字文件描述符,全双工。

(4)返回值

名称描述
成功0
失败-1

 3、shutdown

(1)声明

int shutdown(int socket, int how);

(2)作用

相较于close函数更灵活,可以关闭套接字的部分或全部,例如:套接字是全双工的,我们只是想从套接字读数据,我们就可以关闭它的写功能。

(3)参数

参数名描述
socket需要关闭的套接字。
how如何关闭套接字。

(4)返回值

名称描述
成功0
失败-1

(5)how相关宏

名称描述
SHUT_RD禁用进一步的接收操作。
SHUT_WR禁用进一步的发送操作。
SHUT_RDWR禁用进一步的发送和接收操作。

五、参考书籍

编号名称
1《UNIX Linux程序设计教程》
2《UNIX 环境高级编程》
3《UNIX 网络编程》

这三本写的都很好,建议大家有时间多阅读。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/537536.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python/crawl】如何使用Python爬虫将一系列网页上的同类图片下载到本地

【需求】 从网页https://www.zhainq.com/%e7%be%8e%e5%a5%b3%e5%86%99%e7%9c%9f%e6%9c%ba%e6%9e%84/%e6%97%a5%e6%9c%ac%e7%be%8e%e5%a5%b3%e5%86%99%e7%9c%9f/109012.html 开始,有十七页,每页都有大漂亮“小濑田麻由”的若干图片,想要将其…

HIVE伪分布安装

引言 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,类似于RDBMS(关系型数据库,如MySQL、Oracle、PgSQL),并提供类SQL的查询功能。 实验准备 1.搭建好伪分布安装模式的Hadoop的虚拟机,并配置了Linux网络。(可看我前面发布的文章) 2.apache…

使用 java 发送邮件,附件展示乱码,不是展示自己定义的文件名

刚开始我写的代码是这样的 private Mail initMail(List<Map<String , String>> writeInFieldsList , List<Map<String , ?>> allFieldsList , String smallCity) throws Exception {byte[] excelBytes CustomExcelUtils.trafficSignalWarning(writeI…

《IAB视频广告标准:综合指南(2022)》之概述篇 - 我为什么要翻译介绍美国人工智能科技公司IAB 系列(2)

IAB平台&#xff0c;使命和功能 IAB成立于1996年&#xff0c;总部位于纽约市。 作为美国的人工智能科技巨头社会媒体和营销专业平台公司&#xff0c;互动广告局&#xff08;IAB- the Interactive Advertising Bureau&#xff09;自1996年成立以来&#xff0c;先后为700多家媒体…

完整的通过git命令框和windows窗口将本地文件上传到gitee远程仓库流程步骤

1.下载git 这个网站搜索git官方&#xff0c;去下载就行了 2.打开git安装后的Git Bash命令框 3.在Git Bash命令框设置一下要远程链接的gitee账号 git config --global user.name “名字”Git config --global user.email “邮箱” 4.查看一下账号设置 git config --global -…

Android14之解决报错:No module named sepolgen(一百九十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Transformer家族

在《Transformer原理》中我们介绍了&#xff0c;现在很多大模型都是基于Transformer&#xff0c;其中最出名就是GPT和BERT模型&#xff0c;在GPT和BERT模型被提出来之后&#xff0c;NLP领域也出现了基于Transformer结构的模型&#xff0c;按照模型结构基本可以分为三类&#xf…

Nuxt3: useFetch使用过程常见一种报错

一、问题描述 先看一段代码&#xff1a; <script setup> const fetchData async () > {const { data, error } await useFetch(https://api.publicapis.org/entries);const { data: data2, error: error2 } await useFetch(https://api.publicapis.org/entries);…

Socket通信Demo(Unity客户端和C#)

Socket通信基本流程 首先要启动服务器创建Socket&#xff0c;然后要绑定服务器的一个端口这样客户端通过服务器IP端口号就能连接到服务器了服务器接下来会设置监听队列&#xff0c;监听并等待要连接到它的客户端客户端在服务器启动之后也建立自己的Socket&#xff0c;然后使用…

Oracle 主从切换脚本

一、 切换前预检查 1. dg_precheck_main_v1.4.sh #!/bin/bash#********************************************************************************** # Author: Hehuyi_In # Date: 2022年06月16日 # FileName: dg_precheck_main_v1.4.sh # # For sys user, execute the sc…

【嵌入式学习】C++day0313

一、思维导图 二、习题 #include <iostream>using namespace std;class Per { private:string name;int age;float * high;float * weight; public://有参构造函数Per(string n,int a,float h,float w):name(n),age(a),high(new float (h)),weight(new float (w)){}//析…

ubuntu安装并使用Anaconda

0、说明 对应着 Python 有 2.x 版本和 3.x 版本&#xff0c;Anaconda 也有 Anaconda2 以及 Anaconda 3 两个版本&#xff0c;考虑其流行度&#xff0c;一般谈及 Anaconda 时&#xff0c;默认为 Anaconda3。本人使用的ubuntu20.04。 1、Anaconda 简介 Anaconda 是一个用于科学…