1.组(多)播(udp)
理论
● 单播方式只能发给一个接收方。
● 广播方式发给所有的主机。过多的广播会大量占用网络带宽,造成广播风暴,影响正常的通信。
● 多播是一个人发送,加入到多播组的人接收数据。
● 多播方式既可以发给多个主机,又能避免像广播那样带来过多的负载(每台主机要到传输层才能判断广播包是否要处理)
- D类:224.0.0.0-239.255.255.255
发送者
- 创建数据报套接字
- 指定网络信息(接收者)
- 发送消息
- 关闭套接字
接收者
- 创建数据报套接字
- 设置多播属性,将自己的IP加入到多播组中。
- 指定网络信息(接收者)
- 绑定套接字
- 接收消息
- 关闭套接字
2.本地套接字
特性
- socket同样可以用于本地间进程通信,创建套接字时使用本地协议AF_LOCAL或AF_UNIX
- 分为流式套接字和数据报套接字
- 和其他进程间通信相比使用方便、效率更高,常用于前后台进程通信。
流程(tcp为例)
客户端
- socket()
- struct sockaddr_un
- connect
- send
- close
服务器
- socket()
- struct sockaddr_un
- bind
- listen
- accept
- recv
- close
3.网络协议头分析
数据的封装与传递过程
思考:
1. 应用层调用send后,是如何把数据发送到另一台机器的某个进程的。
2. 接收的设备收到数据包后,如何处理给应用层?
思考:在协议栈封装的过程中,这些头部信息具体有什么呢?
以太网帧完整帧
● 对于网络层最大数据帧长度是1500字节
● 对于链路层最大数据长度是1518字节(1500+14+CRC)
● 发送时候,IP层协议栈程序检测到发送数据和包头总长度超过1500字节时候,会进行自动分包处理,接收端在IP层进行包重组,然后才继续往上传递
以太网头部
IP头
IHL:数据流控控制
TCP头
Src: 源
Dst:目标
Seq:序列号
Ack:应答号(应答包的应答号)
数据包:
A:ACK:应答包
S:SYN:握手包(同步包),连接时产生
P:PSH:(PUSH)数据包,传输数据产生
F:FIN:挥手包,断开连接时产生
UDP头
length:固定udp数据包的长度(确保udp在传输的过程中不会粘包)
UDP不会造成粘包和拆包, TCP不会造成丢包
UDP是基于数据报文发送的,每次发送的数据包,在UDP的头部都会有固定的长度, 所以应用层能很好的将数据包分隔开, 不会造成粘包。
UDP不会造成拆包, 但会出现拆包, 这个拆包是在网络层的IP头进行的拆包(判断MTU)。
TCP是基于字节流的, 每次发送的数据报,在TCP的头部没有固定的长度限制,也就是没有边界,那么很容易在传输数据时,把多个数据包当作一个数据报去发送,成为了粘包,或者传输数据时, 要发送的数据大于发送缓存区的大小,或者要发送的数据大于最大报文长度, 就会拆包;
TCP不会丢包,因为TCP一旦丢包,将会重新发送数据包。(超时/错误重传)
为什么UDP会造成丢包:
UDP通信没有发送缓存区, 它不保证数据的可靠性。因此,UDP通信是将数据尽快发送出去,不关心数据是否到达目标主机. 但是UDP有接受缓存区, 因为数据发送过快, 如果接收缓存区内数据已满, 则继续发送数据, 可能会出现丢包。
丢包出现原因: 接收缓存区满 网络拥堵, 传输错误