网络之socket套接字-基础知识

这篇具有很好参考价值的文章主要介绍了网络之socket套接字-基础知识。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

本文介绍了网络的一些基础概念,主要包括:IP和端口号、TCP/UDP协议、网络字节流以及套接字接口。


一、IP与端口号

1.IP

每台主机都有自己的IP地址,所以当数据从一台主机传输到另一台主机,就需要IP地址。报头中会包含源IP和目的IP。
源IP地址:发送数据包的那个主机的IP地址。
目的IP地址:想要发到的那个主机的IP地址。
我们将数据从一台主机传递到另一台主机,并不是真正的目的。真正通信的不是这两个机器,而是这两个机器上的软件。
应用层不止一个软件。
公网IP唯一标识了主机,则数据就可以由一台主机传递到另一台主机。但是主机上有这么多软件(进程),我们怎么能保证软件A发送的数据被另一台主机上的软件B所接收呢?即如何标识主机上客户或服务进程的唯一性?
为了标识一台主机上服务进程的唯一性,我们用端口号port标识服务进程、客户进程的唯一性。

2.端口号

端口号是一个2字节16位的整数。
它是用来标识一个进程,告诉操作系统要把数据交付给哪个进程。(同一个主机中,端口号只能被一个进程占用)
因此,IP地址(唯一标识全网的某个主机) + 端口号(唯一标识服务器上的某个进程)能够标识网络上某个主机上的某个进程(全网唯一的进程)。
网络通信的本质就是进程间通信,我们之前讲过进程间通信的本质是进程们看到同一份资源,此时的同一份资源就是网络。
通信的本质就IO,因为我们上网的行为就两种:1.发送数据;2.接收数据。

3.我们之前讲过,可以用进程pid来标识一个进程,那么为什么还要有端口号port呢?

  1. 解耦:pid是系统规定的,而port是网络规定的,这样可以将系统和网络解耦;
  2. port标识服务器中的进程是唯一不变的(要让客户端进程找到服务器对应进程,就像是110、120一样不能被改变),而每次启动程序,程序的pid都会发送改变。
  3. 不是所有的进程都需要提供网络服务或请求(不是所有进程都需要port),但每个进程都需要pid。

一个端口号只能被一个进程占用,但是一个进程可以绑定多个端口号(1对n)。

4.底层OS如何根据port找到进程?

uint16(端口号)——task_struct——哈希。

我们在网络通信过程中,IP + port唯一标识一个进程,IP有源IP和目的IP,port也有源port和目的port。
我们在发送数据时也要将自己的IP和端口号发送过去,因为数据还要被发送回来。因此发送数据时一定会多出来一部分数据(以协议的形式呈现)。

二、TCP/UDP协议

我们用的套接字接口一定会使用传输层协议,不会绕过传输层去调用下面的协议。
传输层的协议分为:TCP协议和UDP协议

1.TCP协议特点

TCP(Transmission Control Protocol传输控制协议)

  1. 传输层协议
  2. 有连接(正式通信前要先建立连接)
  3. 可靠传输(在内部帮我们做可靠传输工作)
  4. 面向字节流

2.UDP协议特点

UDP(User Datagram Protocol用户数据报协议)

  1. 传输层协议
  2. 无连接
  3. 不可靠传输
  4. 面向数据报

注意:
理解不可靠传输:如果发送数据时出现了丢包的情况,或者数据被重复传递了(传递了多份)或者网络出现了问题等等造成的后果就叫做不可靠传输。因此,传输层就是用来解决可靠性的一个协议。
可不可靠是一个中性词。可靠是需要成本的,往往在编码和维护上都比较复杂;不可靠没有成本,使用起来也简单。
所以要分场景使用它们。

三、网络字节流

1.大端和小端数据

我们知道内存中的多字节数据相对于内存地址有大端和小端之分。

大端和小端:
小端:低权值放在低地址(小低低)
大端:低权值放在高地址(相反)

假设出现一种情况:一个大端机用大端的方式发送数据给一个小端机,如果现在是跨网络传数据,那么我们并不能清楚传输的数据是大端还是小端。
因此就有了规定,网络中的数据都是大端的
发送数据的主机如果是大端机,就不用再做处理;如果是小端机就将数据由小端转为大端再发送数据。(接收数据同理)

如何定义网络数据流的地址

