文章目录
- 一:网络编程相关概念
- (1)什么是网络编程
- (2)网络编程中的相关概念
- ①:发送端和接收端
- ②:请求和响应
- ③:服务端和客户端
- 二:TCP和UDP
- (1)TCP
- (2)UDP
- 三:Socket(套接字)
- (1)什么是Socket
- (2)深入理解Socket
- (3)Socket分类
- ①:流式套接字(SOCK_STREAM)
- ②:数据包套接字(SOCK_DGRAM)
- ③:原始套接字
一:网络编程相关概念
(1)什么是网络编程
网络编程:是指网络上的主机通过不同的进程以编程的方式实现网络通信
(2)网络编程中的相关概念
①:发送端和接收端
在一次网络数据传输时
- 发送端:是指数据的发送方进程,发送端主机也即网络通信中的源主机
- 接收端:是指数据的接收方进程,接收端主机也即网络通信中的目的主机
- 收发端:发送端和接收端两端
注意发送端和接收端的概念是相对的,只是一次网络数据传输产生数据流向后的概念
②:请求和响应
一般来说获取一个网络资源会涉及两次网络数据传输
- 第一次:请求数据的发送
- 第二次:响应数据的发送
③:服务端和客户端
在常见的网络数据传输场景下
- 服务端:是指提供服务的一方进程
- 客户端:是指获取服务的一方进程
二:TCP和UDP
(1)TCP
TCP:是一种是面向连接的、可靠的、基于字节流的传输层通信协议
- 面向连接:一定是一对一才能连接,而不像UDP协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的
- 可靠的:无论的网络链路中出现了怎样的链路变化,TCP都可以保证一个报文一定能够到达接收端
- 字节流:消息是没有边界的,所以无论我们消息有多大都可以进行传输。并且消息是有序的,当前一个消息没有收到的时候,即使它先收到了后面的字节,那么也不能扔给应用层去处理,同时对重复的报文会自动丢弃
具体来说,其特点如下
①:.TCP是面向连接(虚连接)的传输层协议
②:点对点:每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的
③:可靠有序、不丢不重:TCP提供可靠交付的服务,无差错、不丢失、不重复、按序到达
④:TCP提供全双工通信:
- 发送缓存:准备发送的数据和已发送但尚未收到确认的数据
- 接受缓存:按序到达但尚未被接受应用程序读取的数据和不按序到达的数据
④:TCP面向字节流:TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流
- 流:流入到进程或从进程流出的字节序列
(2)UDP
UDP:UDP协议在IP之上只增加了两个最基本的服务:复用分用和差错检测,剩下只做一件事情:尽全力交付,能给多少就给多少。当开发者选择UDP协议时,程序几乎直接与IP打交道。虽然UDP提供的是不可靠的服务,但是它具有很多的优点或者特点让其在某些应用场景中仍然熠熠生辉
- UDP无需建立连接、不会引入建立连接时的时延:
- 无连接状态:TCP需要在端系统中维护连接状态。此连接状态包括接收和发送缓存、拥塞控制参数和序号与确认号的参数。而UDP不维护连接状态,也不跟踪这些参数。因此,某些专用应用服务器使用UDP时,一般都能支持更多的活动客户机
- 分组首部开销小:TCP有20B的首部开销,而UDP仅有8B的开销
- 无拥塞控制:因此网络中的拥塞不会影响主机的发送效率。某些实时应用要求以稳定的速度发送,能容忍一些数据的丢失,但不允许有较大的时延,而UDP正好满足这些应用的需求
- UDP面向数据报
三:Socket(套接字)
(1)什么是Socket
Socket:中文名为套接字,是由操作系统提供的用于网络通信的技术,是基于TCP/IP协议的网络通信的基本操作单元,基于Socket的网络程序开发就是网络编程
(2)深入理解Socket
- Socket英文原意为“插座、孔”,但中文里却把它翻译为“套接字”,是在让人有些费解
根据TCP/IP分层模型可以看到,在网络编程中用户所能做的操作都集于应用层,传输层开始以下均属于操作系统
这就意味着想要从传输层获取数据是一件非常麻烦的事情,因为用户必须要明白TCP/IP的协议操作和相关复杂的系统调用接口
因此Socket的作用就体现出来了,它会把TCP/IP层复杂的操作抽象为几个简单的接口以供应用层调用,以此来实现进程通信
总之,Socket是介于应用层和传输层之间的一个抽象层,可以称它为一种通信机制,Socket以上的进程是受应用程序控制的,以下的传输层协议则受操作系统控制。因此,只要应用程序选择使用TCP/IP协议进行通信,就必须要通过套接字与操作系统进行交互
那这种通信方式为什么叫做“Socket”呢?如下图,服务器就像一个大插排,包含很多插座,客户端就是像一个插头,每一个进程代表一条电线,客户端将电线的插头插到服务器插排上对应的插座上,就可以开始通信了
说的更深一点,其实套接字是应用程序为了获得网络通信服务而与操作系统进行交互时使用的一种机制 。当应用程序需要使用网络进行通信时,必须首先发出socket系统调用,请求操作系统为其创建一个套接字。此调用的实际效果是请求操作系统把网络通信中所需的一些系统资源(比如CPU时间,网络带宽等),分配给该程序。操作系统用套接字描述符(实则是一个小的整数)来表示这些资源的总和,然后该套接字描述符会返回给该进程,此后应用程序所有的网络操作(比如收发数据)都要使用这个套接字描述符(就像用open打开文件获得的一个文件描述符,然后write
,read
都要使用到这个描述符)。在处理系统调用的时候,通过套接字描述符,操作系统就可以识别出应该使用哪些资源来完成应用程序所请求的服务。通信结束后,会调用close系统调用让操作系统回收与该套接字相关的所有资源
(3)Socket分类
①:流式套接字(SOCK_STREAM)
流式套接字(SOCK_STREAM):流式套接字可以提供可靠的、面向连接的通讯流,这对应TCP套接字编程
②:数据包套接字(SOCK_DGRAM)
流式套接字(SOCK_STREAM):数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠,无差错,这对应UDP套接字编程。其不可靠表现在
- 如果你发送了一个数据报,它可能不会到达。
- 它可能会以不同的顺序到达
- 如果它到达了,它包含的数据中可能存在错误
③:原始套接字
流式套接字(SOCK_STREAM):原始套接字主要用于一些协议的开发,可以进行比较底层的操作。它功能强大,但是没有上面介绍的两种套接字使用方便,一般的程序也涉及不到原始套接字