UNIX网络编程---简介

一、           概述

a)       在编写与计算机通信的程序时,首先要确定的就是和计算机通信的协议,从高层次来确定通信由哪个程序发起以及响应在合适产生。大多数网络应用按照划分成客户和服务器来组织。在设计网络应用时,确定总是由客户发起请求往往能够简化协议和程序本身。当然一个较为复杂的网络应用还需要异步回调通信,也就是由服务器向客户发起请求消息。

i.             在本书原著上多次提到客户(client)和服务器(server)这两个术语。但是他们在具体上下文的含义不同,有的是指静态的程序(客户程序和服务器程序),有的是指动态的进程(客户进程和服务器进程),有时指运行进程的主机(客户主机和服务器主机)。

ii.             可认为客户与服务器之间是通过某个网络协议通信的,但实际上,这样的通信通常涉及到多个网络协议层。本书的焦点是TCP/IP协议簇,也称为网际协议簇。举例,WEB客户与服务器之间使用TCP(Transmission Control Protocol,传输控制协议)通信。TCP又转而使用IP(InternetProtocol,网际协议)通信,IP再通过某种形式的数据链路层通信。

尽管客户与服务器之间使用某个应用协议通信,传输层却使用TCP通信。数据流的流向在一端从上到下,在另一端从下到上。通常,客户和服务器通常是用户进程,

而TCP和IP协议通常是内核中协议栈的一部分。其中七层OSI模型(物理层、数据链路层、网络层、传输层、表示层、会话层、应用层)。

关于结构体struct sockaddr,也就是通过套接字地址结构,每当一个套接字函数需要一个指向某个套接字地址结构的指针时,这个指针必须强制类型转换成一个指向通过套接字地址结构的指针。

计算机网络各对等实体间交换的单元信心称为协议数据单元(protocol data unit PDU),分节(segment)就是对应于TCP传输层的PDU.按照协议与服务之间的关系,除了最底层物理层外,每层的PDU通过由紧邻下层提供给本层的服务接口,作为下层的服务数据单元传递给下层…………

应用层实体(如客户或服务器进程)间交换的PDU称为应用数据,其中在TCP应用进程之间交换的是没有长度限制的单个双向字节流,在UDP应用进程之间交换的是其长度不超过UDP发送缓冲区大小的单个记录,在SCTP应用进程之间交换的是没有总长度显示的单个或多个双向字节流。传输层实体(对应某个端口的传输层协议代码的一次运行)间交换的PDU称为消息,起重工TCP的PDU特称为分节。消息或分节的长度是由限的。在TCP传输层中,发送端TCP把来自应用进程的字节流数据(既由应用进程通过一次输出操作写出到发送端TCP套接字中的数据)按顺序经分割后封装在各个各个分节中传送给接受端TCP其中每个分节所封装的数据既可能是发送端应用进程单词操作的结果,也可能是连续数次输出操作的结果,具体取决于可在连续建立阶段由对端通告的最大分节大小(maximum segmen size MSS)以及外出接口的最大传输单元(maximumtransmission unit MTU)或外出路经的路径MTU(如果网络层具有路径MTU发现功能)。分节除了用于承载应用数据外,也用于建立连接(SYN分节)、终止连接(FIN分节)、中止连接(RST分节)、确认数据接收(ACK分节)刷送待发数据(PSH分节)和携带紧急数据指针(URG分节),而且这些功能(包括承载数据)可以灵活组合。UDP传输层相当简单,发送端UDP就把俩字应用进程的单个记录整个封装在UDP消息中传送给接受端UDP。SCTP引入了称为块的数据单元,SCTP消息就由一个公共首部加上一个或多个块构成,公共首部类似UDP消息的首部,仅仅给出源目的端口和整个SCTP消息的校验和,块则可既可以承载数据,也可以承载控制信息。

