OSI七层模型和TCP/IP协议四层模式
层次(level): 模块
应用层: 负责应用协议
传输层: 规定数据在网络中是怎样传输的
TCP: Transport Control Protocol传输控制协议,是一种面向连接的传输层协议。
在通信之前要先建立连接 ==> "三次握手"
它能提供高可靠性通信(即数据无误,数据无丢失,数据无失序,数据无重复)
UDP: User Datagram Protocol 用户数据协议
不需要连接,也没有握手
是不可靠的无连接的协议,在数据发送前,因为不需要进行连接,所以可以进行
高效的数据传输。
网络层: IP协议,给每一台联网的主机分配一个逻辑上的地址(编号)。
网络接口层: 网卡以及网卡驱动,MAC地址(网卡物理地址)以及数据传输信道。
封装和拆包
网络数据在两台主机之间到底是怎样传输的呢?
因特网(互联网)地址(IP地址)
互联网上的每个接口(网卡)必须有一个唯一的internet地址(也称为IP地址)
它是协议上的一个逻辑地址。IPV4 协议规定一个IP地址用一个无符号的32bits的整数来表示。也就是说有2^32个地址。
那么这么多的地址,如何去管理呢?
类似像日常生活中的座机号码,分"区号"和"主机号"
IP地址也分为两个部分: 网络号 和 主机号
网络号:属于哪一个网络,不同网络里的主机不能直接通信。
主机号: 某个网络里的主机的编号(也叫子网主机号)。
端口号
TCP和UDP都是采用无符号16bits的端口号来识别不同的应用程序的。
IP地址只能唯一标识网络中的主机,但每台主机上并不是只跑一个网络应用程序,
它可以跑多个网络应用程序,而且网络应用从传输层来看可以分为TCP应用和UDP应用。
所以为了区分这些不同的网络应用,故提出了端口号的概念。
字节序
在CPU内部数据是存放在寄存器(16bits,32bits,64bits)中,分高bit位和低bit位
但是内存却是按字节来编号的, 0x3000800,0x3000801
那么如果一个寄存器的数据要存放到内存中,该怎么存放呢?
1) 大端(Big-Endian)模式: 数据的高字节存放在内存的低地址存储单元
2) 小端(Little-Endian)模式: 数据的低字节存放到内存的低地址存储单元
我们怎么知道我们自己的处理器采用的是大端模式还是小端模式呢?
网络字节序:
网络字节序规定发送到网络上的数据统一采用大端模式的字节序。
网络通信是在不同的主机之间进行通信,但我们发送一个整数的时候,如果都采用自己的字节序
去处理就发生问题。
因此所有的主机在进行网络通信时,都必须采用网络字节序。
socket
socket 即套接字文件,是一种网络编程接口,一种特殊的文件描述符,并不限于TCP/IP协议。
独立于具体协议栈的网络编程接口,位于应用层与传输层之间。
socket 类型:
(1)SOCK_STREAM: 流式套接字
主要针对的是 TCP传输层协议
(2)SOCK_DGRAM: 数据报套接字
主要针对的是 UDP传输层协议
(3)SOCK_RAW: 原始套接字
直接跳过传输层
UDP与TCP的区别
UDP | TCP | |
是否连接 | 无连接 | 面向连接 |
是否可靠 | 不可靠传输,不使用流量控制和拥塞控制 | 可靠传输,使用流量控制和拥塞控制 |
连接对象个数 | 支持一对一,一对多,多对一和多对多交互通信 | 只能是一对一通信 |
传输方式 | 面向报文 | 面向字节流 |
首部开销 | 首部开销小,仅8字节 | 首部最小20字节,最大60字节 |
适用场景 | 适用于实时应用(IP电话、视频会议、直播等) | 适用于要求可靠传输的应用,例如文件传输 |