Beej’s Guide to Network Programming Using Internet Sockets
-
socket也用文件描述符来标记,与文件不同的是,它是用 recv(2) 和 send(2) 来读写。
-
telnet登录到80端口
$ telnet baidu.com 80 Trying 180.149.132.47... Connected to baidu.com. Escape character is '^]'. GET / HTTP/1.0 HTTP/1.1 200 OK Date: Tue, 28 Apr 2015 00:36:27 GMT Server: Apache Cache-Control: max-age=86400 Expires: Wed, 29 Apr 2015 00:36:27 GMT Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT ETag: "51-4b4c7d90" Accept-Ranges: bytes Content-Length: 81 Connection: Close Content-Type: text/html <html> <meta http-equiv="refresh" content="0;url=http://www.baidu.com/"> </html> Connection closed by foreign host.
-
两种主要的socket类型:SOCK_STREAM 和 SOCK_DGRAM 。stream套接字用send()发送,datagram套接字用sendto()发送。数据包的包装是内核与硬件的事情。
-
RFC793 TCP
-
RFC791 IP
-
RFC768 UDP, tftp, dhcpcd
-
ISO/OSI七层模型
Application Presentation Session Transport Network Data Link Physical
-
实际系统中的网络模型更接近于
Application Layer (telnet, ftp, etc.) Host-to-Host Transport Layer (TCP, UDP) Internet Layer (IP and routing) Network Access Layer (Ethernet, wi-fi, or whatever)
-
IPv4 232,IPv6 2128
-
pipe系统调用的用法
-
参数是一个长度为2的整型数组,pipe()之后进行fork(),子进程和父进程一个读一个写。如果子进程读,父进程写,则在子进程中要先关闭fildes[1](不会去写), 父进程中要先关闭fildes[0](不会去读)。
-
能否同时读写,即双向管道?
-
管道机制是怎么实现的,fork之后,两个进程中的描述符是如何保持联系的?
-
文件描述符和文件流的连接:fdopen
-
管道的典型使用方式是,pipe→fork→dup2→exec,这个流程实际上实现了将子进程的stdout或者stdin绑定到一个管道,从而与父进程进行通信。库函数popen()实现的功能与之类似,相当于用bash -c 执行一条命令,然后可以指定父进程对管道是读还是写。
-
管道I/O的原子性。当数据大小不超过PIPE_BUF时,管道的读或者写是原子的。 如何理解?
-
-
本机字节序与网络字节序之间的转换
-
<arpa/inet.h>
-
htons, htonl, ntohs, ntohl
-