赞
踩
目录
TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。
TCP/IP是通讯仪采用了五层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。
如图所示:
每一层的作用和功能如下:
应用层 :负责应用程序间沟通,如简单电子邮件传输( SMTP )、文件传输协议( FTP )、网络远 程访问协议( Telnet )等。我们的网络编程主要就是针对应用层。
传输层 :负责两台主机之间的数据传输。如传输控制协议 (TCP) ,能够确保数据可靠的从源主机发送到目标主机。
网络层 :负责地址管理和路由选择。例如在 IP 协议中,通过 IP 地址来标识一台主机,并通过路由表的方式规划出两台主机之间的数据传输的线路(路由)。路由器( Router )工作在网络层。
数据链路层 :负责设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步 ( 就是说从网线上检测到什么信号算作新帧的开始 ) 、冲突检测 ( 如果检测到冲突就自动重发 ) 、数据差错校验等工 作。有以太网、令牌环网,无线 LAN 等标准。交换机( Switch )工作在数据链路层。
物理层 :负责光 / 电信号的传递方式。比如现在以太网通用的网线 ( 双绞 线 ) 、早期以太网采用的的同轴电缆 ( 现在主要用于有线电视 ) 、光纤,现在的 wifi 无线网使用电磁波等都属于物理层的概念。 物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器( Hub )工作在物理层。
TCP/IP协议每一层中的核心内容如下。
在开发应用程序时,一个大的工作就是进行协议的确定。如果三个程序相互通信,那么就要实现对方协议的编解码工作,于是,大佬就对常用的应用场景做了一些特殊协议并确定下来,形成了标准常见的应用层协议。
协议:约定数据的组织格式
常见的数据组织格式(协议):
①XML
②JSON
③其他协议
传输层协议负责数据能够从发送端传输到接收端。
核心的协议有两个:
①UDP,无连接,不可靠传输,面相数据报,全双工,大小受限
②TCP,有连接,可靠传输,面相字节流,全双工,大小不限
UDP是传输层协议,操作系统负责实现的,用于确定程序的端口号。
上图这样表示是因为排版原因,其实协议的组成是按顺序排列的:
16位源端口号 | 16位目的端口号 | 16位UDP长度 | 16位校验和 | 数据长度 |
在解析数据文件时,先解析16位表示源端口,再解析16位表示目的端口,以此类推。
知道对端的 IP 和端口号就直接进行传输,不需要建立连接;
没有任何安全机制,发送端发送数据报以后,如果因为网络故障该段无法发到对方, UDP 协议层也不会给应用层返回任何错误信息;
应用层交给 UDP 多长的报文, UDP 原样发送,既不会拆分,也不会合并;用 UDP 传输 100 个字节的数据:如果发送端一次发送 100 个字节,那么接收端也必须一次接收 100 个字节;而不能循环接收 10 次, 每次接收 10 个字节。
UDP 只有接收缓冲区,没有发送缓冲区:UDP 没有真正意义上的 发送缓冲区 。发送的数据会直接交给内核,由内核将数据传给网络层协议进行后续的传输动作;UDP 具有接收缓冲区,但是这个接收缓冲区不能保证收到的 UDP 报的顺序和发送 UDP 报的顺序一致;如果缓冲区满了,再到达的 UDP 数据就会被丢弃;UDP 的 socket 既能读,也能写,这个概念叫做 全双工
UDP 协议首部中有一个 16 位的最大长度。也就是说一个 UDP 能传输的数据最大长度是 64K (包含 UDP 首 部)。
URG:紧急指针是否有效
ACK:确认号是否有效
PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走
RST:对方要求重新建立连接;我们把携带RST标识的称为复位报文段
SYN:请求建立连接;我们把携带SYN标识的称为同步报文段
FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段
①确认应答(可靠机制)
一发一收的过程就是确认应答。
举例说明:
由于网络的原因肯出现收发乱序的问题(例如,先收到“滚”消息再受到“好”)
TCP为了解决收发乱序的问题,对每个字节编号,即为序列号。
每一个ACK都带有对应的确认序列号 ,意思是告诉发送者,我已经收到了哪些数据,下一次你从哪里开始法。
继续刚才的例子:
ACK应答 ,已经收到7个字节,下次从第8个字节开始发。
②超时重传(可靠机制)
消息在网络中的传输过程中,经过的设备:
操作系统->网卡->交换机->路由器->其他网络设备
每个设备都有自己的负载能力,如果超出了范围,当前数据包就可以阻塞或丢弃。
超时重传一般有两种情况:
情况1:发送方丢包,由于网络原因,造成数据没有发送成功
情况2:响应超时,主机B接收到了数据,并发出ACK的应答,主机A只是没有接收到应答,即ACK丢包
这种情况下会有一个重复接收(重新发送ACK,直到接收)的问题,那么TCP协议需要能够识别出哪些包是重复的包,并且把重复的丢弃掉。
我们可以利用前面提到的序列号,就很容易做到去重效果。
最理想的情况下,找到一个最小的时间,保证 " 确认应答一定能在这个时间内返回 " 。但是这个时间的长短,随着网络环境的不同,是有差异的。如果超时时间设的太长,会影响整体的重传效率;如果超时时间设的太短,有可能会频繁发送重复的包;
Linux 中( BSD Unix 和 Windows 也是如此),超时以 500ms 为一个单位进行控制,每次判定超时重发的超时时间都是 500ms 的整数倍。如果重发一次之后,仍然得不到应答,等待 2*500ms 后再进行重传。 如果仍然得不到应答,等待 4*500ms 进行重传。依次类推,以指数形式递增。累计到一定的重传次数, TCP 认为网络或者对端主机出现异常,强制关闭连接。
③连接管理(可靠机制)
主机之间作为发送方和接收方在网络通信,必须要确认双方收发数据的能力,其中涉及到建立连接与断开连接的协商过程。
正常情况下,TCP要经过三次握手建立连接,四次挥手断开连接。
1.正常通信之前确认双方能力,✨三次握手的过程。
通过两次SYN和ACK的过程就可以保证双方网络都没有问题。在这个基础上就可以保证收发数据的正常进行。
三次握手是把SYN和ACK合并成一次通信完成,从而提高效率
三次握手还有一个重要功能就是协商序列号是从哪开始的。发送方随机生成一个序列号,ACK对序列号进行加1操作,接收方随机生成一个序列号,ACK再对序列号进行加1操作
2.✨四次挥手(断开的过程)
FIN 客户端发送的断开请求,被服务器接收并应答,服务器就会做一些断开前的准备。
ACK是操作系统实现的TCP协议的应答,第二个FIN,是应用程序级别的,这两个操作之间是有时间差的,大概率不会合并到一起返回,所以定义为四次挥手。
④滑动窗口(效率机制)
数据能过,一收一发的过程,可以保证正常通信,但是效率不高。
滑动窗口本身是一种数据结构,维护窗口的大小,以及已经发送和正在发送的数据块。
可以预见的丢包问题:
情况1:数据包已经抵达,ACK被丢了
这种情况下,部分ACK丢了并不要紧,因为可以通过后序的ACK进行确认。
这就像是,别人问你是什么学历,你说大学本科,这就意味着,小学,初中,高中已经上过了。
情况2:发送方的请求包(数据包)丢了
这种机制被称为“高速重发控制”(也叫“快重传”)
滑动窗口与效率:
⑤流量控制(可靠机制)
- 接收端将自己可以接收的缓冲区大小放入 TCP 首部中的 "窗口大小" 字段,通过ACK端通知发送端;
- 窗口大小字段越大,说明网络的吞吐量越高;
- 接收端一旦发现自己的缓冲区快满了,就会将窗口大小设置成一个更小的值通知给发送端;
- 发送端接受到这个窗口之后,就会减慢自己的发送速度;
- 如果接收端缓冲区满了,就会将窗口置为0;这时发送方不再发送数据,但是需要定期发送一个窗口探测数据段,使接收端把窗口大小告诉发送端。
1.发送与接收缓冲区
每个程序在启动时都会去申请系统资源,发送与接收缓冲区就是申请来的资源。
通过接收方反制发送方对于窗口大小的限制,发送方不能为了提高效率而无限制的扩大窗口大小。
已使用空间与剩余空间都的大小是动态变化的,每次接收方从缓冲区读取数据之后,剩余空间就会变大。
如果接收方的处理能力比较低,可能会出现缓冲区装满的情况。
解决窗口大小问题
⑥拥塞控制(可靠机制)
在每次的通信过程中试探网络的拥堵状态,从而调整窗口的大小。
假设接收端缓冲区为 1M 。一次收到了 500K 的数据;如果立刻应答,返回的窗口就是 500K ;但实际上可能处理端处理的速度很快, 10ms 之内就把 500K 数据从缓冲区消费掉了;在这种情况下,接收端处理还远没有达到自己的极限,即使窗口再放大一些,也能处理过来;如果接收端稍微等一会再应答,比如等待 200ms 再应答,那么这个时候返回的窗口大小就是1M ;
⑧捎带应答(效率机制)
由于延迟应答的存在,可能存在SYN报文和ACK报文同时发送的情况,那么系统就会把两个报文合二为一。
⑨面向字节流
类似于这种不能有效区分消息边界的现象叫做“粘包问题”。
解决粘包问题:
1.在消息的末尾加上特殊的分隔符来标识消息结束
2.使用一个专门用来描述消息体长度的字段,来标识消息体的长度
JSON,用大括号包裹消息体,,那么就可以理解为它是使用大括号作为特殊字符来表示消息结尾的
HTTP,应用层的协议,即使用了分隔符也使用了表示消息长度的字段解决粘包问题
⑩TCP异常情况
1.程序崩溃
操作系统会回收进程的资源,其中释放包括文件描述符表,就相当于调用了对应socket的close,之后出发FIN操作,进而开始进行四次挥手,和普通的四次挥手没有区别。
2.正常关机
通过开始菜单或执行关机命令,系统会强制结束所有进程,回收资源,与系统崩溃流程类似
3.主机掉电
①接收方掉电
②发送方掉电
4.网络断开
与主机掉电情况相同,只不过主机是正常工作的
协议格式:
补充:
1.
2.
3.
IPv4
总长是32位,最多可以表示42亿个地址
1.动态分配
设置上网的时候才获取一个IP,下线时就会被收回,一个IP只能同时表示一台主机
2.NET机制
一个子网中的所有机器,共用一个公网IP(不能重复)地址,子网里的机器分配内网IP(不同的子网中时可以重复的)
3.分配置方式
IPv6
IPv4是用4个字节,也就是32位来表示IP地址,约等于42亿
IPv6是用16个字节,也就是128位来表示IP地址,约等于42亿*42亿*42亿*42亿
注意:IPv4和IPv6不兼容.
以太网格式
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。