第二章 网络协议

第一节 计算机网络应用体系结构

  • 从体系结构角度可以分为:客户/服务器(C/S)结构纯P2P(Peer to Peer)结构混合结构3种类型。

一,客户/服务器(C/S)结构网络应用

  • C/S结构的网络应用是最典型,最基本的网络应用。
  • 网络应用的通信双方分为服务器程序和客户程序,服务器程序需要先运行,做好通信的准备,客户程序后运行,主动请求与服务器进行通信。
  • C/S网络应用最主要的特征是通信只在客户与服务器之间进行,客户与客户之间不进行直接通信。
  • C/S通信过程中,主动发起通信的一方就是客户,被动接受通信的一方就是服务器。

二,纯P2P结构网络应用

  • 在文件分发,文件共享,视频流服务等应用中,P2P应用表现出优越的性能,如Gnutella,BitTorent等。
  • 在纯P2P网络应用中,没有一直在运行的传统服务器,所有通信都是在对等的通信方之间直接进行,通信双方没有传统意义上的客户与服务器之分,“地位”对等。
  • P2P应用中的每个对等端都同时具备C/S应用的客户与服务器的特征,是一个服务器与客户的结合体。事实上,P2P应用中的对等端软件包括服务器软件与客户端软件。
  • P2P应用中,对等端都是动态加入或离开应用,新加入的对等端需要知道有那些对等端在线,在线对等端的地址以及在线对等端提供的服务等,这是P2P应用需要解决的关键问题之一。对于纯P2P应用,由于没有中心服务器,所以解决这些问题就更为困难。

三,混合结构网络应用

  • 混合结构网络应用将C/SP2P应用相结合,既有中心服务器的存在,又有对等端(客户)间的直接通信。
  • 在混合结构网络应用中,存在客户(即对等端)与服务器之间的传统C/S结构的通信,也存在客户之间直接通信。
  • 通常每个客户通过C/S方式向服务器注册自己的网络地址,声明可共享的资源或可提供的服务,并通过中心服务器发现其他在线的客户,检索其他客户可以共享的资源等信息。

第二节 网络应用通信基本原理

  • 网络应用的基本通信过程就是运行在不同主机上的应用进程间以C/S方式进行的通信。在C/S结构的网络应用中,服务器端运行的是服务器进程,被动地等待客户请求服务;客户端运行的是客户进程,主动发起通信,请求服务器进程提供服务。应用进程间遵循应用层协议交换应用层报文M
  • 应用层协议定义了应用进程间交换的报文类型,报文构成部分具体含义以及交换时序等内容,即语法,语义和时序等协议三要素内容。从应用层角度来看,应用进程之间遵照应用层协议就可以直接实现端到端的报文M的交换,但是,实质通信过程并非如此。无论是服务器进程还是客户进程,当其遵循应用层协议组织好应用层报文后,需要通过层间接口(如应用编程接口API)将报文传递给相邻的传输层,请求传输层协议提供的端到端传输服务。
  • 典型的网络应用编程接口是套接字Socket)。应用程序可以通过创建套接字实现与底层协议接口,并可以进一步通过套接字实现应用进程与底层协议之间的报文交换。因此,套接字是每个应用进程与其他应用进程进行网络通信时,真正收发报文的通道。
  • 一个应用进程可以创建多个套接字与同一个或不同的传输层协议进行接口。对于一个传输层协议,需要为与其接口的每一个套接字分配一个编号,标识该套接字,该编号称为端口号port number)。
  • 通常服务器进程套接字会分配特定的端口号,而客户进程的套接字会绑定一个随机的唯一端口号。尤其是标准化应用,标准为不同的服务器分配了不同的默认端口号,Web服务器的默认端口为80,这部分端口号称为熟知端口号well-known port munber)。每个应用进程通过一个或多个套接字与传输层协议进行接口,通过进程运行的主机IP地址以及其套接字所绑定的端口号可以标识应用进程。

