CSAPP 11 网络编程

CSAPP 11 网络编程

网络编程基于之前看到的一些基本概念和抽象:进程、信号、内存映射、内存动态分配。

几乎所有的网络应用程序都基于服务器-客户端模式,即几个或者多个服务度进程和一个或者多个客户端进程,这些进程可以在同一个机器上,也可以分布在其他被网络连接的机器上。

计算机网络包含众多不同类型的机器,这些机器和设备是通过一些列“协议”进行交流的,每一个协议都包含两个基本部分:命名规则和传输规则。

TCP/IP协议

IP协议提供了基本的命名规则和传输规则,但是IP传输过程中会出现破损的包或者重复的包(packet),被称为datagram,而TCP协议则是建立在IP协议的基础上,提供可靠的双向通讯。UDP协议也是IP协议基础上的一个支持进程和进程通讯的协议。

在程序员的视角中,Internet可以认为是一个集合了多个主机的网络,这个网络具有如下属性:

  • 主机地址都是32位IP地址(IPv6协议是128位地址)
  • IP地址可以被映射成域名(domain names)
  • 不同主机的进程可以通过Connection通讯

socket

Socket是Connection的一端,每一个socket都有一个地址和一个端口。不过通常客户端的端口是有kernel自动指定的,而服务端口则是通常是程序指定的。一般unix类机器可以在/etc/services目录下找到各种服务。

所以一个Connection可以被一对独特的socket(地址和端口)识别出来。

Sockets Interface

在系统内核的角度,socket是一个Connection的一端,而在程序的角度,socket是一个文件标识符(IO的File)。

  • int socket(int domain, int type, int protocal)
  • int connect(int sockfd, struct sockaddr *serv_addr, int addlen)
  • int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
  • int listen(int sockfd, int backlog)
  • int accept(int listenfd, struct sockaddr *addr, int *addrlen)

Web Servers

CGI,Common Gateway Interface

TODO: TINY server!

总结

Socket是网络通讯的核心抽象,而socket在用户程序看来就是一个文件标识符。