深入理解计算机系统:网络编程 上

一直以来对计算机网络比较感兴趣,但是无奈大学计算机网络的学习非常表面,已经忘得差不多了。毕业后读了一些网络方面的书,对网络知识的冰山一角有了一些感悟。
随着网络方面的书越读越多,不懂的地方也越来越多。而且很多知识不经常使用,没多久就网络。
so,我决定着手自己写一个web服务器。哇,居然没什么头绪。

第一步,我先阅读了下深入理解计算机系统的网络编程这一章。以下就是我在阅读过程中记录的精华。

11章 网络编程

11.1 c-s模型

服务器管理某种资源,为客户端提供某种服务。例如,web服务器管理一些磁盘文件,它代表客户端进行检索和执行。
c,s是进程,而非主机或者机器。

11.2 网络

对于主机,网络是一个I/O设备。
一个网络通过网络适配器连接到I/O总线扩展槽,从网络上接受的数据通过网络适配器经过I/O和存储器总线拷贝到了存储器,典型地通过DMA传送。
类似,数据也能通过存储器拷贝到网络。

(这本书太牛逼了,这一章简直精简地概括了我所了解的网络知识,并且对我迷惑的很多地方都进行了阐释)

主机连接到集线器,网桥连接多个网段成为一个更大的局域网(桥接以太网)。多个不兼容的网络可以通过路由器连接,组成一个internet.
Internet:具体,全球IP因特网;internet:抽象,一个网络概念

WAN:广域网 LAN:局域网

互联网重要特性:他能由采用完全不同和不兼容技术的的各种局域网和广域网组成。那么,
这些不同的网络之间如何进行沟通呢?协议软件。

协议软件实现一种协议,控制主机和路由器如何协同工作来实现数据传输。
协议必须实现两个功能:
命名机制。为主机分配一个互联网络地址,唯一标识这台主机。
传送机制。定义一种能够将来自不同协议的不同格式的帧封装成不连续的片(包)。一个包由包头和有效荷载组成。包头包括包的大小以及源目地址。

11.3 全球IP因特网

TCP/IP 是一个协议族,IP提供基本的命名方法和传送机制、UDP扩展了IP协议,可以在进程间而不是主机间传送、TCP基于IP实现了进程间可靠的全双工连接。

因特网是一个世界范围内的主机集合:
主机集合被映射为一组32位的IP地址
IP地址被映射为因特网域名的标识符
因特网主机上的进程能够通过连接(connection)和其他任何因特网主机上的进程通信

因特网主机可以有不同的主机字节顺序,所以TCP/IP为任意整数数据定义了统一的网络字节顺序(大端字节顺序),
unix提供了函数能够让数据在大小端之间转换:htonl, htons, ntohl, ntohs

inet_aton, inet_ntoa可以实现IP地址和点分十进制串之间的转换
n:network a: application

因特网域名
因特网定义了域名集合和IP地址集合之间的映射。
DNS数据库上的主机条目结构定义了一组域名和一个官方名字和一组别名和一组IP地址之间 的映射。
gethostbyname返回和域名name相关的主机条目;gethostbyaddr返回和IP地址相关联的主机条目

因特网连接
一个套接字是一个连接的端点。每个套接字都有对应的套接字地址,由一个因特网地址和一个端口组成,用“地址:端口”组成。
客户端发起连接时,端口号是内核分配的,称为临时端口;在服务器端,端口是固定的,对应系统上不同的服务。
一个连接由它两端的套接字地址唯一确定。(套接字对)

11.4 套接字接口

套接字接口是一组函数,它们和unix IO函数结合起来,用来创建网络应用。

套接字地址结构
从内核来看,套接字就是通信的一个端点。从程序来看,套接字就是一个有相应描述符的打开文件。
tcp/ip的套接字相关代码中,_in后缀意思是互联网络(internet),而不是输入。

socket函数
客户端和服务器使用socket函数来创建一个套接字描述符。
通常带这样的参数:
clientfd = Socket(AF_INET, SOCK_STREAM, 0);
AF_INET表明我们正在使用因特网,SOCK_STREAM表明这个套接字是因特网连接的一个端点。clientfd仅仅部分打开,还不能读写。如何完成打开套接字,取决于是客户端还是服务器。

connetc函数
客户端使用connect来建立和服务器的连接。

=============== 未完待续 =================

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章