C++知识点---计算机网络
以下内容大部分整理自网络
OSI七层模型和TCP/IP四层模型
OSI七层模型及其包含的协议如下:
<->物理层: 通过媒介传输比特,确定机械及电气规范,传输单位为bit,主要包括的协议为:IEE802.3(中继器,集线器)、CLOCK RJ45。
<->数据链路层: 将比特组装成帧和点到点的传递,传输单位为帧,主要包括的协议为MAC(网桥,交换机)、VLAN、PPP。
<->网络层:负责数据包从源到宿的传递和网际互连,传输单位为包,主要包括的协议为IP、ARP、ICMP、IGRP(路由器)。
<->传输层:提供端到端的可靠报文传递和错误恢复,传输单位为报文,主要包括的协议为TCP、UDP、SPX。
<->会话层:建立、管理和终止会话,传输单位为SPDU,主要包括的协议为RPC,SQL。
<->表示层: 对数据进行翻译、加密和压缩,传输单位为PPDU,主要包括的协议为、JPEG、GIF、ASCII。
<->应用层: 允许访问OSI环境的手段,传输单位为APDU,主要包括的协议为FTP HTTP、TFTP、SMTP、Telnet。
TCP/IP 4层模型包括:
网络接口层:MAC VLAN
网络层:IP ARP ICMP
传输层:TCP UDP
应用层:HTTP DNS SMTP
● 请你说说TCP/IP数据链路层的交互过程
网络层等在数据链路层用MAC地址作为通信目标,数据包到达网络层等往数据链路层发送的时候,首先回去ARP缓存表去查找ip对应的MAC地址,如果查到了,就将此ip对应的MAC地址封装到链路层数据包的包头。如果缓存中没有找到,则会发起一个广播,who is ip xxx tell ip xxxx,所有收到广播的机器看到这个ip是不是自己的,如果是自己的,则以单播的形式将自己的mac地址回复给请求机器。
TCP 与 UDP 的区别
- TCP 面向连接,UDP 是无连接的;
- TCP 提供可靠的服务,也就是说,通过 TCP 连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP 尽最大努力交付,即不保证可靠交付
- TCP 的逻辑通信信道是全双工的可靠信道;UDP 则是不可靠信道
- 每一条 TCP 连接只能是点到点的;UDP 支持一对一,一对多,多对一和多对多的交互通信
- TCP 面向字节流(可能出现黏包问题),实际上是 TCP 把数据看成一连串无结构的字节流;UDP 是面向报文的(不会出现黏包问题)
- UDP 没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如 IP 电话,实时视频会议等)
- TCP 首部开销20字节;UDP 的首部开销小,只有 8 个字节
● TCP和UDP适用场景
从特点上我们已经知道,TCP 是可靠的但传输速度慢,UDP 是不可靠的但传输速度快。因此在选用具体协议通信时,应该根据通信数据的要求而决定。
- 若通信数据完整性需让位与通信实时性,则应该选用TCP 协议(如文件传输、重要状态的更新等);
- 反之,则使用 UDP 协议(如视频传输、实时通信等)。
● TCP 黏包问题
原因:TCP 是一个基于字节流的传输服务(UDP 基于报文的),“流” 意味着 TCP
所传输的数据是没有边界的。所以可能会出现两个数据包黏在一起的情况。
解决:
- 发送定长包。如果每个消息的大小都是一样的,那么在接收对等方只要累计接收数据,直到数据等于一个定长的数值就将它作为一个消息。
- 包头加上包体长度。包头是定长的 4 个字节,说明了包体的长度。接收对等方先接收包头长度,依据包头长度来接收包体。
- 在数据包之间设置边界,如添加特殊符号 \r\n 标记。FTP 协议正是这么做的。但问题在于如果数据正文中也含有\r\n,则会误判为消息的边界。
- 使用更加复杂的应用层协议。
请你说说传递到IP层怎么知道报文该给哪个应用程序,它怎么区分UDP报文还是TCP报文
根据端口区分; 看ip头中的协议标识字段,17是udp,16是tcp
请问TCP用了哪些措施保证其可靠性
1、序列号、确认应答、超时重传
数据到达接收方,接收方需要发出一个确认应答,表示已经收到该数据段,并且确认序号会说明了 它下一次需要接收的数据序列号。如果发送发迟迟未收到确认应答,那么可能是发送的数据丢失, 也可能是确认应答丢失,这时发送方在等待一定时间后会进行重传。这个时间一般是2*RTT(报文段 往返时间)+ 一个偏差值。
2、窗口控制与高速重