第三节 域名系统(DNS)

  • DNS(Domain Name System)是一个重要的基础应用,因为任何一个需要使用域名进行通信的网络应用,在应用通信之前首先需要请求DNS应用,将域名映射为IP地址。实现将域名映射为IP地址的过程,称为域名解析
  • DNS为了实现域名解析,需要建立分布式数据库,存储网络中域名与IP地址的映射关系数据,这些数据库存储在域名服务器上,域名服务器根据用户的请求提供域名解析服务。

一,层次化域名空间

  • 因特网采用了层次树状结构的命名方法,任何一个连接在因特网上的主机或路由器,都可以有一个唯一的层次结构的域名。
    • 国家顶级域名nTLD:cn标识中国,us表示美国,uk表示英国等。
    • 通用顶级域名gTLD:最早的顶级域名是com(公司和企业),net(网络服务机构),org(非盈利组织),edu(专用的教育机构),gov(专用的政府部门),mil(专用的军事部门),int(国际组织)。
    • 基础结构域名(infrastructure domain):这种顶级域名只有一个,即arpa,用于反向域名解析,因此又称为反向域名

二,域名服务器

  • 一个服务器所负责管辖的(或有权限的)范围叫做区(zone)。
  • 每个区设置相应的权威域名服务器,用来保存该区中的所有主机的域名到IP地址的映射。
  • 域名服务器根据其主要保存的域名信息以及在域名解析过程中的作用等,可以分为根域名服务器顶级域名服务器权威域名服务器中间域名服务器4类。
  • 任何一台主机在网络地址配置时,都会配置一个域名服务器作为默认域名服务器,这样这台主机任何时候需要进行域名查询,都会将域名查询请求发送给该服务器;该服务器如果保存了被查询域名的信息,则直接做出响应,如果没有,则代理服务器查询其他域名服务器,直到查询到结果,最后将查询结果发送给查询主机。这个默认域名服务器通常称为本地域名服务器。是主机进行域名查询过程中首先被查询的域名服务器。
  • 根域名服务器是最重要的域名服务器。全球互联网中部署了有限的几个根域名服务器,每个根域名服务器都知道所有的顶级域名服务器的域名和IP地址。不管是哪一个本地域名服务器,若要对因特网上任何一个域名进行解析,只要自己无法解析,就首先求助于根域名服务器。在因特网中共有13个不同IP地址的根域名服务器,名字是用一个英文字母名,从a一直到m
  • 顶级域名服务器,即TLD服务器,负责管理在该顶级域名服务器注册的所有二级域名。顶级域名服务器的名称对应一个域名的最后一个名字,是对一个行业的命名,或对一个区域的命名。
  • 权威域名服务器,负责一个区的域名服务器,保存该区中的所有主机的域名到IP地址的映射。
    • 任何一个拥有域名的主机,其域名与IP地址的映射关系等信息都存储在所在网络的权威域名服务器上。
  • 在层次域名结构中,有时还存在一些既不是根域名服务器,又不是顶级域名服务器,也不是权威域名服务器的域名服务器,这些域名服务器通常称为中间域名服务器

三,域名解析过程

  • 域名解析分为递归解析迭代解析
  • 提供递归查询服务的域名服务器,可以代替查询主机或其他域名服务器,进行进一步的域名查询,并将最终解析结果发送给查询主机或服务器。
  • 提供迭代查询的服务器,不会代替查询主机或其他域名服务器,进行进一步的查询,只是将下一步要查询的服务器告知查询主机或服务器。
  • 通常本地域名服务器都提供递归查询服务。主机在进行域名查询时,本地域名服务器如果没有被查询域名的信息,则代理主机查询根域名服务器或其他服务器,直到得到被查询域名的IP地址,最后将解析结果发送给主机。

