## **6.1** **网络编程简介**
要编写通过计算机网络通信的程序,首先要确定这些程序同通信的协议(protocol),在设计一个协议的细节之前,首先要分清程序是由哪个程序发起以及响应何时产生。
举例来说,一般认为WEB服务器程序是一个长时间运行的程序(守护进程deamon),它只在响应来自网络的请求时才发送网络消息。协议的另一端是web客户程序,如某种浏览器,与服务器进程的通信总是由客户进程发起。大多数网络应用就是按照划分为客户(clinet)和服务器(server)来组织的。
### **6.1.1** **五层因特网协议栈**
为了给网络协议的设计提供一个结构,网络设计者以分层(layer)的方式组织协议以及实现这些协议的网络硬件和软件。
分层提供了一种结构化方式来讨论系统组件。模块化使更新系统组件更为容易。
协议栈是各层所有协议的总和。
![NetworkProgram_Image001]()
<center><p>五层因特网协议栈</p></center>
应用层:应用层是网络应用程序及它们的应用层协议存留的地方。
运输层:因特网的运输层在应用程序端点之间传从应用层报文。
网络层:因特网呃网络层负责将称为数据包(datagram)的网络层分组从一台主机移动到另一台主机。
链路层:因特网的网络层通过源和目的地之间的一系列路由器路由数据报。
物理层:虽然链路层的任务是将整个帧从一个网络元素移动到临近的网络元素,而物理层的任务是将该帧的一个一个比特从一个节点移动到下一个节点。
### 6.1.2 传输层和应用层的常见协议
我们重点介绍和应用层编程关系密切的应用层和运输层。
应用层:
因特网的应用层包含很多协议,例如HTTP,SMTP,和 FTP。我们看到的某些网络功能,比如将www.baidu.com这样对人友好的端系统名字转换为32比特网络地址,也是借助于特定的应用层协议即域名系统(DNS)完成的。
应用层的协议分布在多个端系统上,一个端系统中的应用程序使用协议与另一个端系统中的应用程序交换信息分组。
运输层:
在英特网中有两个运输协议,即TCP和UDP,利用其中的任何一个都能运输应用层报文。我们写应用程序的时候具体选择哪个运输层协议应该根据实际情况来确定(后面会具体讲解)。
## **6.2** **网络编程之TCP/UDP比较**
### 6.2.1 TCP和UDP 原理上的区别
TCP向它的应用程序提供了面向连接的服务。这种服务包括了应用层报文向目的地的确保传递和流量控制(即发送方/接收方速率匹配)。这种服务包括了应用层报文划分为短报文,并提供拥塞控制机制,因此当网络拥塞时源抑制其传输速率。
UDP协议向它的应用程序提供无连接服务。这是一种不提供不必要服务的服务,没有可靠性,没有流量控制,也没有拥塞控制。
### 6.2.2 为何存在UDP协议
既然TCP提供了可靠数据传输服务,而UDP不能提供,那么TCP是否总是首选呢?答案是否定的,因为有许多应用更适合用UDP,原因有以下几点:
a. 关于何时发送什么数据控制的更为精细。
采用UDP时只要应用进程将数据传递给UDP,UDP就会立即将其传递给网络层。而TCP有重传机制,而不管可靠交付需要多长时间。但是实时应用通常不希望过分的延迟报文段的传送,且能容忍一部分数据丢失。
b. 无需建立连接,不会引入建立连接时的延迟。
c. 无连接状态,能支持更多的活跃客户。
d. 分组首部开销较小。
### 6.2.3 TCP/UDP网络通信大概交互图
下面我们分别画出运用TCP协议和运用UDP协议的客户端和服务器大概交互图。
![NetworkProgram_Image002]()
<center><p>面向连接的TCP流模式</p></center>
![NetworkProgram_Image003]()
<center><p>UDP用户数据包模式</p></center>
|