《UNIX网络编程 卷1:套接字联网API(第3版)》——第1章 简介 1.1概述

第一部分 简介和TCP/IP

第1章 简介

1.1 概述

要编写通过计算机网络通信的程序,首先要确定这些程序相互通信所用的协议(protocol)。在深入设计一个协议的细节之前,应该从高层次决断通信由哪个程序发起以及响应在何时产生。举例来说,一般认为Web服务器程序是一个长时间运行的程序(即所谓的守护程序,daemon),它只在响应来自网络的请求时才发送网络消息。协议的另一端是Web客户程序,如某种浏览器,与服务器进程的通信总是由客户进程发起。大多数网络应用就是按照划分成客户(client)和服务器(server)①来组织的。在设计网络应用②时,确定总是由客户发起请求往往能够简化协议和程序③本身。当然一些较为复杂的网络应用还需要异步回调(asynchron-ous callback)通信,也就是由服务器向客户发起请求消息。然而坚持采纳图1-1所示的基本客户/服务器模型的网络应用毕竟要普遍得多。

通常客户每次只与一个服务器通信,不过以使用Web浏览器为例,我们也许在10分钟内就可以与许多不同的Web服务器通信。从服务器的角度来看,一个服务器同时与多个客户通信并不稀奇,见图1-2。本书后面将介绍若干种让一个服务器同时处理多个客户请求的方法。

可认为客户与服务器之间是通过某个网络协议通信的,但实际上,这样的通信通常涉及多个网络协议层。本书的焦点是TCP/IP协议族,也称为网际协议族。举例来说,Web客户与服务器之间使用TCP(Transmission Control Protocol,传输控制协议)通信。TCP又转而使用IP(Internet Protocol,网际协议)通信,IP再通过某种形式的数据链路层通信。如果客户与服务器处于同一个以太网,就有图1-3所示的通信层次。

尽管客户与服务器之间使用某个应用协议通信,传输层却使用TCP通信。注意,客户与服务器之间的信息流在其中一端是向下通过协议栈的,跨越网络后,在另一端则是向上通过协议栈的。另外注意,客户和服务器通常是用户进程,而TCP和IP协议通常是内核中协议栈的一部分。我们在图1-3右边标出了4个层。

本书讨论的协议不限于TCP和IP。有些客户和服务器改用UDP(User Datagram Protocol,用户数据报协议)而不是TCP,第2章将详细介绍这两个协议。此外,本书使用术语“IP”来称谓的那个协议,自20世纪80年代早期以来一直在使用,其实其正式名称是IPv4(IP version 4,IP版本4)。IPv4的一个新版本IPv6(IP version 6,IP版本6)是在20世纪90年代中期开发出来的,将来会取代IPv4。本书既讨论使用IPv4的网络应用程序的开发,也讨论使用IPv6的网络应用程序的开发。附录A会给出IPv4和IPv6的一个比较,同时介绍正文中将讨论的其他协议。

同一网络应用的客户和服务器无需如图1-3所示处于同一个局域网(local area network,LAN)。例如,图1-4展示了处于不同局域网中的客户和服务器,而这两个局域网是使用路由器(router)连接到广域网(wide area network,WAN)的。

路由器是广域网的架构设备。当今最大的广域网是因特网④(Internet)。许多公司也构建自己的广域网,而这些私用的广域网既可以连接到因特网,也可以不连接到因特网。

本章其余部分将概述多个主题,这些主题在后续章节中还会具体介绍。我们从一个尽管简单却完整的TCP客户程序开始,它展示了全书都会遇到的许多函数调用和概念。这个客户程序只能在IPv4上运行,不过我们会给出让它在IPv6上运行所需进行的修改。更好的办法是编写独立于协议的客户和服务器程序,这在第11章中会讨论。本章同时展示一个与该TCP客户程序配合工作的完整的TCP服务器程序。

为了简化代码,我们对本书中要调用的大多数系统函数定义了各自的包裹函数。多数情况下我们可以使用这些包裹函数来检查错误,输出适当的消息,以及在出错时终止程序的运行。我们还给出了本书中大多数例子所用的测试网络、主机、路由器以及它们的主机名、IP地址和操作系统。

如今讨论Unix时经常使用POSIX一词,它是一种被多数厂商采纳的标准。我们将介绍POSIX的历史以及它对本书所讲述的API的影响,并介绍该领域的其他主要标准。

时间: 2024-10-25 21:45:25

《UNIX网络编程 卷1:套接字联网API(第3版)》——第1章 简介 1.1概述的相关文章

UNIX网络编程:通用套接字选项

1. SO_BROADCAST 套接字选项 本选项开启或禁止进程发送广播消息的能力.只有数据报套接字支持广播,并且还必须是在支持广播消息的网络上(例如以太网,令牌环网等).我们不可能在点对点链路上进行广播,也不可能在基于连接的传输协议(例如TCP和SCTP)之上进行广播. 2. SO_DEBUG 套接字选项 本选项仅由TCP支持.当给一个TCP套接字开启本选项时,内核将为TCP在该套接字发送和接受的所有分组保留详细跟踪信息.这些信息保存在内核的某个环形缓冲区中,并可使用trpt程序进行检查. 3

socket-unix网络编程环境怎么配置?我买了套接字联网api和tcp/ip详解,但是书上的代码都不能运行.

