Linux 网络编程
1. 网络基础
1.1 网络分层模型
1.2 数据的封装和拆装
1.3 IP协议
1.4 TCP/UDP协议
1.5 IP地址
1.6 服务和端口号
1.7 域名
1.8 子网掩码
1.9 网关
1.20 路由器与交换机
2 socket编程
2.1 套接字(Socket)和Socket API简介
2.2 网络编程基础知识
2.3 TCP连接与断开
2.4 字节序
2.5 地址族
2.6 地址结构
2.7 IP转换
3 socket API
3.1 socket
3.2 给本地套接字赋予地址和端口(bind)
3.3 给连接排队(listen)
3.4 接受网络连接(accept)
3.5 连接远程主机(connect)
3.6 Socket I/O
3.7 关闭套接字
3.8 搭建一个TCP服务器
3.9 搭建一个TCP客户端
4 UDP编程
4.1 UDP概述
4.2 UDP服务端
4.3 UDP客户端
5 错误值处理
6 多进程并发服务器
7 多线程并发服务器
8 TCP状态
9 TCP流量控制(滑动窗口)
10 TCP与UDP的不同接包处理方式
11 select
12 poll
13 epoll
14 setsockopt
15 UDP广播
16 域名转换
Linux 网络编程
计算机网络中实现通信必须有一些约定,这些约定即被称为通信协议,如对速率、传输、代码、代码结构、传
输控制步骤、出错控制等的约定。也就是说,为了在两个节点之间成功地进行通信,两个节点之间必须约定使用共
同的“语言”。这些被通信各方共同遵循的约定、语言、规矩,有时又被称为协议(protocol)。
1. 网络基础
1.1 网络分层模型
最为通用的网络协议是TCP/IP协议,TCP/IP是“transmission Control Protocol/Internet Protocol”的简写,中文
译名为传输控制协议/互联网络协议, 它规范了网络上的所有通信设备,尤其是一个主机与另一个主机之间的数据
往来格式以及传送方式。
TCP/IP模型
TCP/IP 分不同层次进行开发,每一层分别负责不同的通信功能。一个协议族,比如TCP/IP,是一组不同层次
上的多个协议的组合。TCP/IP通常被认为是一个四层协议系统,每一层负责不同的功能:
(1)链路层:有时也称作数据链路层或 网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络
接口卡。它们一起处理与电缆的物理接口细节。
(2)网络层:有时也称作互联网层,例如分组的选路。在TCP/IP协议族中,网络层协议包括IP协议(网际协
议),ICMP协议(Internet Control Message Protocol: Internet互联网控制报文协议),以及IGMP协议(Internet
Group Management Protocol: Internet组管理协议),以及ARP(Address Resolution Protocol 地址解析协议)与
RARP(Reverse Address Resolution Protocol) 反向地址解析协议;
(3)传输层:主要为两台主机上的应用程序提供端到端的通信。在TCP/IP协议族中,有两个互不相同的传输协
议:TCP (Transmission Control Protocol传输控制协议)和UDP(User Datagram Protocol用户数据报协议)。
(4)应用层:负责处理特定的应用程序细节。
OSI模型
进计算机系统的开放互联。开放式互联就是可在多个厂家的环境中支持互联。
1978年,国际标准化组织(ISO:Open System Interconnection)开发了开放式系统互联参考模型,以促
该模型为计算机间开放式通信所需要定义的功能层次建立了全球的标准。
OSI模型将通信会话需要的各种进程划分成7个相对独立的功能层次,这些层次的组织是:
具体7层
功能与连接方式
应用层
网络服务与使用者应用程序间的一个接口。
表示层
数据表示、数据安全、数据压缩。
会话层
是建立在传输层之上,利用传输层提供的服务,使应用建立和维持会话,并能使会话获得同步。
传输层
在系统之间提供可靠的、透明的数据传送,提供端到端的错误恢复和流控制。(端口号)
网络层
数据链
路层
基于网络层地址(IP地址)进行不同网络系统间的路径选择。
在物理层上建立、维持、释放数据链接链接以及差错校验等功能,通过使用接收系统的硬件地址
或物理地址来寻址。
物理层
网络硬件设备之间的接口。
TCP/IP参考模型比OSI模型更灵活
1.2 数据的封装和拆装
位于TCP/IP四层模型各个层的数据通常用一个公共的机制来封装:定义描述元信息和数据包的部分真实信息
的报头的协议,这些元信息可以是数据源、目的地和其他的附加属性。当信息在不同的层之间传递时,都会在每一
个层被封装上协议的特有头部。而当我们收到数据时会一层层的剥离头部,直至取出数据。
比如以HTTP协议发送的数据包为例:
不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在
链路层叫做帧(frame)。数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应
用层数据交给应用程序处理。
以太网帧格式
源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的。用ifconfig
命令看一下,“HWaddr 00:15:F2:14:9E:3F”部分就是硬件地址。协议字段有三种值,分别对应IP、ARP、RARP。
帧末尾是CRC校验码。
图为以太网帧
以太网帧中的数据长度规定最小46字节,最大1500字节,ARP和RARP数据包的长度不够46字节,要在后面补
填充位。最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU,如果一个数据包从以太
网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation)ifconfig命令
的输出中也有“MTU:1500”。注意,MTU这个概念指数据帧中有效载荷的最大长度,不包括帧首部的长度。
ARP(Address Resolution Protocol)地址解析协议
在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址,而数据先
是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。因此在通讯前必
须获得目的主机的硬件地址。ARP协议就起到这个作用。
每台主机都维护一个ARP缓存表,可以用 arp ‐a 命令查看。缓存表中的表项有过期时间(一般为20分钟),
如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址。
arp ‐a 用于查看缓存中的所有项目。
1.3 IP协议
IP协议是最为通用的网络层协议。所有的TCP、UDP数据都以IP数据报文的格式传输。
IP协议是一个无连接、不可靠的协议。不可靠的意思是它不能保证IP数据报能成功地到达目的地。IP仅提供最
好的传输服务,如果发生某种错误时,如中途某个路由器故障,IP有一个简单的错误处理算法:丢弃该数据报,然
后发送ICMP消息报给信息源端。
任何可靠性要求必须由传输层来提供如(TCP)。无连接这个术语的意思是IP并不维护任何关于后续数据报的状
态信息。每个数据报的处理是相互独立的。这也说明,IP数据报可以不按发送顺序接收。
如果一“信源”向同一个“信宿”发送两个连续的数据报文(先发A,然后发B),每个数据报都是独立进行路由选
择,可能选择不同的路线,因此B可能在A到达之前先到达。
IP段
1.4 TCP/UDP协议
TCP协议
1、应用数据被分割成TCP认为最合适发送的数据块。由TCP传递给IP层的信息单位称为报文段
2、当TCP收到发自TCP连接另一端的数据的时候,它将发送一个确认(这个确认不被立即发送,通常将
3、TCP通过校验和的形式,提供对TCP首部和TCP数据的基本校验功能。如果接收端计算出来的校验
TCP提供一种面向连接的、可靠的字节流服务,它位于TCP/IP模型的传输层。面向连接意味着两个使用TCP
的应用(通常是一个客户端和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。
TCP通过下列方式来提供可靠性:
(segment)。当TCP发出一个段后,它启动一个定时器,等待接收端确认收到这个报文段。如果不能及时收到
一个确认,将重发这个报文段。
推迟几百毫秒,尽可能的和数据一起发送)。
和,与数据包中的校验和不相等,TCP将丢弃这个报文段,发送端将超时并重发。
4、既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文也会失序。
5、既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。
6、TCP还能提供流量控制,TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许另一端发
送接收端缓冲区所能接纳的数据。
综上所述,TCP是一个较为可靠的数据传输协议,但是TCP确认的数据不能保证被应用层收到,比如,
当TCP确认后的数据已放入套接字缓冲区中,而此时恰巧应用进程非正常退出,所以编写一个好的网络程序,
我们需要注意许多细节。
TCP 数据包
UDP协议
UDP与TCP之间存在本质差异,UDP是无连接的、不可靠的数据报协议。
UDP数据包格式
所有协议的分层
1.5 IP地址