网络层实体间的PDU称为IP数据报(IPdatagram),其长度有限:Ipv4数据报最大65535字节,Ipv6数据报最大65575字节。发送端IP把来自传输层的消息(或TCP分节)整个封装在IP数据报中发送。链路层实体间交换的PDU称为帧,其长度取决于具体的接口。IP数据报由IP首部和所承载的传输层数据(既网络层的SDU)构成。过长的IP数据报无法封装在单个帧中,需要先对其SDU进行分片,再把分成的各个片段冠以新的IP首部封装到多个帧中。在一个IP数据报从源到目的端的传送过程中,分片操作既可能发生在源端,也可能发生在途中,而其逆操作为重组。

TCP/IP协议簇为提高效率会尽可能避免IP的分片/重组操作,TCP根据MSS和MTU限定每个分节的大小以及SCTP根据MTU分片/重组过长记录都是这个目的。无论是否分片,都由IP作为链路层的SDU传输链路层,并由链路层封装在帧中的数据称为分组(俗称包)可见一个分组既可能是一个完整的IP数据报,也可能是某个IP数据报的SDU的一个片段被冠以新的IP首部后的结果。文中讨论的MSS是应用层(TCP)与传输层之间的接口属性,MTU则是网络层和链路层之间的接口属性。

一、本章在举例说明的时候,使用了获取时间的服务器函数之类的东西,这是一个函简单的程序,按照的基本的TCP客户/服务流程交互,在服务端在填写字符的时候使用了函数snprintf,这个函数和sprintf的功能相似。调用sprintf无法检查目的缓冲区是否溢出。Snprintf要求其第二个参数指定目的缓冲区的大小,因此可确保该缓冲区不溢出。

单个处理一个客户的服务器程序称为迭代服务器,因为对于每个客户它都迭代执行一次。同时能处理多个客户的称为并发服务器。

二、OSI模型

网络层由IPv4和IPv6这两个协议处理,可以选择的传输层有TCP或UDP,在上图中TCP与UDP之间留有间隙,表明网络应用绕过传输层直接使用IPv4或IPv6是可能的,这就是所谓的原始套接字。

OSI模型的顶上三层被合并成一层,称为应用层。这就是web客户(浏览器)、telnet客户、web服务器、ftp服务器和其其他我们在使用的网络应用所在的层。对于网际协议,OSI模型的顶上三层协议几乎没有区别。

在这一系列的讲述中,套接字编程接口是从顶上三层(网际协议的应用层)进入传输层的接口。所有文章的焦点是:如何使用套接字编写使用TCP或UDP的网络应用程序。

三、介绍几个命令

1)  netstat  netstat –i提供网络接口的信息。我们还指定-n标志以输出数值地址,而不是试图把他们反响解析成名字。

2)  netstat –r 展示路由表

这一章中主要讲解了和基本的信息,从宏观上讲解了本书的大体框架

