下面先通过我的另外一篇文章了解一下
TCP/IP协议模型 和 OSI参考模型 的对比:
https://blog.csdn.net/qq_37941471/article/details/80459772
接下来我来从顶向下的介绍一下TCP/IP协议模型的四层:
应用层:
1. 功能:
这一层为用户的应用程序提供网络服务的。包括:文件传输,电子邮件,远程登录等
而怎么提供服务呢?
双方之间的协议,以某一种格式:比如邮件的格式
下面就有了一些应用层的协议:
2. 应用层的协议:
基于UDP的应用层协议 :
1. NFS:网络文件系统
2. TFTP:简单文件传输协议
3. DHCP:动态主机配置协议
4. BOOTP:启动协议(用于无盘设备启动)
5. DNS:域名解析协议
当然也包括自己写的UDP程序中自定义的应用层协议。
基于TCP的应用层协议:
1. HTTP : 超文本传输协议
2. HTTPS :是加密版本的:超文本传输协议
3. SSH :安全外壳协议 :是一个加密的远程登录协议
4. Telnet :远程登录协议
5. FTP :文件传输协议
6. SMTP :简单邮件传输协议
当然也包括自己写的TCP程序中自定义的应用层协议。
首先我们先实现一个网络版的计算器:
实现一个网络版的计算器:
这是我的两位一篇文章,有详细的解释:
https://blog.csdn.net/qq_37941471/article/details/80788174
下面我们重点了解一下常用的 http 协议:
HTTP协议:
1. 认识URL:
其实就是我们俗称的“网址”:
2. HTTP协议格式 :
3. HTTP的方法:
方法 | 说明 | 支持的HTTP协议版本 |
---|---|---|
GET | 获取资源 | 1.0 / 1.1 |
POST | 传输实体主体 | 1.0 / 1.1 |
PUT | 传输文件 | 1.0 / 1.1 |
HEAD | 获得报文首部 | 1.0 / 1.1 |
DELETE | 删除文件 | 1.0 / 1.1 |
OPTIONS | 询问支持的方法 | 1.1 |
TRACE | 追踪路径 | 1.1 |
CONNECT | 要求用隧道协议连接代理 | 1.1 |
LINK | 建立和连接的关系 | 1.0 |
UNLINE | 断开连接关系 | 1.0 |
4. HTTP—状态码及其描述:
状态码 | 类别 | 原因短语 |
---|---|---|
1XX | Informational ( 信息性状态码 ) | 接收的请求正在处理 |
2XX | Success ( 成功状态码 ) | 请求正常处理完毕 |
3XX | Redirection( 重定向状态码 ) | 需要进行附加操作及完成请求 |
4XX | Client Error( 客户端错误状态码 ) | 服务器无法处理请求 |
5XX | Server Error( 服务器错误码 ) | 服务器处理请求出错 |
常见的状态码:
1. 2XX 成功
1. 200 : OK
表示请求结果已经被正确处理了
2. 204 :NO Content
表示请求结果已经被正确处理了, 但是响应信息中没有响应正文
3. 206 :Partial Content
请求资源中的某一部分
2. 3XX 成功
1. 301 : Moved Permanently
永久性重定向
2. 302 :Found
临时性重定向
3. 307 :Partial Content
临时重定向
三者之间的区别:
1. 301 和 302标准禁止将POST方法改变成GET方法的,但是实际使用中大家并不会去遵守
2. 307会遵守浏览器的标准:不会将POST方法改变成GET方法
3. 4XX 客户端错误
1. 400 : Bad Request
请求报文中存在语法错误,需要修改请求内容重新发送
2. 403 :Forbidden
所请求的资源被服务器拒绝了,服务器没有必要给出详细的解释。
3. 404 :Not Found
服务器中没有客户端请求的资源
3. 5XX 服务器端错误
1. 500 : Internal Server Error
表示服务器端在执行的时候出现了错误,可能是web本身存在的bug或者临时故障
2. 503 :Server Unavailable
表示服务器端目前处于超负载或者正在进行停机维护状态,目前无法请求资源
下面我们实现一个简单的http服务器:
5. 实现一个简单的http服务器:
下面先通过我的另外一篇文章了解一下:
http服务器是基于TCP协议实现的
https://blog.csdn.net/qq_37941471/article/details/80789725
传输层
1. 功能:
功能 : 负责数据能够从发送端发送到接受端
另外 :
对于上层 : 是为上层提供服务的
而如何实现交付?
1. 考虑怎么将有效载荷和报头分离
1. 上层的http协议是通过空行来当报头和数据的分隔符的
2. 而这里,我们用定长来解决
2. 有了数据,如何给上层,交给上层?
引出了端口号的概念
1. 端口号 :表示了某一个主机上进行通信的不同的应用程序
2. 而如何找到主机的? 网络层是用来找目标主机的
不过始终记得:
对于各层而言,每一层的通信每一层都认为是和对应层通信的 ;
只是下一层是为上一层提供服务的,想要通信,就是要找到
1. 用目标地址的网络号找到主机所在的网络
2. 找到所在的网络,再去找对应的主机
以及主机中对应的程序 (端口号标识)
2. 端口号的作用以及划分:
作用:
有了数据,如何给上层,交给上层?
引出了端口号的概念
1. 端口号 :表示了某一个主机上进行通信的不同的应用程序
2. 而如何找到主机的? 网络层是用来找目标主机的
不过始终记得:
对于各层而言,每一层的通信每一层都认为是和对应层通信的;
只是下一层是为上一层提供服务的,想要通信,就是要找到
1. 用目标地址的网络号找到主机所在的网络
2. 找到所在的网络,再去找对应的主机
以及主机中对应的程序 (端口号标识)
划分:
逻辑意义上的端口有多种分类标准,下面将介绍两种常见的分类:
一 :按端口号分布划分
(1)知名端口(Well-Known Ports)
知名端口即众所周知的端口号,范围从0到1023,这些端口号一般固定分配给一些服务。
比如21端口分配给FTP服务,25端口分配给SMTP(简单邮件传输协议)服务,
80端口分配给HTTP服务,135端口分配给RPC(远程过程调用)服务等等。
(2)动态端口(Dynamic Ports)
动态端口的范围从1024到65535,这些端口号一般不固定分配给某个服务,
也就是说许多服务都可以使用这些端口。只要运行的程序向系统提出访问网络的申请,
那么系统就可以从这些端口号中分配一个供该程序使用。比如1024端口就是分配给第一个
向系统发出申请的程序。在关闭程序进程后,就会释放所占用的端口号。
不过,动态端口也常常被病毒木马程序所利用,如冰河默认连接端口是7626、WAY 2.4是
8011、Netspy 3.0是7306、YAI病毒是1024等等。
二 :按协议类型划分
按协议类型划分,可以分为TCP、UDP、IP和ICMP(Internet控制消息协议)等端口。
下面主要介绍TCP和UDP端口:
(1)TCP端口
TCP端口,即传输控制协议端口,需要在客户端和服务器之间建立连接,
这样可以提供可靠的数据传输。常见的包括 :
1. FTP服务的21端口
2. Telnet服务的23端口
3. SMTP服务的25端口
4. HTTP服务的80端口
5. HTTPS服务的443端口
6. SSH服务的22端口
(2)UDP端口
UDP端口,即用户数据包协议端口,无需在客户端和服务器之间建立连接,安全性得不到保障。
常见的有 :
1. DNS服务的53端口
2. SNMP(简单网络管理协议)服务的161端口
3. QQ使用的8000和4000端口等等。
我们自己写的程序使用端口时,应该避开这些知名的端口号
下面来介绍一下这一层的两个重要的协议:
3. UDP协议 和 TCP协议:
https://blog.csdn.net/qq_37941471/article/details/80888827
网络层
1. 功能:
在复杂的网络环境中找一个合适的路径。
另外,网络层具有将主机A上的数据发送到主机B这个能力,但是不是绝对的。
下面介绍一下网络层是如何找合适的路径的?路由选择
首先了解一下IP协议:
2. IP协议:
1. IP地址 :
1. 基本概念:
1. 主机:配有IP地址,但是不进行路由 2. 路由器:既配有IP地址,又会进行路由 3. 节点: 是主机和路由器的统称
2. 路由选择:
1. ip地址分为:网络号+主机号 eg: 192.168.128.10 其中192.168.128是网络号,10是该网段的主机号 2. 路由选择的过程: 分为两步: 1. 用网络号找到目标网络(路由用的不是ip地址,而是网络号) 2. 用主机号找到主机 (找到目标主机所在额局域网,再通过主机号来找到目标主机)
2. IP协议格式:
3. 网段的划分:
1. 网络号 :区分两个主机是否在一个局域网(网段)
2. 主机号 :标识同一个局域网中的不同主机(同一个局域网,网络号必须相同)
按照类别进行划分:
1. A类地址: 0.0.0.0~127.255.255.255 2. B类地址: 128.0.0.0~191.255.255.255 3. C类地址: 192.0.0.0~223.255.255.255 4. D类地址: 224.0.0.0~239.255.255.255 5. E类地址: 240.0.0.0~247.255255.255
然而在实际应用中,大多数组织都申请的是B类和C类比较多,那么其他的类地址会浪费,B类和C类的地址会不够用,所以为了解决这个问题,有了新的一种划分地址的方法,也是现在常用的一种方法:
CIDR的划分方案 :
1. 引入了一个额外的子网掩码(subnet mask)来区分网络号和主机号 2. 子网掩码是一个32位的正整数,通常用一串“0”来结尾 3. 将IP地址与子网掩码进行按位与操作,得到的结果就是网络号 4. 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关
特殊的IP地址:
1. 将IP地址中的主机地址全部设为0,就是网络号,表示这个局域网 2. 将IP地址中的主机地址全部设为1,就称为了广播地址, 用于给同一链路中相互连接的所有主机发送数据包(ARP协议中就用到了) 3. 127.*的IP地址通常用于本机环回(loop back)测试,通常是127.0.0.1
4. IP地址数量的限制:
我们知道,IPv4是一个4字节32位的正整数,它所能表示的ip地址最多也就是2^32-1,大概也就是43亿左右。而TCP/IP协议规定,每一个主机都需要一个IP地址;而这个世界上所有的主机远远不少于43亿,如果每一个主机都会有自己的ip地址,ip地址是不够用的,为了解决这个问题,下面用这几种方法来解决这个问题:
CIDR:
CIDR(无类域间路由器选择),它消除了传统的A类,B类等地址以及划分子网的概念,因而在一定程度上解决了IP地址不够用的问题(提高了效率,减少了浪费, 但是IP地址的上限并没有改变 )
下面介绍一下具体的三种方式:
1. 动态分配IP地址:
1. 只给接入网络的主机分配ip地址 2. 这个ip地址是路由其分配的,因而同一个主机因为接入网络的不同,ip地址也会不同 3. 总结:一般来说,主机不上网,就没有ip地址,连上网后,ip地址是路由器动态分布的 (这个地址就是私有地址),不是固定不变的,整个过程中,主机只有MAC地址是唯一不变的。
2. NAT技术:
下面会仔细的讲:相关概念 私有IP地址和公网IP地址
3. 将IPv4 改成 IPv6 :
1. IPv6不是IPv4的升级版,而是一个互不相干的协议 2. 当前大家用的都是IPv4这个互联网协议,IPv6协议是下一个要替换IPv4协议, 只是现在实现起来会比较困难 3. IPv4是一个4字节32位的正整数;而IPv6是128位的正整数; 所以它所能表示的ip地址最多为2^128-1个
由IPv6的实现会比较困难,所以我们通过第一二种方式来解决ip地址不够用的问题。
下面来介绍一下 NAT技术:
私有IP地址和公网IP地址
记住下面几点:
1. 公网IP地址是不可能重复的(全球唯一的IP地址)
2. 私有IP地址可以重复(不过是在不同的局域网中)
3. 路由器有两个口:一个是WAN口,一个是LAN口;另外LAN口中所分配的IP地址一定是私有地址;而WAN口的地址不一定是公网地址,因为有可能这个路由器是公网中的一个局域网(下面会用图来介绍)