问题描述 unix网络编程环境怎么配置?我买了套接字联网api和tcp/ip详解,但是书上的代码都不能运行. 就下面这个代码,运行提示没有unp.h,找了个unp.h,但是还是提示什么各种数据类型重复定义.我到现在觉得是不是这本书写错了. #include "unp.h" int main(int argc, char **argv) { int sockfd, n; char recvline[MAXLINE + 1]; struct sockaddr_in servaddr; if

《UNIX网络编程 卷1:套接字联网API(第3版)》——导读

**前言**本书面向的读者是那些希望自己编写的程序能使用称为套接字(socket)的API进行彼此通信的人.有些读者可能已经非常熟悉套接字了,因为这个模型几乎已经成了网络编程的同义词,但有些读者可能仍需要从头开始学习.本书想达到的目标是向大家提供网络编程指导.这些内容不仅适用于专业人士,也适用于初学者:不仅适用于维护已有代码,也适用于开发新的网络应用程序:此外,还适用于那些只是想了解一下自己系统中网络组件的工作原理的人. 书中的所有示例都是在Unix系统上测试通过的真实的.可运行的代码.但是,考

《UNIX网络编程 卷1:套接字联网API(第3版)》——1.8 BSD网络支持历史

1.8 BSD网络支持历史 套接字API起源于1983年发行的4.2BSD操作系统.图1-15展示了各种BSD发行版本的发展史,并注明了TCP/IP的主要发展历程.1990年面世的4.3BSD Reno发行版本随着OSI协议进入BSD内核而对套接字API做了少量的改动. 图1-15中从4.2BSD往下到4.4BSD的通路展示了源自Berkeley计算机系统研究组(Computer Systems Research Group,CSRG)的各个版本,它们要求获取者已拥有Unix的源代码许可权.然而

《UNIX网络编程 卷1:套接字联网API(第3版)》——2.2 总图

2.2 总图 虽然协议族被称为"TCP/IP",但除了TCP和IP这两个主要协议外,还有许多其他成员.图2-1展示了这些协议的概况. 图2-1中同时展示了IPv4和IPv6.从右向左查看该图,最右边的5个网络应用在使用IPv6:我们将在第3章中随sockaddr_in6结构讲解AF_INET6常值.随后的6个网络应用使用IPv4. 最左边名为tcpdump的网络应用或者使用BSD分组过滤器(BSD packet filter,BPF),或者使用数据链路提供者接口(datalink pr

《UNIX网络编程 卷1:套接字联网API(第3版)》——1.10 Unix标准

1.10 Unix标准 在编写本书时,最引人注目的Unix标准化活动是由Austin公共标准修订组(The Austin Common Standards Revision Group,CSRG)主持的.他们的努力结果是涵盖1 700多个编程接口的约4 000页内容的规范[Josey 2002].这些规范既具有IEEE POSIX名字,也具有开放团体的技术标准(The Open Group's Technical Standard)名字.其结果是同一个Unix标准有多个名字来指称:ISO/IEC

《UNIX网络编程 卷1:套接字联网API(第3版)》——2.6 TCP连接的建立和终止

2.6 TCP连接的建立和终止 为帮助大家理解connect.accept和close这3个函数并使用netstat程序调试TCP应用,我们必须了解TCP连接如何建立和终止,并掌握TCP的状态转换图. 2.6.1 三路握手建立一个TCP连接时会发生下述情形. (1)服务器必须准备好接受外来的连接.这通常通过调用socket.bind和listen这3个函数来完成,我们称之为被动打开(passive open). (2)客户通过调用connect发起主动打开(active open).这导致客户T

《UNIX网络编程 卷1:套接字联网API(第3版)》——2.3 用户数据报协议(UDP)

2.3 用户数据报协议(UDP) UDP是一个简单的传输层协议,在RFC 768[Postel 1980]中有详细说明.应用进程往一个UDP套接字写入一个消息,该消息随后被封装(encapsulating)到一个UDP数据报,该UDP数据报进而又被封装到一个IP数据报,然后发送到目的地.UDP不保证UDP数据报会到达其最终目的地,不保证各个数据报的先后顺序跨网络后保持不变,也不保证每个数据报只到达一次. 我们使用UDP进行网络编程所遇到的问题是它缺乏可靠性.如果一个数据报到达了其最终目的地,但是

《UNIX网络编程 卷1:套接字联网API(第3版)》——1.5 一个简单的时间获取服务器程序

1.5 一个简单的时间获取服务器程序 我们可以编写一个简单的TCP时间获取服务器程序,它和1.2节中的客户程序一道工作.图1-9给出了这个服务器程序,它使用了上一节中讲过的包裹函数. 创建TCP套接字10 TCP套接字的创建与客户程序相同. 把服务器的众所周知端口捆绑到套接字11~15 通过填写一个网际套接字地址结构并调用bind函数,服务器的众所周知端口(对于时间获取服务是13)被捆绑到所创建的套接字.我们指定IP地址为INADDR_ANY,这样要是服务器主机有多个网络接口,服务器进程就可以在

《UNIX网络编程 卷1:套接字联网API(第3版)》——1.11 64位体系结构

1.11 64位体系结构 20世纪90年代中期到未期开始出现向64位体系结构和64位软件发展的趋势.其原因之一是在每个进程内部可以由此使用更长的编址长度(即64位指针),从而可以寻址很大的内存空间(超过232字节).现有32位Unix系统上共同的编程模型称为ILP32模型,表示整数(I).长整数(L)和指针(P)都占用32位.64位Unix系统上变得最为流行的模型称为LP64模型,表示只有长整数(L)和指针(P)占用64位.图1-17对这两种模型进行了比较. 从编程角度看,LP64模型意味着我们