在这里插入图片描述

  • 提供迭代查询服务的域名服务器不会代理客户的查询请求,而是将最终结果或者下一步要查询的域名服务器直接响应给查询客户。根域名服务器通常只提供迭代查询服务,当根域名服务器收到本地域名服务器的迭代查询请求报文时,要么给出所要查询的IP地址,要么在响应报文中告诉本地域名服务器下一步应当查询哪一个域名服务器,本地域名服务器则继续查询下一个域名服务器,直到查询到被查询域名主机的权威域名服务器。

在这里插入图片描述

  • 无论是递归解析还是迭代解析,只要本地域名服务器不能直接响应解析结果,则都需要从根域名服务器开始查询。会严重影响查询响应时间和查询效率,解决办法:
    • 域名服务器增加缓存机制:即在为客户做出响应的同时,每个域名服务器会将在域名解析过程中解析到的结果存储到域名数据库中,当再次收到相同域名信息的查询请求时,便可以利用缓存的信息直接做查询响应,从而缩短域名查询的时间。

第四节 万维网应用

一,HTTP

1,HTTP连接

  • HTTP基于传输层的TCP传输报文。浏览器在向服务器发送请求之前,首先需要建立TCP连接,然后才能发送HTTP请求报文,并接收HTTP响应报文。根据HTTP在使用TCP连接的策略不同,可以分为非持久连接的HTTP持久连接的HTTP
    • 非持久连接是指HTTP客户与HTTP服务器建立TCP连接后,通过该连接发送HTTP请求报文,接收HTTP响应报文,然后断开连接。HTTP/1.0默认使用非持久连接,每次请求传输一个对象都需要新建立一个TCP连接。
      • 为了提高或改善HTTP的性能,需要对HTTP/1.0的这种默认的非持久连接使用方式进行优化,典型的优化技术包括两种。
        • 并行连接,通过建立多条并行的TCP连接,并向发送HTTP请求和并行接收HTTP响应。并行连接并不一定总能减小延迟,加快网页加载速度,并行连接会增加客户端主机的资源开销,系统通常对同时建立的并行TCP连接数有限制。
        • 持久连接,重用已建立的TCP连接发送新的HTTP请求和接收HTTP响应,从而消除新建TCP连接的时间开销。
    • 持久连接又分为两种工作方式:非流水方式持久连接流水方式持久连接
      • 非流水方式持久连接:也称为非管道方式持久连接,客户端在通过持久连接收到前一个响应报文后,才能发出对下一个对象的请求报文。。与非持久连接相比,连续请求多个对象时,只需建立一次TCP连接,这样,每获取一个对象只需一个RTT时间。
      • 流水方式持久连接:也称为管道方式持久连接,客户端在通过持久连接收到前一个对象的响应报文之前,连续依次发送对后续对象的请求报文,然后再通过该连接依次接收服务器发回的响应报文。使用流水方式持久连接时,获取一个对象平均时间远小于1个RTT时间,如果忽略对象传输时间,连续请求的多个对象只需1个RTT时间。
      • HTTP/1.1默认情况下使用流水方式持久连接。HTTP/1.1的持久连接默认是激活的。如果希望结束持久连接,可以在报文中显式地添加connection: close首部行。
  • HTTP/1.1使用持久连接的主要约束与规则
    • 如果客户端不期望在连接上发送其他请求,则应该在最后一条请求报文中包含connection:close首部行。
    • 如果客户端在收到的响应报文中包含 connection:close 首部行,则客户端不能再在这条连接上发送更多的请求。
    • 每个持久连接只适用于一跳传输,HTTP/1.1代理必需能够分别管理与客户端和服务器的持久连接。
    • HTTP/1.1代理服务器不应该与HTTP/1.0客户端建立持久连接。

