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. 【亲测有效】安装npm慢的解决方案

    使用淘宝的NPM库:npm install -gd express --registry=http://registry.npm.taobao.org

  2. python多进程间通信

    这里使用pipe代码如下: import time from multiprocessing import Process import multiprocessing class D: @stati ...

  3. (四)react-native开发系列之debug调试

    一个高效率的开发,不仅仅需要扎实的专业,掌握熟练的调试技巧也是必备技能,熟练的调试技能可以加快开发速度和提升代码质量,降低bug量,可以起到事半功倍的效果:今天来说下react-native在开发过程 ...

  4. django学习记录1

    在看django的基础知识,还是按照以前一样来总结,还是晚上再统一总结好了,边看边总结好像效果不大. 第一部分是生成数据库,用python manage.migrate命令来生成django的基础架构 ...

  5. web-mini框架的基本实现(一)

    本篇主要介绍WSGI-web-mini框架的基本实现,以及什么是WSGI协议.对于浏览器的资源请求服务端是如何处理的等相关知识: 一.浏览器资源请求 我们知道浏览器和web服务器之间是基于HTTP协议 ...

  6. redis哨兵配置 总结

    本文内容涵盖 windows下单机部署redis多实例(docker.linux下的配置也可参考本文) redis主从配置 redis哨兵配置 以spring boot redis demo下一个存a ...

  7. TLS 1.3 中Pre_shared_key和key_share对应的两种密钥交换模式

    1.TLS1.3的整个协议的文档规范 请参照 RFC 8846,协议规范中指出,TLS1.3提供三方面的安全属性,分别是身份认证.通信加密.完整性验证. 2.TLS1.3协议主要包括两个组成部分,分别 ...

  8. altium designer的pcb板如何移动到原点?

    可以把所有的都选中,然后将光标移到起点处,将所有的移到原点的地方,但这种做法很多时候都不好:比较好的办法就是将原点设置到起点上来. 具体做法是:edit--origin --set. 这时光标成了十字 ...

  9. tomcat 使用quercus-4.0.39 支持PHP

    tomcat  使用quercus-4.0.39  支持PHP   Quercus是Caucho公司采用纯Java开发的一个PHP5引擎.基于开源授权协议GPL发布.Quercus自带很多个PHP模块 ...

  10. windows系统开机执行文件

    以下都是在windows系统下执行的 开机自启程序 新建xxx.bat的文件 编辑自己的bat文件,将所要加载的项目引导进来 注意: 如果有相对路径的话,就需要先加载项目,在用python 执行脚本程 ...