csapp网络编程初学笔记

客户端-服务器编程模型

每个网络应用都是基于客户端-服务器模型,服务器管理某种资源,并且通过操作来为它的客户提供某种服务

客户端-服务器模型中的基本操作是transaction,由以下四步组成:

1.当一个客户端需要服务时,它向服务器发送一个请求。

2.服务器接收到请求后,解释它,并以适当的方式操作它的资源。

3.服务器给客户端发送一个响应,并等待下一个请求。

4.客户端接收响应并处理响应。

网络

客户端和服务器通常运行在不同的主机上,并借通过计算机网络的硬件和软件资源来通信。网络是个复杂的系统。

从程序员的角度来看的一个可工作的思考模型:

对于一个主机而言,网络只是又一种I/O设备,作为数据源和数据接收方。

网络物理层次:

1.以太网段(Ethernet segment):由电缆,集线器,不同主机构成。

2.桥接以太网(bridged Ethernet):较大的局域网,由多个以太网段和网桥构成。

3.互联网络(internet):由多个局域网和路由器构成。

协议

协议是运行在每台主机和路由器上的一种软件,这种软件实现了一种协议,这种协议控制主机和路由器如何协同工作来实现数据传输。互联网至关重要的特性是,它能由采用完全不同的和不兼容技术的各种局域网和广域网组成,所以才需要协议来实现某台源主机跨过所有这些不兼容的网络发送数据到另一台目的主机。为此这种协议必须提供两种基本能力:

1.命名机制.不同的局域网技术有不同的和不兼容的方式来为主机分配地址。互联网协议通过命名一种一致的主机格式来消除这些差异。每台主机会被分配至少一个这种互联网络地址,这个地址唯一标识这台主机。

2.传送机制.在电缆上编码位和将这些位封装为帧方面,不同的网络技术有不同和不兼容的方式.互联网协议通

过定义一种把数据位困扎成不连续的包的统一方式,从而消除了这些差异.

全球IP因特网

每台因特网主机都实现运行TCP/IP协议的软件,因特网的客户端和服务器端混合使用套接字接口函数和UNIX I/O函数来进行通信

从程序员角度,可以把因特网看作是一个世界范围的主机集合,满足以下特性:

1.主机集合被映射位一组32位的IP地址.

2.这组IP地址被映射为一组称为因特网域名的标识符

3.因特网主机上的进程能够通过连接和其他因特网主机上的进程通信.

IP地址

一个IP地址就是一个无符号32位整数.网络程序将IP地址存放在如下IP地址结构中

/*Internet address structure*/
struct in_addr{
unsigned int s_addr;//network byte order(big-endian)
};

因特网域名

因特网客户端和服务器互相通信使用的是IP地址,然而对于人们而言,大整数是很难记住的,所以因特网也定义了一组更加人性化的域名,以及将域名映射到IP地址的机制.这个映射就是通过分布世界范围内的数据库(DNS)来维护的.所以每条主机条目就是一个域名和IP地址的等价类.

/*DNS host entry structure*/
struct hostent{
char *h_name; //official domain name of host
char **h_aliases; //null-terminated array of domain names
int h_addrtype; //host address type
int h_length; //length of an address in bytes
char **h_addr_list; //null-terminated array of in_addr structs
};

因特网程序通过调用gethostbyname和gethostbyaddr函数,从DNS数据库中检索任意主机条目.

#include<netdb.h>
struct hostent *gethostbyname(const char *name);
/*返回:若成功则为非NULL指针,若出错则为NULL指针,同时设置h_erron*/
struct hostent *gethostbyaddr(const char *addr,int len,0);
/*返回:若成功则为非NULL指针,若出错则为NULL指针,同时设置h_erron*/

因特网连接

因特网客户端和服务器通过在连接上发送和接收字节流来通信.从连接一对进程的意义来讲,连接是点对点的,从数据可以同时双向流动来讲,他是全双工的.

一个套接字就是连接的一个端点,每个套接字都有相应的套接字地址,是由一个英特网地址和一个16位整数端口组成.用"地址:端口"来表示,当客户端发起一个连接请求时,客户端套接字地址中的端口是由内核自动分配,称为临时端口,然而服务器套接字端口通常是某个知名的端口,如web服务器通常是80端口.