二,Cookie

  • HTTP服务器在向客户发送被请求的文件后,不保存任何关于该客户的状态信息,因为HTTP服务器并不保存关于客户的任何信息,所以HTTP被称为无状态协议stateless protocol)。
  • Cookie中文名称为小型文本文件,指某些网站为了辨别用户身份,进行会话跟踪而存储在用户本地终端上的数据。
  • Cookie由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookiekey/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器,Cookie主要包括4部分内容。
    • HTTP响应报文中的Cookie头行:Set-Cookie。通过Set-Cookie,发送通常不超过4KBCookie信息,包括为其用户分配的ID,用户对网站的访问偏好等。
    • 用户浏览器在本地存储,维护和管理的Cookie文件。包括网站的域,路径,内容,有效期和安全5个字段。
    • HTTP请求报文中的Cookie头行:Cookie。当用户向已经访问过且已经获得Cookie信息的网站发送HTTP请求报文时,浏览器会自动检索本地的Cookie文件,并在每个请求报文中通过Cookie头行,携带上网站为该用户分配的Cookie信息。
    • 网站在后台数据库中存储,维护Cookie信息,包括已分配给用户ID,每个ID用户在本网站的访问特征等。
  • Cookie常见的用途
    • 网站利用Cookie的ID来准确统计网站的实际访问人数,新访问者和重复访问者的人数对比,访问者的访问频率等数据。
    • 网站利用Cookie限制某些特定用户的访问。
    • 网站可以存储用户访问过程中的操作习惯和偏好,对不同的用户提供不同的服务。
    • 记录用户登录网站使用的用户名,密码等信息,当用户多次登录时,无须每次都从键盘输入。
    • 电商利用Cookie可以实现“购物车”功能。

第五节 Internet电子邮件

一,电子邮件系统结构

  • 电子邮件系统主要包括邮件服务器简单邮件传输协议SMTP),用户代理邮件读取协议等。
  • 邮件服务器的功能是发送和接收邮件,同时还要向发信人报告邮件传送的情况,是电子邮件体系结构的核心。
  • 邮件服务器维护管理一个外出邮件队列,队列中暂存注册用户等待向外发送的邮件(发送基于SMTP)。
  • 当发送邮件时,邮件服务器首先从收件人邮箱地址中解析出接收邮件服务器的域名或IP,然后将邮件发送给邮件服务器,邮件服务器将接收到的邮件存放到用户的邮箱中。
  • 用户代理User Agent)是电子邮件应用的客户端软件,为用户提供使用电子邮件的接口。用户代理的主要功能是支持用户撰写,显示,处理和收发邮件,为用户阅读,回复,转发,保存和撰写邮件等提供编辑与操作环境。
  • 邮件服务器之间发送和接收邮件时按照客户/服务器方式工作。实现邮件服务器间发送邮件的应用层层协议是SMTP,用户代理向注册邮件服务器发送邮件时,通常也是基于SMTP。从客户/服务器通信方式来看,一个邮件服务器即可以看作客户,又可以看作服务器。一个邮件服务器通常至少包含两个进程(或线程):邮件发送进程(mail sender)和邮件接收进程(mail receiver)。邮件接收进程实现SMTP的服务器端,通常绑定端口号25
  • 邮件的发送与接收过程
    • 用户A首先利用用户代理撰写邮件,然后基于SMTP将邮件发送到其注册的邮件服务器A的外出邮件队列中,等待邮件服务器发送。
    • 邮件服务器A从队列中取出用户A的邮件,基于SMTP发送给邮件服务器B。
    • 邮件服务器B将邮件存放到用户B的邮箱中。
    • 在某个时刻,用户B利用用户代理连接邮件服务器B上运行的邮件读取服务,基于邮件读取协议,将其邮箱中的邮件传输到本地,或者对邮箱中的邮件进行阅读,移动等操作。