发送主机,把发送缓冲区内的数据按内存地址由低到高的顺序发送(即,先发出的数据在低地址,后发出的数据在高地址。);
接收主机,把网络上接收到的数据按字节一次保存在接收缓冲区内,也是按内存地址从低到高的顺序保存。

四、socket套接字接口

1.socket常见API

//穿个件socket文件描述符(TCP/UDP,客户端 + 服务器)
int socket(int domain, int type, int protocol);
//绑定端口号(TCP/UDP,服务器)
int bind(int socket, const struct sockaddr*address, socklen_t address_len);
//开始监听socket(TCP, 服务器)
int listen(int socket, int backlog);
//接收请求(TCP, 服务器)
int accept(int socket, struct sockaddr* address, socklen_t* address_len);
//建立联系(TCP, 客户端)
int connect(int sockfd, const struct sockaddr* addr, socklen_t addrlen);

IP地址 + 端口号能够标识该主机上的唯一一个进程:IP和端口号port就称为套接字。
socket是插座的意思,未来进行网络通信时,插头和插座配套使用。

2. 套接字

套接字种类

套接字种类比较多,常见的有以下三种:
1.网络套接字;
2.原始套接字;
3.unix域间套接字;

用途

1.网络套接字主要运用于跨主机之间的通信,也可以支持本地通信;
2.域间套接字只能在本地通信;
3.原始套接字可以跨传输层(TCP/IP协议)访问底层的数据。
这些套接字应用场景完全不同,所以我们想使用套接字就要使用三套不同的接口。未来方便使用,设计者只设计了一套接口,因此需要通过不同的参数,解决所有网络或者其他场景下的通信问题。

3.例子

sockaddr_in(inet, 网络通信)sockaddr_un(unix, 域间套接字)

struct sockaddr_in{
	short int sin_family;		//地址族,一般为AF_INET
	unsigned short int sin_port;//端口号,网络字节序
	struct in_addr sin_addr;	//IP地址
	unsigned char sin_zero[8];	//用于填充,使sizeof(sockaddr_in)等于16
};

struct sockaddr_un{
	sa_family_t sun_family;	//AF_INET
	char sun_path[108];		//带有路径的文件名
};//通过同一个文件的路径来让进程看到同一份资源

可以看到sockaddr_insockaddr_un是两个不同的通信场景。区分它们可以使用前2个字节:16地址类型协议家族的标识符(代表是本地通信还是网络通信)。我们两个结构体都不用,直接用sockaddr。未来进行网络编程时,如果是网络通信,填充的网络信息是struct sockaddr_in这个结构体。
比如,我们想用网络通信,虽然参数是const struct sockaddr* addr,但实际上传进去的却是sockaddr_in结构体(类型不一致,需要进行强制类型转换)。函数内部对它们一视同仁,全部当作sockaddr类型,然后根据它们的前两个字节判断是什么通信,然后再强转回去。

接口的设计为啥是structaddr结构?为什么不用void类型(C语言未来能够接收任意来下,可以将参数设置为void*;并且void不需要强转)?
因为设计这一接口时的C语言标准还没有void

这是OS的接口,不能随意更改;
其他语言可能不支持void*。

可以将sockaddr看作基类,将sockaddr_in和sockaddr_un看做派生类,它们构成了多态体系。

五、总结

  1. IP地址 + 端口号port可以标识网络上的某一台主机上的某一个进程(全网唯一)。
  2. TCP/UDP协议是传输层的协议,其他特点不同。例如:UDP是不可靠的。
  3. 套接字是一种网络通信机制,IP + 端口号是套接字的构成形式。
  4. 网络字节序规定为大端(我们规定网络中的数据是大端形式)。
  5. sockaddr使用统一的接口解决所有网络或者其他场景下的通信问题。

总结

以上就是今天要讲的内容,本文介绍了socket套接字的相关概念。本文作者目前也是正在学习网络相关的知识,如果文章中的内容有错误或者不严谨的部分,欢迎大家在评论区指出,也欢迎大家在评论区提问、交流。
最后,如果本篇文章对你有所启发的话,希望可以多多支持作者,谢谢大家!文章来源地址https://www.toymoban.com/news/detail-498098.html

