TCP/IP 分层结构
- 应用层:各个应用程序可以定义(使用)各种这样的协议
- 传输层:确保发出的数据能够达到目标主机,完成数据传输
- 网络层:填写数据包地址,选择数据传输路径
- 数据链路层:融合不同连接方式的链路,屏蔽网络差异
- 物理层:具体连接方式,有线,无线,光纤...
TCP/IP 工作方式
TCP/IP层次结构的特点
- 上层依赖邻接下层的能力,下层只为直接邻接上层服务
- 上层不知道下层的工作机制,下层不管上层传输的数据内容
- 不做跨层服务,层次结构中的角色缺一不可
深入理解网络层(IP层)
- IP 寻址:IP 地址属于网络层地址,用于标识网络上的主机
- 路由控制:控制数据如何到达主机(如:需要经过哪些路由器转发)
- 无连接:数据包根据 IP 地址在网络上传递(无需与目标主机建立连接)
Mac 地址:数据链路层所使用的硬件地址
Mac 地址与网络无关,出厂时写入到网络设备中
当主机从网络上每收到一个数据帧时,首先检查数据中的 MAC 地址。如果是发往本机的数据帧则收下,之后进行其他的处理;否则就将此帧丢弃,不再进行其他的处理。
IP 地址和 MAC 地址
- IP 地址是动态的,不属于某个具体的硬件 (MAC 地址隶属于具体硬件)
- IP 地址是网络层使用的地址(用于跨网络投递数据包)
- MAC 地址是数据链路层使用的地址(用于确定目标网络中接收数据的主机)
- 路由器中记录了本网络中主机 IP 地址与 MAC 地址的映射关系(ARP协议完成)
IP 路由控制
- 为了将数据发给目标主机,所有主机都维护着一张路由表
- 路由表记录了 IP 数据包下一步应该发给哪个路由器
IP 数据转发
IP 包转发用的是 ”尽力服务“ 策略
- ”尽力服务“ 指 ”会努力“, 但不保证结果
- 转发时会通过附加信息检查数据合法性,但出现异常不会进行重发
- 以包为单位进行转发,不保证到达(发出之后,石沉网海)
TCP/IP 网络层次结构是否能提供可靠数据传输?
传输控制协议 (Transmission Control Protocol)
TCP 在协议实现上提供可靠数据传输
- TCP 不存在 ”数据包“ 的概念,实现了流式传输 (数据如流水,无头无尾)
- TCP 内部有服务状态,能够精确知道数据是否已经发送成功,是否被接收...
- TCP 在行为上可进行阻塞控制(网络环境变差时,能够调整数据发送速度)
TCP 连接建立
https://www.bilibili.com/vide...
问:三次交互结束后,建立连接,为什么是三次?
答:防止旧的重复连接引起连接混乱问题
比如在网络环境比较复杂的情况,客户端可能会连续发送多次请求。如果只设计成两次握手的情况,服务端只能一接收请求,然后返回请求信息,也不知道客户端是否请求成功。这些过期请求的话就会造成网络连接的混乱。
所以设计成三次握手的情况,客户端在接收到服务端SEQ+1的返回消息之后,就会知道这个连接是历史连接,所以会发送报文给服务端,告诉服务端。
所以TCP设计成三次握手的目的就是为了避免重复连接。
然后可以设计成四次握手?五次握手?不可以?答案是也是可以的,不过为了节省资源,三次握手就可以符合实际情况,所以就没必要设计成四次握手、五次握手等等情况
TCP 的天生缺陷 (DDoS攻击)
- 客户端收到
SYN,ACK
之后,不再回复最后的ACK
消息 - 这将导致服务端消耗资源,但并不会实际进行通讯
- 当多个傀儡客户端同时对服务端进行 ”连接请求“,服务端资源将耗尽
TCP 连接断开
问:四次交互结束后,连接断开,为什么是四次?
答:因为TCP是全双工通信的
第一次挥手:当主动方发送断开连接的请求(即FIN报文)给被动方时,仅仅代表主动方不会再发送数据报文了,但主动方仍可以接收数据报文。
第二次挥手:被动方此时有可能还有相应的数据报文需要发送,因此需要先发送ACK报文,告知主动方“我知道你想断开连接的请求了”。这样主动方便不会因为没有收到应答而继续发送断开连接的请求(即FIN报文)
第三次挥手:被动方在处理完数据报文后,便发送给主动方FIN报文;这样可以保证数据通信正常可靠地完成。发送完FIN报文后,被动方进入LAST_ACK阶段(超时等待)。
第四挥手:如果主动方及时发送ACK报文进行连接中断的确认,这时被动方就直接释放连接,进入可用状态。
UDP 的特点:完全继承网络层工作方式
- 无需连接,直接指定 IP 地址和端口即可发送数据
- 监听固定端口,只要有数据,统统接收
- 不管网络情况,只要有数据统统可发送
- 不关心数据是否到达
UDP 的使用场合
- 对数据不敏感,需要实时性的场合(如:直播,实时游戏)
- 网络环境比较好的场合(如:物联网家居)
- 需要深度定制协议的场合(如:”不丢包的“UDP协议)
TCP 与 UDP 的区别
- TCP: 瓶口到嘴上了吗?瓶口到嘴上了吗?瓶口到嘴上了吗?好,给你喝水。
- UDP:给你给你都给你,我懒得管你喝不喝得到。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。