二,SMTP

  • SMTPInternet电子邮件中核心应用层协议,实现邮件服务器之间或用户代理到邮件服务器之间的邮件传输。SMTP使用传输层TCP实现可靠数据传输。
  • SMTP邮件发送过程
    • SMTP客户端首先请求与服务器端的25号端口建立TCP连接,连接一旦建立,便开始进行SMTP应用层交互,实现邮件的发送。
    • TCP建立成功后,SMTP通过3个阶段的应用层交互完成邮件的传输,分别是握手阶段,邮件传输阶段和关闭阶段。
    • 握手阶段:彼此声明自己的身份。
    • 邮件传输阶段:客户端首先向服务器端通告邮件发送者与邮件接收者的邮箱地址,然后开始邮件数据的传输。
    • 关闭阶段:声明邮件传输结束,并关闭TCP连接。
  • SMTP特点
    • SMTP只能传送7位ASCII码文本内容,包括SMTP命令,应答消息以及邮件内容。因此,SMTP不能直接传送可执行文件或其他的二进制对象(如:图像,声音,视频等),包括许多其他非英语国家的文字(如:中文,俄文等),在通过SMTP传送这类内容时,必需将这些内容转换为7位的ASCII码文字形式。
    • SMTP传送的邮件内容不能包含“CRLF.CRLF”,因为该信息用于标识邮件内容的结束,如果邮件内容中包含该信息,则SMTP在传输时,需要进行转义。
    • SMTP是“推动”协议。当客户端有邮件发送给服务器时,客户主动与服务器(25号端口)请求建立TCP连接,然后将邮件“推送”给服务器。
    • SMTP使用TCP连接是持久的。

三,邮件读取协议

  • 目前Internet邮件系统中比较流行的邮件读取协议有第三版的邮局协议(Post Office Protocol-Version 3POP3),互联网邮件访问协议Internet Mail Access ProtocolIMAP)和HTTP,其中HTTP被用作Web Mail系统中的邮件读取协议。

1,POP3

  • POP3是一个简单的邮件读取协议,为了保证读取邮件过程的可靠性,POP3协议使用传输层TCP
  • POP3客户端运行在用户代理中,POP3服务器运行在邮件服务器上,端口号为110
  • POP3交互过程分为3个阶段
    • 授权Authorization):用户代理需要向服务器发送用户名和口令(以明文形式),服务器鉴别用户身份,授权用户访问邮箱。由于用户名和口令是明文传输的,所以安全性并不高。授权阶段主要有两个命令:user 和pass,分别向服务器发送用户名和口令。
    • 事务处理:用户代理向服务器发送POP3命令,实现邮件读取,为邮件做删除标记,取消邮件删除标记以及获取邮件的统计信息等操作。
    • 更新:客户发出了quit命令,结束POP3会话,服务器删除哪些被标记为删除的邮件。

2,IMAP

  • IMAP服务器将每个邮件与一个文件夹进行关联,当邮件第一次到达服务器时,与收件人的INBOX文件夹相关联。通过IMAP,收件人可以在服务器上创建新的文件夹,并可以对邮件进行移动,查询,阅读,删除等操作。
  • IMAP的一个重要特征是允许用户代理只读取邮件的部分内容。(当用户代理访问IMAP服务器的网络带宽比较低,或者想先看以下邮件主题再决定是否要下载整个邮件时,此特性非常有用)。

3,HTTP

  • 当使用基于Web的邮件时,HTTP便被用于邮件的读取,此时HTTP也作为邮件读取协议使用。基于Web的电子邮件简称Web邮件(Web Mail)。
  • Web邮件的优点之一是用户代理就是普通的Web浏览器。
  • Web邮件与普通电子邮件系统的主要区别在于用户代理与邮件服务器之间的邮件收发不同,而邮件服务器与其他邮件服务器之间的发送和接收过程并没有区别,仍然使用SMTP

