TCP/IP协议族的体系结构
-
四层协议模型
1552225-01c23d45587af144.png - TCP/IP协议整体的工作流程
原始数据包会经过一层一层的封装(为了让下一层能够识别必须添加特定的包头)、向下传递。而后在目的地一层一层将数据取出。
1552225-64c85e9753d0e325.png
网络层
是TCP/IP协议中最重要的一层
- 路由器
负责报文(数据包)的转发以及路径的选择
- 路由表
路径选择主要依靠路由表(也就是通过我可以到达网络的表格)实现。包括静态路由表(网络管理员负责建立、但基本没人用)以及动态路由表(通过路由协议建立)。
- 工作原理
1、如果目的地址存在于路由表中、那么直接转发。
2、如果目的地址不存在于路由表中、那么则发给默认路由。
3、通过网络号而不是整个IP地址进行路由判断
- 路由协议
帮助路由器建立路由表
1、距离向量路由算法:要求路由器将自己的路由表发送到临近的节点上
2、链路状态路由算法:只发送路由表中描述自身链路状态的部分到临近的节点上
- IP地址
一种无连接的传输协议。只负责数据包的传输、不对任何问题负责。和UDP很像、但是IP数据包的包头中是不含端口号的、只针对主机(IP地址)之间进行传输。
A、B、C、D、E共五类网络地址:
1552225-d370948a0d6e7ced.png
常用的网络地址为ABC三类:
A类:0开头、后24位作为主机号、其余作为网络号。
B类:10开头、后16位作为主机号、其余作为网络号。
C类:110开头、后8位作为主机号、其余作为网络号(最常用)
D类:用于UDP多播。
- 子网掩码
对地址结构的扩展、用于确定网络号与主机号的结构
比如有两个C类地址、他们本属不同的网络。但如果合理使用子网技术、就可以把他们的网络号合并从而形成一个子网。
1552225-a1aeb08d6008114d.png
- 分片与重组
实际使用中经常会遇到一个IP包传输不完(比如途中某个物理网络最大传输长度限制)、需要拆分的情况。
对于大于MTU(最大传输长度)的数据包、会被拆分然后传输、最后在目的地重组恢复。
分片动作通常由路由器完成、重组由目标主机完成(降低了中间路由器压力)。
需要注意的是一旦任何分片丢失、目的主机都会要求重传所有分片
- NAT网络地址转换
一种通过将内部不同私网IP及端口与公网端口绑定、以达到内部所有计算机通过一个公网IP进行外界沟通的作用。
我们现在基本都是使用了这个技术、如果你有两台主机就会发现他们的公网IP其实是相同的。
- ipv6
1、扩展地址:由IPv4的32(46亿个)位扩展为128位(340万亿个)
2、简化的包头
3、流标记:相同流向的数据包不需要每次进行寻路
- MAC地址
用IP地址映射所对应的MAC地址
1、在物理层上、并不是通过IP地址来确定通讯目标(有可能是因为网络兴起初期协议很多、IP协议并不占主导)、而是通过网卡的MAC地址。
2、IP地址指向最终的主机地址、而MAC地址指向下一跳的目标位置。
- ping的本质
发现错误的路由器、向数据包的(通过IP数据包的信息获取)源主机地址发送一个ICMP数据包、并且通过ICMP数据包报告出错的原因。
- 动态分配IP地址
动态主机配置协议(Dynamic Host Configuration Protocol,DHCP),在认定本地子网上有一个DHCP服务器主机或中继主机的前提下,DHCP客户主机向广播地址(通常是255.255.255.255,因为客户主机还不知道自己的IP地址、子网掩码及本子网的受限广播地址)发送自己的请求。
1、单播:点对点的通讯方式
2、广播(IPv4):向所有的主机同时通讯
3、多播(组播):向某些主机同时通讯
4、泛播(IPv6):向任意一些主机中的某一个发起通讯。可以参照负载均衡来理解、我想知道当前时间、10个服务器有资格响应、但最终只有一个离我最近的服务器完成响应。
传输层
在运行在不同主机上的进程提供逻辑通讯的功能、使彼此感觉直接相连
- 套接字(socket)
总是成对出现、是应用层到传输层的门户。
套接字本质上就是操作系统为传输层公开的API、帮助我们组装传输层数据包并交给IP层发送。
套接字(socket)并不单指TCP(长连接)
TCP/IP协议族中包括三种套接字:
1、流式套接字--TCP协议专属
2、数据报套接字--UDP协议专属
3、原始套接字--可以直接访问IP层
- UDP协议--(用户数据报协议(User Datagram Protocol))
不可靠的无连接的数据包传输服务
只负责发送、不保证安全性(确认到达)以及顺序。这点其实和IP协议的本质一样。
- TCP协议--(传输控制协议Transmission Control Protocol))
面向链接的可靠的字节流传输服务。即TCP协议数据包会保证重发、有序还有拥塞控制。确保从发送方发出的数据、按照顺序完整的交付给接收方。
所以、TCP链接需要经历三次握手(双方确认相互可以收发数据)、四次挥手(双方先后申请断开单向链接并被确认)
面向连接的传输服务
-
TCP以连接作为协议数据的最终目标
TCP协议的端口是可以复用。对于TCP协议,要成功建立一个新的链接,需要保证新链接四个要素组合体的唯一性:客户端的IP、客户端的port、服务器端的IP、服务器端的port。也就是说,服务器端的同一个IP和port,可以和同一个客户端的多个不同端口成功建立多个TCP链接(与多个不同的客户端当然也可以),只要保证【Server IP + Server Port + Client IP + Client Port】这个组合唯一不重复即可。 -
UDP以端口作为协议数据的最终目标
UDP协议的端口不可复用。对于UDP协议、是以监听端口作为操作的。而且在协议中、源端口和源IP地址都是可选项。哪怕不填(只制定了目的端口和目的地址)也可以成功发送。 -
TCP协议需要先建立连接、然后才能发送/接收数据
并且需要对很多细节进行协商(最大数据长度、窗口大小、初始序列号等) -
UDP协议直接发送/接收数据
可靠的传输服务
-
TCP协议提供的是可靠的传输服务
以序列号保证有序、以重发机制保证成功发送。 -
UDP协议提供的是不可靠的传输服务
可能会丢失、失序、重复等。
面向字节流的传输服务
- TCP协议是以字节为单位流式传输数据
TCP的传输是无边界的 - UDP协议是以数据块传输数据
UDP的传输是有边界的
TCP应用于UDP应用
- TCP
以可靠传输为基准:FTP、Telnet、http、自建通道。 - UDP
对时效性为基准:实时应用、多播式应用。
使用UDP时应该注意一下几点:
1、应用程序必须自己来保证可靠性。应用程序必须有自己的重发机制、数据失序处理、流量控制等。
2、应用程序必须自己来处理大块数据。发送方对大块数据进行分割、接收方还要进行重组
`QQ就是采用《可靠的UDP》+TCP来实现。其中UDP主要负责通讯、TCP负责最低限度状态的维持。`
影响TCP和UDP选择的最大原因
很多游戏选择UDP而非TCP、并不是因为来回的确认包会浪费资源或者拖慢网速(因为可靠的UDP也需要确认包)、更不是三次握手。
更重要的原因是TCP的阻塞窗口机制会《在发生阻塞时自动减少数据段的发送》、一旦网络发生波动、TCP的这个自宫机制会让应用程序的延迟更高。而在网络恢复后、TCP的慢启动机制也会延缓恢复的时间。
应用层
-
HTTP
HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应、在请求结束后恰当的时候(keep-alive)、会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。 -
HTTP1.0
1、无连接。每次通讯结束会自动释放链接 2、无状态。服务器无法记录用户以前的动作
-
HTTP1.1
1、新头部字段。主机名、身份认证、状态管理和Cache缓存等 2、Connection-Keep-Alive。保持长连接(默认开启--但是服务器通常会偷偷的释放掉连接以节省资源) 3、支持在一次连接中同时发出多个请求。但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容。这也叫做《队首阻塞》。 4、断点续传
-
HTTP2.0
1、多路复用。基于二进制分帧层,HTTP 2.0可以在共享TCP连接的基础上,同时发送请求和响应。HTTP消息被分解为独立的帧,而不破坏消息本身的语义,交错发送出去,最后在另一端根据流ID和首部将它们重新组合起来。 2、头部压缩。更小的头部体积、传输更快
HTTP状态码
1xx(临时响应)、2xx(请求成功)、3xx(重定向)、4xx(客户机错误)、5xx(服务器错误)。
Cookie
服务器通过响应头发送一个用于识别身份的cookie字符串让《客户端保存》、客户端在之后的请求中将该cookie放在请求头中发送。
需要注意的是cookie是不能跨域的、而且https和http共用同一个。
Session
与cookie客户端保存不同、session是由《服务器生成并保存》每个连接者的身份信息(session)。而这个身份信息与客户端的cookie绑定、所以也有人说session是基于cookie实现的。
HTTPS
负责《帮助服务器和客户端在安全的环境下协商出一个秘钥》以《进行加密传输》。
主要用到了三种技术:
1、使用数字证书以及数字签名技术实现服务器公钥认证
2、使用公钥实现在非对称加密状态下协商通信秘钥
3、使用通信秘钥实现对称加密状态下的安全通信
网友评论