网络编程:是指网络上的主机通过不同的进程以编程的方式实现网络通信
在一次网络数据传输时
注意发送端和接收端的概念是相对的,只是一次网络数据传输产生数据流向后的概念
一般来说获取一个网络资源会涉及两次网络数据传输
在常见的网络数据传输场景下
TCP:是一种是面向连接的、可靠的、基于字节流的传输层通信协议
具体来说,其特点如下
①:.TCP是面向连接(虚连接)的传输层协议
②:点对点:每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的
③:可靠有序、不丢不重:TCP提供可靠交付的服务,无差错、不丢失、不重复、按序到达
④:TCP提供全双工通信:
④:TCP面向字节流:TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流
UDP:UDP协议在IP之上只增加了两个最基本的服务:复用分用和差错检测,剩下只做一件事情:尽全力交付,能给多少就给多少。当开发者选择UDP协议时,程序几乎直接与IP打交道。虽然UDP提供的是不可靠的服务,但是它具有很多的优点或者特点让其在某些应用场景中仍然熠熠生辉
Socket:中文名为套接字,是由操作系统提供的用于网络通信的技术,是基于TCP/IP协议的网络通信的基本操作单元,基于Socket的网络程序开发就是网络编程
根据TCP/IP分层模型可以看到,在网络编程中用户所能做的操作都集于应用层,传输层开始以下均属于操作系统
这就意味着想要从传输层获取数据是一件非常麻烦的事情,因为用户必须要明白TCP/IP的协议操作和相关复杂的系统调用接口
因此Socket的作用就体现出来了,它会把TCP/IP层复杂的操作抽象为几个简单的接口以供应用层调用,以此来实现进程通信
总之,Socket是介于应用层和传输层之间的一个抽象层,可以称它为一种通信机制,Socket以上的进程是受应用程序控制的,以下的传输层协议则受操作系统控制。因此,只要应用程序选择使用TCP/IP协议进行通信,就必须要通过套接字与操作系统进行交互
那这种通信方式为什么叫做“Socket”呢?如下图,服务器就像一个大插排,包含很多插座,客户端就是像一个插头,每一个进程代表一条电线,客户端将电线的插头插到服务器插排上对应的插座上,就可以开始通信了
说的更深一点,其实套接字是应用程序为了获得网络通信服务而与操作系统进行交互时使用的一种机制 。当应用程序需要使用网络进行通信时,必须首先发出socket系统调用,请求操作系统为其创建一个套接字。此调用的实际效果是请求操作系统把网络通信中所需的一些系统资源(比如CPU时间,网络带宽等),分配给该程序。操作系统用套接字描述符(实则是一个小的整数)来表示这些资源的总和,然后该套接字描述符会返回给该进程,此后应用程序所有的网络操作(比如收发数据)都要使用这个套接字描述符(就像用open打开文件获得的一个文件描述符,然后write
,read
都要使用到这个描述符)。在处理系统调用的时候,通过套接字描述符,操作系统就可以识别出应该使用哪些资源来完成应用程序所请求的服务。通信结束后,会调用close系统调用让操作系统回收与该套接字相关的所有资源
流式套接字(SOCK_STREAM):流式套接字可以提供可靠的、面向连接的通讯流,这对应TCP套接字编程
流式套接字(SOCK_STREAM):数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠,无差错,这对应UDP套接字编程。其不可靠表现在
流式套接字(SOCK_STREAM):原始套接字主要用于一些协议的开发,可以进行比较底层的操作。它功能强大,但是没有上面介绍的两种套接字使用方便,一般的程序也涉及不到原始套接字