第六节 FTP

  • 文件传输协议File Transfer ProtocolFTP)是在互联网的两个主机间实现文件互传的网络应用,其应用层协议也称为FTP

  • FTP可以减少或消除在不同操作系统下处理文件的不兼容性,屏蔽各计算机系统的细节,适合在网络中任意异构计算机之间传送文件。

  • FTP采用C/S方式实现客户与服务器之间的双向文件传输。

  • FTP的客户与服务器之间的交互以及文件传输过程均使用TCP的可靠传输服务。

  • 用户通过FTP用户代理使用FTP应用,用户代理通过FTP客户与FTP服务器进行交互。

  • FTP的服务器进程由两个大部分组成一部分为主进程,负责接收新的客户请求;另一部分为若干个从属进程,负责处理单个客户请求,与具体客户进行交互。FTP服务器可以同时为多个客户进程提供服务。

  • 用户在使用FTP服务时,首先客户进程需要请求与FTP服务器的21号端口建立一条TCP连接,称为控制连接,然后开始FTP会话。FTP会话之初,用户需要通过控制连接向FTP服务器发送用户名和口令,进行系统登录,通过服务器的授权后,客户才可以通过其他命令与服务器交互,包括请求将本地文件系统中的一个或者多个文件上传到远程文件系统,或者请求将服务器文件系统中的文件下载到本地。

  • FTP特点

    • FTP的一个显著特点就是在传输文件时,需要建立一个数据连接,专门用于文件传输,文件传输结束后,数据连接即关闭。
  • FTP应用使用两个“并行”的TCP连接:控制连接数据连接

    • 控制连接在整个会话期间一直保持打开,是持久的,FTP客户发出的传送请求通过控制连接发送给服务器端的控制进程的端口(21),但控制连接不用来传送文件,实际用于传输文件的是数据连接,用来连接客户端和服务器端的数据传送进程。
    • 数据传送进程实际完成文件的传送,在传送完毕后关闭数据传送连接,数据连接是临时的,非持久的。服务器进程用自己传送数据的端口(20)与客户进程所提供的端口号建立数据连接。
    • 控制连接用于在客户与服务器之间传输控制信息,如用户标识,口令,改变远程目录,上传文件,下载文件等命令。
    • 数据连接用于实际传送文件内容
  • 由于FTP专门使用一个独立的控制连接传输控制信息,与传输文件信息进行分离,所以将FTP的这种控制信息的传送方式称为带外控制(out-of-band control)。与之对应,哪些命令,数据都是通过一个TCP连接传输的应用层协议称为带内控制int-band control)协议。

  • FTP服务器必须在整个会话期间保留用户的状态,即FTP有状态的(stateful)协议。

第七节 P2P应用

  • P2P体系的网络应用对服务器的依赖很小,甚至对于纯P2P来说,整个应用几乎不依赖某个集中服务器,应用都是动态的在对等方之间进行。
  • P2P应用中,对等方随时可能加入应用,也随时可能离开应用,具有很强的应用规模伸缩性。
  • P2P应用的对等方通常并不属于服务提供商,而是用户控制的桌面计算机或笔记本电脑等。
  • P2P应用充分聚集利用了端系统的计算能力以及网络传输带宽,代表了全新的网络应用架构与理念。

