- Internet与TCP/IP协议
- Internet历史
- OSI模型与TCP/IP协议体系结构
- TCP/IP协议
- TCP和UDP协议
- TCP/IP网络编程——基础篇
- 预备知识
- 系统调用
- TCP服务器/客户端
- UDP服务器/客户端
- 常用网络调试工具介绍
- I/O模型和服务器模型
- TCP/IP网络编程——进阶篇
- 常见协议头分析
- 网络信息检索和套接字属性设置
- 网络超时检测
- 广播和组播
- UNIX域套接字
一、互联网的历史
-------------------------------------------------------------------------------------------------------------------------------------
二、网络的体系结构
网络采用分而治之的方法设计,将网络的功能划分为不同的模块,以分层的形式有机组合在一起。(分层)
每层实现不同的功能,其内部实现方法对外部其他层次来说是透明的。每层向上层提供服务,同时使用下层提供的服务
(1)网络的层次结构
[1]OSI7层模型(每层的作用)
- 物理层(Physical Layer):统一网络设备的设计规范
- 数据链路层(Data Link Layer):保证比特流传输正确(网卡驱动程序)
接受来自物理层的位流形式的数据,并封装成帧。同样,也将来自上一层的数据帧,拆装为位流形式的数据转发到物理层。有一定的纠错功能
- 网络层(Network Layer):选择最佳路径(路由器),定义了IP地址
- 传输层(Transport Layer):保证数据传输无误
- 会话层(Session Layer):提供包括“访问验证”和“会话管理”(会话的建立、控制、终止)
- 表示层(Presentation Layer):
提供压缩解压、加密解密、语法转换内码。使能 解读成正确的 数据
- 应用层(Application Layer):
它在其他6层工作的基础之上,为应用程序 提供访问网络的 接口
注意:OSI模型是一个理想化的模型,尚未有完整的实现(参考价值)
![](https://i-blog.csdnimg.cn/blog_migrate/5a7603ed1af5f6a38704ab35057530b9.png)
七层结构顺序
![](https://i-blog.csdnimg.cn/blog_migrate/532440aa3da734f21f5f0956db677e5b.png)
[2] TCP/IP四层模型(五层)
![](https://i-blog.csdnimg.cn/blog_migrate/082a8d35fb0e7a143a16184a4d31f377.png)
以下是5层模型
![](https://i-blog.csdnimg.cn/blog_migrate/bf41716b7d877c8f462ab7ef2ac9c77f.png)
掌握每层的作用,与OSI模型的对应关系
(2)常见TCP/IP协议
![](https://i-blog.csdnimg.cn/blog_migrate/db1df56bb65bb8b9bd0c02178dbd5554.jpeg)
TCP/IP协议
互联网协议族(英语:Internet Protocol Suite,缩写为IPS)是一个网络通讯模型,以及一整个网络传输
协议家族,为互联网的基础通讯架构。它常被通称为TCP/IP协议族(英语:TCP/IP Protocol Suite,
或TCP/IP Protocols),简称TCP/IP]。因为这个协议家族的两个核心协议,包括TCP(传输控制协议)和
IP(网际协议),为这个家族中最早通过的标准。由于在网络通讯协议普遍采用分层的结构,当多个层次的
协议共同工作时,因此又被称为TCP/IP协议栈(英语:TCP/IP Protocol Stack)
IETF 制定互联网的标准,数字越小制定的年代越早,它的所有协议标准称为RFC(任何人都可以提交自己的协议
提交给该组织进行检测)www.ietf.org
ITUT 国际电信联盟, 起源于1865,电报产生的年代,会员制。
应用层
TFTP
:简单文本传输协议
HTTP:超文本传输协议,用于从WWW服务器传输超文本到本地浏览器的传输协议
DNS:域名解析协议(解析IP地址和域名之间的关系)
TELNET:远程登录协议 是Internet远程登录的标准协议和主要主要方式
SSH:安全外壳协议(Secure Shell)是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。
POP3:Post Office Protocol - Version 3邮局协议版本3邮件服务器向客户端发送邮件
SMTP:简单邮件传输协议,客户端向邮件服务器发邮件
SNMP:简单网络管理协议,主要用于管理网络设备,检测设备的信息
其中http是用来协议html文本的传输
DNS用来协议www.baidu.com与IP地址对应表的解析的传输(与dns服务器地址通讯)以下:
![](https://i-blog.csdnimg.cn/blog_migrate/0d5017f05818c3f5833eb16318846a72.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/dc6964ac3293c9acae332e7adf40f124.png)
传输层
TCP:传输控制协议,是一个“可靠的”、
面向连结的传输机制,它提供一种可靠
的字节流保证数据完整、无损并且按顺序到达。
UDP:是一个
无连结的数据报协议。它是一个“尽力传递”(best effort)或者说
“不可靠”协议——不是因为它特别不可靠,而是因为它不检查数据包是否已经
到达目的地,并且不保证它们按顺序到达。
网络层
IP(核心): 协议为高层提供不可靠、无连接的数据报通信。 IP 协议提供的不可靠服务是指它不能保证 IP 数据报
能成功地到达目的地。IP协议是将多个交换网络连接起来,它在源地址和目的地址之间
传送一种称之为
数据包的东西,
专门负责对不同网络进行互联的。IPV4、IPV6
ICMP:网际控制消息协议(Internet Control Message Protocol)。ICMP处理在路由器和主机之间流通的错误和控制消息。
这些消息通常有TCP/IP网络支持软件本身(而不是用户进程)产生和处理。(ping)
IGMP:网际组管理协议(Internet Group Management Protocol)。用于多播。
数据链路层
ARP:地址解析协议(Address Resloution Protocol)。ARP把一个IPV4地址映射成一个硬件地址(物理地址)。局域网MAC,
RARP:反向地址解析协议(Reverse Address Resloution Protocol)。RARP把一个硬件地址映射成一个IPv4地址。
![](https://i-blog.csdnimg.cn/blog_migrate/58c6e7ccab000dca05215cb3e055604f.png)
ARP攻击:
仅能在以太网(局域网如:机房、内网、公司网络等)进行。无法对外网(互联网、非本区域内的局域网)进行攻击。
ARP攻击就是通过伪造IP地址和MAC地址实现ARP欺骗,能够在网络中产生大量的ARP通信量使网络阻塞,攻击者只要持续不断的
发出伪造的ARP响应包就能更改目标主机ARP缓存中的IP-MAC条目,造成网络中断或中间人攻击。
攻击者向电脑A发送一个伪造的ARP响应,告诉电脑A:电脑B的IP地址192.168.0.2对应的MAC地址是00-aa-00-62-c6-03,电脑A信以为真,
将这个对应关系写入自己的ARP缓存表中,以后发送数据时,将本应该发往电脑B的数据发送给了攻击者。同样的,攻击者向电脑B也发送一个
伪造的ARP响应,告诉电脑B:电脑A的IP地址192.168.0.1对应的MAC地址是00-02-aa-63-c5-02,电脑B也会将数据发送给攻击者。(中间人工具)
![](https://i-blog.csdnimg.cn/blog_migrate/8ca43cdbc12d96623f36da8d5cdc8510.png)
arp -a 显示局域网所有 IP 与 MAC 对应
-------------------------------------------------------------------------------------------------------------------------------------
三、TCP/IP协议通信模型
![](https://i-blog.csdnimg.cn/blog_migrate/f9f2adfc2922c3d33ddc53db9d00e7dd.png)
上图的路由器是二层交换机,去掉了ip协议头。
下图还差一个路由器
![](https://i-blog.csdnimg.cn/blog_migrate/7709b756614c418134ac2ad1347ea6a5.png)
在TCP/IP四层模型的基础之上讨论,数据在网络节点之间的传递
(1)TCP/IP协议下的数据包(
数据帧的格式)
(网络传输最小单元)
![](https://i-blog.csdnimg.cn/blog_migrate/b1de4c09dfbc156317a88cf9849d2d36.png)
在TCP/IP协议模型下,用户数据在经过每一层处理后都会记录一些信息,这些信息以消息头的方式层层封装再层层解包分析
(2)数据的打包和解包
打包:加包头的过程(压栈)
栈就是具有后进先出的
数据结构
![](https://i-blog.csdnimg.cn/blog_migrate/bddc7dfbccab80390b919dfcf56700ee.png)
解包:去包头的过程(弹栈)
栈就是具有后进先出的
数据结构
(3)TCP/IP的边界特性
1.操作系统边界特性:网络应用也协议分开,应用层为非OS软件,以下各层在实现上都属于OS
2.地址边界特性:网络层以上(包括应用层,传输层)的软件用IP地址,网络接口层的软件处理物理地址。
![](https://i-blog.csdnimg.cn/blog_migrate/2f44f805742dbe0c8a31be123042f018.png)
-------------------------------------------------------------------------------------------------------------------------------------
四、TCP和UDP协议
共同点:同为传输层协议
不同点:
TCP:有连接,可靠
UDP:无连接,不保证可靠
(1)
TCP(即传输控制协议
):
字节流通信
ABCD -----> ABD DCBA AABBCCDD
1234 124(请求再发3) TCP自己排序 删除重复的报文。
是一种面向连接的传输层协议,它能提供高可靠性通信(即数据无误、数据无丢失、数据无失序、数据无重复到达的通信)
适用情况:
- 适合于对传输质量要求较高,以及传输大量数据的通信。
- 在需要可靠数据传输的场合,通常使用TCP协议
- MSN/QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议
传输特点:全双工的面向连接的可靠的按序递交的无重复到达的
字节流通信
![](https://i-blog.csdnimg.cn/blog_migrate/44bd6f52d2b3ca3bf71bdb2bab1df510.png)
(2)
UDP协议(用户数据报协议
):
数据报通信
是不可靠的无连接的协议。在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输。
适用情况:
- 发送小尺寸数据(如对DNS服务器进行IP地址查询时)64k以内
- 在接收到数据,给出应答较困难的网络中使用UDP。(如:无线网络)
- 适合于广播/组播式通信中。
- MSN/QQ/Skype等即时通讯软件的点对点文本通讯以及音视频通讯通常采用UDP协议
- 流媒体、VOD、VoIP、IPTV等网络多媒体服务中通常采用UDP方式进行实时数据传输
传输特点:全双工的、无连接的、不保证可靠性的
数据报通信
下图每个
数据报
不能超过64kb
![](https://i-blog.csdnimg.cn/blog_migrate/7ec3bf71ed5c6332e5eccb2bc2638762.png)
-------------------------------------------------------------------------------------------------------------------------------------
数据封装
![](https://i-blog.csdnimg.cn/blog_migrate/9525f8a9e273195e00a62380511aadab.png)
应用数据需要经过TCP/IP每一层处理之后才能通过网络传输到目的端。
每一层上都使用该层的
协议数据单元
PDU
(Protocol Data Unit)彼此交换信息。不同层的PDU中包含有不同的信息,因此PDU在不同层被赋予了不同的名称。
如上层数据在传输层添加
TCP报头后得到的PDU被称为
Segment(
数据段
);
如上层数据在传输层添加
UDP报头后得到的PDU被称为
Datagram(
数据报
);
数据段被传递给网络层,网络层添加
IP报头得到的PDU被称为
Packet(
数据包
);
数据包被传递到数据链路层,封装
数据链路层报头得到的PDU被称为
Frame(
数据帧
);最后,帧被转换为比特,通过网络介质传输。
这种协议栈逐层向下传递数据,并添加报头和报尾的过程称为封装(打包)。
-------------------------------------------------------------------------------------------------------------------------------------
五、预备知识
1.Socket(套接字)
什么是套接字:
(1)是一个通用的网络编程接口 fd = socket()
(2)是一种特殊的文件描述符 (everything in Unix is a file) (套接字描述符)
获得文件描述符:open 、socket、 pipe
(3)文件IO的系统调用依然适用于网络(除了lseek)管道文件也不能用lseek的。
(4)并不仅限于TCP/IP协议
套接字的类型:
(1)流式套接字(SOCK_STREAM):TCP
(2)数据报套接字(SOCK_DGRAM):UDP
(3)原始套接字(SOCK_RAW):可以对较低层次协议如IP、ICMP直接访问。
Socket的位置:
介于应用和传输层之间的编程接口(
系统调用)
![](https://i-blog.csdnimg.cn/blog_migrate/cf0d3cc56ae2f120333031318daeddc8.png)
2.IP地址
- IP地址作用:一台主机到网络的一个连接标识。
- IP地址的实质:IP地址为32位(IPv4)或者128位(IPv6)
- IP地址表示形式:点分十进制
将IP地址按字节转换成10进制中间以点隔开
01100000 01010000 11110000 11110000
96.80.240.240
<1>IP地址分类:
IP地址组成 网络号+地址号
Internet管理委员会
根据网络号的不同
定义了A、B、C、D、E
五类地址
A:通常分配给拥有大量主机的网络
B: 适用于结点比较多的网络
C:适用于结点比较少的网络
D:组播地址
E:保留的
![](https://i-blog.csdnimg.cn/blog_migrate/32b302e9a957275d51ee0da6ac7c74b7.png)
<2>几个特殊的IP地址:
1)私有地址:私有地址可以自己组网时用,但不能在Internet网上用
A:10.0.0.0~10.255.255.255
B:172.16.0.0~172.131.255.255
C:192.168.0.0~192.168.255.255
2) 回送地址
127.0.0.1 ~
127.255.255.254
A类网络地址127是一个保留地址,用于网络软件测试以及本地机进程间通信,叫做回送地址(loopback address)。
一旦使用回送地址发送数据,协议软件立即返回之,不进行任何网络传输。
注意:Ping 127.0.0.1,如果反馈信息失败,说明IP协议栈有错,必须重新安装TCP/IP协议
网线没插都没关系,因为达不到那一层的啦
![](https://i-blog.csdnimg.cn/blog_migrate/33e8c5034c7c7b5ee69c160a65258c07.png)
3)广播地址
TCP/IP规定,主机号全为1的网络地址用于广播之用,叫做广播地址。所谓广播,指同时向同一子网所有主机发送报文。
255.255.255.255(全网段的广播IP地址)
4)主机地址
0.0.0.0 ,本机的IP地址集合(操作系统根据需求选择IP地址)
(显示拥有的网络地址)包括广播地址
5)IP地址转换:
“192.168.1.1”------有
点的,一般我们写成字符串形式
把字符串转换为网络字节序的二进制值(大端嘚
)
inet_aton();
inet_addr();
把网络字节序的二进制值转换为字符串
inet_ntoa();
![](https://i-blog.csdnimg.cn/blog_migrate/267d437de26d7ef7fcfcb9b38cfaa9e2.png)
3.子网掩码
1)子网掩码的概念及作用 :
(1) 分离出 IP 地址中的网络部分与主机部分
(2) 基于子网掩码,管理员可以将网络进一步划分为若干子网
实质:子网掩码也是32bit,
一串1后跟随
一串0组成(
其他非法),其中1表示在IP地址中的网络号对应的位数,而0表示在IP地址中主机对应的位数。
2)为什么需要使用子网掩码
分离网络号:子网掩码判断两台计算机是否属于同一网段
第一步:本机的子网掩码与接受方主机的 IP 地址进行 ' 与 ' 运算,即可得到目标主机所在的网络号
第二步:将本机的子网掩码与本机的 IP 地址进行 ' 与 ' 运算,即可得到本机所在的网络号。
192.168.1.3 && 255.255.255.0 == 192.168.1.0 网络号
192.168.1.7 && 255.255.255.0 == 192.168.1.0 网络号
如果网络号相同,表明接受方在本网络上,那么可以通过相关的协议把数据包直接发送到目标主机;
如果网络号不同,表明目标主机在远程网络上,那么数据包将会发送给本网络上的路由器,由路由器将数据包发送到其他网络,直至到达目的地。
分离主机号:
将取 ' 反 ' 后的子网掩码与 IP 地址做 ' 与 ' 运算,将答案化为十进制便得到主机地址。
补充
1)标准子网掩码:
A类网络(1 - 126) 缺省子网掩码:255·0·0·0
B类网络(128 - 191) 缺省子网掩码:255·255·0·0
C类网络(192 - 223) 缺省子网掩码:255·255·255·0
2) 特殊的子网掩码
这些子网掩码的出现是为了把一个网络划分成多个网络。
![](https://i-blog.csdnimg.cn/blog_migrate/82515fc8ed29d9f5fdfb4a0bad991fa3.png)
4.端口号
意义:为了区分一台主机接收到的数据包应该转交给哪个进程(服务)来进行处理,使用端口号来区别
实质:实际上是16bit的整数
注意:TCP端口号与UDP端口号独立
只要传输层协议不同就可以端口号相同
端口号的使用:
(1)众所周知端口:1~1023(1~255之间为众所周知端口,256~1023端口通常由UNIX系统占用)
例如:SSH服务被22端口占用等等
(2)已登记端口:1024~49151 (其中有些端口号也被已经被注册)
做法通常指定端口大于5000。建议(8888, 6666, 9999)
在文件/etc/services中可以找到网络服务端口分配。
(3)动态或私有端口:49152~65535
操作系统自动分配的端口号
5.字节序
(1)主机字节序(HBO):
一个多字节整数在计算机内存中存储的字节顺序称为主机字节序。(HBO- Host Byte Order)
因为CPU的设计以及OS的实现(两者共同作用,CPU相同,OS不同,HBO也会不同),在不同的系统上会有不同的字节序类型。
分为大端序(Big-Endian)和小端序(Little-Endian)。
小端序:低序字节存储在低地址,将低字节存储在起始地址,称为“Little-Endian”字节序,Intel、AMD等采用的是这种方式;
大端序(big-endian)- 高序字节存储在低地址,将高字节存储在起始地址,称为“Big-Endian”字节序,由ARM、Motorola等所采用
存在的问题:HBO不同在传输多字节整数时存在的问题,数据可能不相等
![](https://i-blog.csdnimg.cn/blog_migrate/6ac0a081905333c812c15c30d5a16c38.png)
(2)网络序(即大端字节序
)(NBO)
对于一个多字节整数,在网络上传输时要按照统一的字节顺序发送和接受,即网络字节序序(NBO - Network Byte Order)
从本地发送(send,write)一个整数值到网络上,需要HBO->NBO
从网络上读取(recv,read)一个整数值到本地,需要NBO ->HBO
(3)字节序转换函数:
1)主机字节序到网络字节序
u_long htonl (u_long hostlong); 32bit ip地址
u_short htons (u_short short); 16bit 端口号
2)网络字节序到主机字节序
u_long ntohl (u_long hostlong);
u_short ntohs (u_short short);