本博客为系列博客,主要记录 《UNIX网络编程 卷一》相关读书笔记;
此篇博客主要针对 第一部分 :简介和 TCP/IP
概略
进行网络编程,首先要确认网络通信协议(protocol);Unix网络编程主要关注基于传输层的TCP,UDP, SCTP协议。
以web服务器(基于TCP/IP协议族)为例 :
通常web网络应用有客户端(client)和服务器(server)构成,假定总是客户端向服务端主动发起请求(忽略服务器异步回调【asynchronous callback】通信);
web客户端与 服务器之间使用TCP(Transmission Controller Protocol,传输控制 协议)通信,TCP又转而使用TP(Internet Protocol,网际协议 )通信,最后IP再通过某种形式的数据链路层通信;
通信过程图解如下:
tcp协议是系统内核协议栈的一部分,web服务器作为用户进程 要想进行基于tcp的网络编程 ,需要操作tcp;sockets API 是应用层到传输层或者其他协议层的访问接口;
使用socket函数创建套接字(根据参数不同可以创建tcp套接字,udp套接字,sctp套接字),并返回套接字描述符;
每个用户进程都有一个描述符表,socket函数创建套接字实际上是分配一个socket数据结构存储空间,并向进程描述符表中 写入创建的套接字描述符与socket数据存储空间对应关系;
socket数据结构是指操作系统分配的对应该套接字的内核级缓冲区;系统内核会对该缓存区进行操作,如:使用tcp协议切分数据,或者解数据包等协议操作
tips:
1. web服务器是一个长时间运行的程序(即守护进程daemon),守护进程详解参见 : www.cnblogs.com/mickole/p/3188321.html
2. 客户和服务器通常是用户进程,而TCP和IP协议通常是内核中协议栈的一部分
3. 文件描述符详解参见 m.blog.csdn.net/article/details?id=38965239
4. Ubuntu下socket error详解参见 blog.csdn.net/u013011841/article/details/40414777
5. 相关代码参见 github.com/flybird1971/socketApi/tree/master/socket/intro
IOS模型
名词解释
- 双栈主机 : 表示同时支持IPv4和IPv6的主机
- 多宿主机(mulihomed host):具有多个IP层可见接口(扣除回馈接口)的主机。
UDP 用户数据报协议(User Datagram Protocol)
udp是一个简单,无连接,不可靠的数据报协议,
应用进程往一个udp套接字写入一个消息,该消息随后被封装(encapsulation)到一个udp数据报,然后udp数据报进而被封装到一个IP数据报,最后通过链路层发送到对端;
udp不保证udp数据报