第八节 Socket编程基础

  • 网络应用进程可以创建3种类型的Socket

    • 数据报类型套接字SOCK_DGRAM:面向传输层UDP接口。
    • 流式套接字SOCK_STREAM:面向传输层TCP接口。
    • 原始套接字SOCK_RAW:面向网络层协议(如IPICMP等)接口。

    在这里插入图片描述

  • 原始套接字的创建有权限限制,如,在Linux操作系统中,需要root权限的用户才能创建原始套接字。通过原始套接字,应用进程可以实现一些特殊的权限,如收发ICMP报文等。

  • 常用Socket API函数

    • int socket(int family,int type,int protocol);
      
      • 功能:
        • 创建套接字。
      • 参数:
        • family为协议族,通常取值为PF_INETAF_INET表示面向IPv4协议栈;
        • type为套接字类型,取值SOCK_STREAM,SOCK_DGRAM,SOCK_RAW,分别为流式套接字,数据报套接字,原始套接字
        • protocol为协议,其中取值IPPROTO_TCPIPPROTO_UDP分别表示TCP协议和UDP协议。
      • 返回:
        • 成功,返回非负整数,为套接字描述符。
        • 失败,返回**-1SOCKET_ERROR**。
      • 说明:
        • 创建指定类型的套接字。
    • int close(int sockfd);
      
      • 功能:
        • 关闭一个描述符为sockfd的套接字。
      • 返回
        • 成功,返回0
        • 失败,返回**-1**。
      • 说明:
        • 如果多个进程共享一个套接字,调用**close()将套接字引用计数减1,减至0才关闭套接字;一个进程中的多线程对一个套接字的使用不存在计数,如果进程中的某个线程调用close()**将一个套接字关闭,该进程中的其他线程也将不能访问该套接字了。
    • int bind(int sockfd,const struct sockaddr*myaddr,socklent_t addrlen);
      
      • 功能:
        • 绑定套接字的本地端点地址。
      • 参数:
        • sockfd为本地套接字的描述符。
        • myaddr为结构sockaddr_in指针,本地端点地址(包含IP地址和端口号)。
        • addrlen为端点地址长度。
      • 返回:
        • 成功,返回0
        • 失败,返回**-1**。
      • 说明:
        • 服务器程序需要调用该函数,为服务器套接字绑定特定端口号;客户程序一般不必调用该函数,操作系统会自动为客户套接字绑定端口号。
    • int listen(int sockfd,int backlog);
      
      • 功能:
        • 置服务器端的流(TCP)套接字sockfd为监听状态。
      • 参数:
        • sockfd为本地(服务器)套接字的描述符。
        • backlog为连接请求队列大小。
      • 返回:
        • 成功,返回0
        • 失败,返回**-1**。
      • 说明:
        • 该函数只用于服务器端,且仅用于面向连接的流套接字,即TCP服务器套接字。
    • int connect(int sockfd,const struct sockaddr*servaddr,socklen_t addrlen);
      
      • 功能:
        • 将客户套接字sockfd与服务器连接。程序调用connect函数来使客户套接字(sd)与特定计算机的特定端口(saddr)的套接字(服务)进行连接。
      • 参数:
        • sockfd为本地套接字(客户)的描述符。
        • servaddr为指向结构sockaddr_in的指针,存储服务器端点地址。
      • 返回:
        • 成功,返回0
        • 失败,返回**-1**。
      • 说明:
        • 该函数仅用于客户端;不仅可以用于TCP客户端也可以用于UDP客户端;对于TCP客户端,该函数真正建立与服务器的TCP连接,对于UDP客户端,只是指定服务器端点地址。
    • int accept(int sockfd,struct sockaddr*cliaddr,socklen_t addrlen);
      
      • 功能:
        • 从监听状态的流套接字sockfd的客户连接请求队列中,取出排在最前的一个客户请求,并且创建一个新的套接字来与客户套接字建立TCP连接。
      • 参数:
        • sockfd为本地(服务器)流套接字的描述符。
        • servaddr为指向结构sockaddr_in的指针,用于存储客户端点地址。
      • 返回:
        • 成功,返回非负整数,为新建与客户连接的套接字描述符。
        • 失败,返回**-1**。
      • 说明:
        • 该函数仅用于服务器端TCP套接字,真正与客户连接的是新创建的套接字,即该函数返回的套接字描述符所标识的套接字。
    • ssize_t send(int sockfd,const void*buff,size_t nbytes,int flags);
      
      • 功能:
        • 发送数据。
      • 参数:
        • sockfd为本地套接字描述符。
        • buff指向存储待发送数据的缓存指针。
        • nbytes为数据长度。
        • flags为控制比特,通常取0。
      • 返回:
        • 成功,返回发送的字节数。
        • 失败,返回**-1**。
      • 说明:
        • TCP套接字(客户与服务器)调用**send()**函数发送数据。
        • send()函数也可以用于调用了connect()函数的客户端UDP套接字。
    • ssize_t sendto(int sockfd,const void*buff,size_t nbytes,int flags,const struct sockaddr*to,socklen_t addrlen);
      
      • 功能:
        • 发送数据
      • 参数:
        • sockfd为本地套接字描述符;
        • buff为指向存储待发发送数据的缓存指针。
        • nbytes为数据长度。
        • flags为控制比特,通常取0
        • to为远端(数据接收端)端点地址结构指针。
      • 返回:
        • 成功,返回发送的字节数。
        • 失败,返回-1
      • 说明:
        • sendto()函数用于UDP服务器端套接字或未调用connect()函数的UDP客户端套接字。
    • ssize_t recv(int sockfd,void*buff,size_t nbytes,int flags);
      
      • 功能:
        • 接收数据。
      • 参数:
        • sockfd为本地套接字描述符。
        • buff为指向存储接收数据的缓存指针。
        • nbytes为缓存长度。
        • flags为控制比特,通常取0。
      • 返回
        • 成功,返回接收到的字节数。
        • 失败,返回**-1**.
      • 说明:
        • recv()函数用于从TCP套接字接收数据。
        • recv()函数也可以用于从调用了connect()函数的UDP客户端套接字接收服务器发来的数据。
    • ssize_t recvfrom(int sockfd,const void*buff,size_t nbytes,int flags,struct sockaddr*from,socklen_t addrlen);
      
      • 功能:
        • 接收数据
      • 参数:
        • sockfd为本地套接字描述符。
        • buff为指向存储接收数据的缓存指针。
        • nbytes为缓存长度。
        • flags为控制比特,通常取0。
        • from为存储远端(数据发送端)端点地址结构的指针。
      • 返回:
        • 成功,返回接收到的字节数。
        • 失败,返回**-1**。
      • 说明:
        • recvfrom()函数用于从UDP服务器端套接字或未调用connect()函数的UDP客户端套接字接收数据。
    • int setsockopt(int sockfd,int level,int optname,const void*optval,socklen_taddrlen);
      
      • 功能:
        • 设置套接字选项。
      • 参数:
        • sockfd为本地套接字描述符。
        • level为选项级。
        • optname为选项名。
        • optval为存储选项值。
      • 返回:
        • 成功,返回0
        • 失败,返回**-1**。
    • int getsockopt(int sockfd,int level,int optname,void*optval,socklen_t addrlen);
      
      • 功能:
        • 读取套接字选项。
      • 参数:
        • optval用于存放选项读取值。
      • 返回:
        • 成功,返回0
        • 失败,返回**-1**。
      • 说明:
        • getsockopt()函数用于获取任意类型,任意状态套接口的选项当前值,并把结果存入optval
  • TCP提供面向连接,可靠的字节流传输服务,选择使用TCP的网络应用程序,无须处理数据丢失等问题,从而使得应用程序设计相对简单。

在这里插入图片描述

  • UDP提供无连接,不可靠的数据报传输服务,选择使用UDP的网络应用程序,不能依靠UDP实现可靠数据传输。

    
     - 功能:
       - 读取套接字选项。
     - 参数:
       - **optval**用于存放选项读取值。
     - 返回:
       - 成功,返回**0**。
       - 失败,返回**-1**。
     - 说明:
       - **getsockopt()**函数用于获取任意类型,任意状态套接口的选项当前值,并把结果存入**optval**。
    
    
  • TCP提供面向连接,可靠的字节流传输服务,选择使用TCP的网络应用程序,无须处理数据丢失等问题,从而使得应用程序设计相对简单。

  • UDP提供无连接,不可靠的数据报传输服务,选择使用UDP的网络应用程序,不能依靠UDP实现可靠数据传输。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/JAVAYmm/article/details/120756298