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. Fortify漏洞之Insecure Randomness(不安全随机数)

    继续对Fortify的漏洞进行总结,本篇主要针对  Insecure Randomness  漏洞进行总结,如下: 1.Insecure Randomness(不安全随机数) 1.1.产生原因: 成弱 ...

  2. 笔谈FFmpeg(一)

    现在的工作是播放器库的开发,可不是调用iOS系统自带的播放器框架进行一些简单的功能和界面定制,这些没什么含量.涉及iOS开发有3个年头了,现在的工作算是有点含金量了.涉及播放器的开发,FFmpeg的架 ...

  3. sqlserver TOP 问题(转载)

          来谈谈SQL数据库中"简单的"SELECT TOP—可能有你从未注意到的细节 首先从博客园的Jerome Wong网友说起 他提出了一个这样的问题 本人写了好几年SQL ...

  4. World发布博客测试

    姓名 地址 博客 www.bk.com  插入一个单元格并放入代码 using System; using System.Collections.Generic; using System.Linq; ...

  5. PAT上机注意事项

    PAT上机注意事项 这次上机PAT遇到了很多问题,进行一下总结 1.进入考场后,检查机器是否完好,尤其是键盘的键是否失灵,以及是否有打开的页面(考试开始,打开页面都算违规) 2.关于选择IDE 部分考 ...

  6. Redis基于主从复制的RCE 4.x/5.x 复现

    0x00 前言 最近期末考试,博客好久没有更新了,这段时间爆了三四个洞,趁着还没去实习,抓紧复现一下,这次复现的是Redis的RCE,复现过程中也遇到很多问题,记录下来和大家分享一下 0x01 拉取镜 ...

  7. Luogu P1970 花匠

    Luogu P1970 花匠 本质上就是找最长的波浪序列. 因为考虑到第一个必选,所以可以让$lst=h[1]$. 此外,注意到$n=1$是要特判,其他情况下显然$ans\geq 2$,所以把$dir ...

  8. LeetCode - 206、反转链表

    反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL /** * 列表定 ...

  9. springboot学习笔记(一)

    springboot案例(一) Application.java package com.xdr.spring; import org.springframework.boot.SpringAppli ...

  10. 行为型模式(一) 模板方法模式(Template Method)

    一.动机(Motivate) "模板方法",就是有一个方法包含了一个模板,这个模板是一个算法.在我们的现实生活中有很多例子可以拿来说明这个模式,就拿吃饺子这个事情来说,要想吃到饺子 ...