UNIX网络编程---简介的更多相关文章

  1. UNIX网络编程--简介(一)【转】

    本文转载自:http://blog.csdn.net/yusiguyuan/article/details/11760187 一.概述 a) 在编写与计算机通信的程序时,首先要确定的就是和计算机通信的 ...

  2. UNIX网络编程--读书笔记

    会集中这段时间写UNIX网络编程这本书的读书笔记,准备读三本,这一系类的文章会不断更新,一直会持续一个月多,每篇的前半部分是书中讲述的内容,每篇文章的后半部分是自己的心得体会,文章中的红色内容是很重要 ...

  3. UNIX网络编程读书笔记:简介

    认知套接口编程接口 理解原始套接口(raw socket)的概念   值得注意的是,客户和服务器是典型的用户进程,而TCP和IP协议则通常是系统内核协议栈的一部分. 上图中在TCP和UDP之间留有间隙 ...

  4. Unix网络编程--卷二:进程间通信

    Unix网络编程--卷二:进程间通信 本书是一部Unix网络编程的经典之作!进程间通信(IPC)几乎是所有Unix程序性能的关键,理解IPC也是理解如何开发不同主机网络应用程序的必要条件.本书从对Po ...

  5. Unix网络编程--卷一:套接字联网API

    UNIX网络编程--卷一:套接字联网API 本书面对的读者是那些希望自己编写的程序能够使用成为套接字(socket)的API进行彼此通信的人. 目录: 0.准备环境 1.简介 2.传输层:TCP.UD ...

  6. [转载] 读《UNIX网络编程 卷1:套接字联网API》

    原文: http://cstdlib.com/tech/2014/10/09/read-unix-network-programming-1/ 文章写的很清楚, 适合初学者 最近看了<UNIX网 ...

  7. 《Unix 网络编程》08:基本UDP套接字编程

    基本UDP套接字编程 系列文章导航:<Unix 网络编程>笔记 UDP 概述 流程图 recvfrom 和 sendto #include <sys/socket.h> ssi ...

  8. 《Unix 网络编程》11:名字和地址转换

    名字和地址转换 系列文章导航:<Unix 网络编程>笔记 域名系统 简介 域名系统主要用于主机名字和 IP 地址之间的映射.主机名可以是: 简单名字,如:centos01 全限定域名(FQ ...

  9. 《Unix 网络编程》14:高级 I/O 函数

    高级 I/O 函数 ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ...

随机推荐

  1. java.util.Random 类的 nextInt(int num )

    随机产生3个67~295的整数并找出数值居中的数 并输出中间的数例如:100,225和200,输出200 要随机产生某个范围内的整数,用 java.util.Random 类的 nextInt(int ...

  2. python模块—socket

    创建套接字: socket.socket(family,type[,protocal]) 使用给定的地址族.套接字类型.协议编号(默认为0)来创建套接字. 1. socket类型: socket.AF ...

  3. Linux下diff使用简介

    diff用来比较两个文件的差异.首先构建两个相似的文件. Hello文件 world文件 使用diff -u  hello world > diff.txt,将两个文件的比对结果输入到diff. ...

  4. 在 Windows Azure 虚拟机中如何备份和还原 Windows 系统磁盘

    备份和还原对于操作真实的系统来说至关重要.对于 Windows Azure 虚拟机环境中的 Windows Server,可以根据自身的需求选择多种不同的工具或将这些工具结合使用来实现备份.下面将对这 ...

  5. poj2328---"right on"进入下一个case的模板(while)

    #include <stdio.h> #include <stdlib.h> #include<string.h> int main() { ]; ,end=; w ...

  6. padding-top、margin-top和top的区别

    padding-top:10px;是指容器内的内容距离容器的顶部有10个像素,是包含在容器内的: margin-top:10px;是指容器本身的顶部距离其他容器有10个像素,不包含在容器内: top: ...

  7. 深入理解java虚拟机---读后笔记(垃圾回收)

    运行时数据区,主要包括方法区.虚拟机栈.本地方法栈.堆.程序计数器,该部分内存都是线程隔离的. 然后和其交互的有执行引擎.本地库接口,此部分线程之间是可以共享的. 1. 引用计数算法 给对象添加一个引 ...

  8. [虚拟化/云][全栈demo] 为qemu增加一个PCI的watchdog外设(九)

    目的 1. 使用verilog/vhdl设计一个PCI的watchdog设备. 2. 通过systemverilog 写testbench. 很久之前研究过AC97的verilog代码.但是很久没用v ...

  9. 深度学习工具caffe具体安装指南

    caffe安装指南-吐血整理 前言: 在一台系统环境较好的linux机器上能够非常easy的安装caffe,可是假设系统本身非常旧,又没有GPU的话.安装就太麻烦了,全部都得从头做起,本文档旨在尽可能 ...

  10. hdu3038 How Many Answers Are Wrong【基础种类并查集】

    转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4298091.html   ---by 墨染之樱花 题目链接:http://acm.hdu.ed ...