到了这里,关于网络之socket套接字-基础知识的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java网络编程基础:TCP Socket套接字编程 IntAddress UDP等...

    目录 一,网络基础 1.IP地址 2.端口 3.TCP/UDP协议 4.网络编程开发模式  二,基于套接字的Java网络编程 1.Socket  2.InetAddress 三.基于TCP的Socket网络编程 1.单服务器端与单Socket客户端一次通讯 2.单服务器端接收多次通讯  3.TCP网络通讯补充 四,基于UDP的网络编程 1. DatagramSocket:收发

    2024年04月29日
    浏览(45)
  • 【Python】Python 网络编程 ( Socket 套接字简介 | Socket 套接字使用步骤 | Socket 套接字服务端与客户端开发 )

    Socket 套接字 是一种 进程之间的 通信机制 , 通过套接字可以在 不同的进程之间 进行数据交换 ; 在 网络编程 中 , Socket 套接字 主要用于 客户端 与 服务器 之间的 通信 , 大部分 网络相关的应用程序 , 都使用到了 Socket 套接字技术 ; 套接字有两种类型 : 流套接字 : 提供了一个可

    2024年02月15日
    浏览(153)
  • 【网络编程】socket套接字

    如果我们的台式机或者笔记本没有IP地址就无法上网,而因为每台主机都有IP地址,所以注定了数据从一台主机传输到另一台主机 一定有源IP和目的IP 。 所以在报头中就会包含源IP和目的IP。 而我们把数据从一台主机传递到另一台主机并不是目的,真正通信的其实是应用层上的

    2024年02月02日
    浏览(65)
  • 网络编程套接字(Socket)

    认识IP地址, 端口号, 网络字节序等网络编程中的基本概念; 学习socket api的基本用法; 能够实现一个简单的udp客户端/服务器; 能够实现一个简单的tcp客户端/服务器(单连接版本, 多进程版本, 多线程版本); 理解tcp服务器建立连接, 发送数据, 断开连接的流程; 通俗易懂地说,源

    2024年01月21日
    浏览(57)
  • 【网络协议】聊聊套接字socket

    网络编程我们知道是通过socket进行编程的,其实socket也是基于TCP和UDP协议进行编程的。但是在socket层面是感知不到下层的,所以在设置参数的时候,其实是端到端协议智商的网络层和传输层。TCP是数据流所以设置为SOCK_STREAM,而UDP是基于数据报的,设置为SOCK_DGRAM 整体流程其实

    2024年02月07日
    浏览(42)
  • 【计算机网络】socket 网络套接字

    实际上我们两台机器在进行通信时,是应用层在进行通信,应用层必定会推动下层和对方的上层进行通信。 其实网络协议栈中的下三层,主要解决的是数据安全可靠的送到远端机器。而用户使用应用层软件,完成数据发送和接收的。那么用户要使用软件,首先需要把这个软件

    2024年02月22日
    浏览(43)
  • 网络编程—Socket套接字详解

    目录 一、网络编程 1.1、为什么需要网络编程? 1.2、什么是网络编程 1.3、发送端和接收端 ​编辑1.4、请求和响应 ​编辑1.5、客户端和服务端  二、Socket套接字  2.1、概念 2.2、分类  2.2.1、流套接字  2.2.2、数据报套接字  2.2.3、原始套接字  2.3、Socket编程注意事项  1.1、为什

    2024年02月16日
    浏览(54)
  • 网络编程之 Socket 套接字(使用数据报套接字和流套接字分别实现一个小程序(附源码))

    网络编程是指网络上的主机,通过不同的进程,以编程的方式实现 网络通信(或称为网络数据传输) 只要满足不同的进程就可以进行通信,所以即便是在同一个主机,只要不同的进程,基于网络传输数据,也属于网络编程 在一次网络传输中: 发送端: 数据的 发送方进程

    2024年02月03日
    浏览(62)
  • [JAVAee]网络编程-套接字Socket

    目录 基本概念 发送端与接收端 请求与响应 ​编辑客户端与服务器 Socket套接字  分类 数据报套接字 流套接字传输模型   UDP数据报套接字编程 DatagramSocket API DatagramPacket API InetSocketAddress API 示例一: 示例二: TCP流数据报套接字编程 ServerSocket API Socket API 示例一:   网络编程指的

    2024年02月13日
    浏览(56)
  • socket | 网络套接字、网络字节序、sockaddr结构

    欢迎关注博主 Mindtechnist 或加入【Linux C/C++/Python社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。 专栏:《网络编程》 Socket本身有“插座”的意思

    2024年02月05日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包