一个连接是由它两端的套接字地址唯一确定的,这对套接字地址叫做套接字对,由下列元组来表示:

(cliaddr:cliport,servaddr:servport)

csapp网络编程初学笔记的更多相关文章

  1. 转 网络编程学习笔记一:Socket编程

    题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人:但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很有 ...

  2. CSAPP 并发编程读书笔记

    CSAPP 并发编程笔记 并发和并行 并发:Concurrency,只要时间上重叠就算并发,可以是单处理器交替处理 并行:Parallel,属于并发的一种特殊情况(真子集),多核/多 CPU 同时处理 ...

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

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

  4. Java Socket网络编程学习笔记(一)

    0.前言 其实大概半年前就已经看过网络编程Socket的知识了(传统IO),但是因为长时间的不使用导致忘的一干二净,最近正好准备校招,又重新看了网络编程这一章, 是传统IO(BIO)相关的内容,故在此 ...

  5. TCP/IP网络编程 读书笔记1

    本篇主干内容是TCP/IP网络编程1-9章学习笔记 1. linux文件描述符 描述符从3开始以由小到大的顺序编号,0,1,2,分配给标准I/O用作标准输入.标准输出和标准错误. 2. 协议族与套接字 ...

  6. JAVA UDP网络编程学习笔记

    一.UDP网络编程概述 采用TCP协议通信时,客户端的Socket必须先与服务器建立连接,连接建立成功后,服务器端也会持有客户端连接的Socket,客户端的Socket与服务器端的Socket是对应的 ...

  7. JAVA TCP网络编程学习笔记

    一.JAVA网络编程概述 网络应用程序,就是在已实现网络互联的不同计算机上运行的应用程序,这些程序之间可以相互交换数据.JAVA是优秀的网络编程语言,Java网络编程的类库位于java.net包中.J ...

  8. Linux C网络编程学习笔记

    Linux C网络编程总结报告 一.Linux C 网络编程知识介绍: 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户端:(client) 在网络程序中, ...

  9. 网络编程学习笔记(二)基于TCP的Socket编程

    1.Socket:英文意思插座.两个Java应用程序可以通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个Socket. 2.Socket通常用来实现client-server(客户端 ...

随机推荐

  1. JavaScript箭头函数中的this详解

    前言 箭头函数极大地简化了this的取值规则. 普通函数与箭头函数 普通函数指的是用function定义的函数: var hello = function () { console.log(" ...

  2. FreeRTOS中断测试

    configMAX_SYSCALL_INTERRUPT_PRIORITY 高于此优先级的中断,不能被禁止 #ifdef __NVIC_PRIO_BITS #define configPRIO_BITS ...

  3. c# String类

  4. Flask之基础

    一,flask Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求 ...

  5. three.js展示三维模型

    1.概要 最近学习Three.js,尝试加载一些3d max导出的obj.stl模型,在展示模型的时候遇到了一些问题,模型的尺寸.位置和旋转角度每次都靠手工调整,非常的不方便,就想着写一个方法来随心所 ...

  6. 工业网络安全 智能电网,SCADA和其他工业控制系统等关键基础设施的网络安全(总结)

    1.工业网络的安全势必是未来安全方向必须要做的一个重要的方面 工业网络的概念:简单的说就是控制控制系统的网络,其可以进行基于网络的数字通信. 关键的基础设施:包括直接操作任何系统的设施 了解工业网络的 ...

  7. php 加密

    PHP 自带的加密解密函数 目前经常使用的加密函数有:md5(), sha1(), crypt(), base64_encode(), urlencode() .其中 md5(), sha1(), c ...

  8. 随Linux开机自动启动mysql

    在MySQL的管理过程中,会遇到PC Server脱机或者重启,我需要在主机启动后再将MySQL服务启动.如果上百台或者更多的MySQL主机进行维护时,可能会有多台主机出现类似问题,要是每次都手动操作 ...

  9. 本地安装部署ActiveCollab

    ActiveCollab是一个非常易于使用.基于Web.开源的协作开发与项目管理工具. 我们公司一直在用这款工具,进行任务分配和时间填写,十分简便 ActiveCollab可以利用它轻松地搭建一个包括 ...

  10. java加密算法-MD5

    import java.security.MessageDigest; public class MD5Util { /*** * MD5加密 生成32位md5码 * @param 待加密字符串 * ...