《Linux网络开发必学教程》7_TCP 与 UDP

TCP/IP 分层结构

《Linux网络开发必学教程》7_TCP 与 UDP_第1张图片

  • 应用层:各个应用程序可以定义(使用)各种这样的协议
  • 传输层:确保发出的数据能够达到目标主机,完成数据传输
  • 网络层:填写数据包地址,选择数据传输路径
  • 数据链路层:融合不同连接方式的链路,屏蔽网络差异
  • 物理层:具体连接方式,有线,无线,光纤...

TCP/IP 工作方式

《Linux网络开发必学教程》7_TCP 与 UDP_第2张图片

《Linux网络开发必学教程》7_TCP 与 UDP_第3张图片

TCP/IP层次结构的特点

  • 上层依赖邻接下层的能力,下层只为直接邻接上层服务
  • 上层不知道下层的工作机制,下层不管上层传输的数据内容
  • 不做跨层服务,层次结构中的角色缺一不可

《Linux网络开发必学教程》7_TCP 与 UDP_第4张图片

深入理解网络层(IP层)

  • IP 寻址:IP 地址属于网络层地址,用于标识网络上的主机
  • 路由控制:控制数据如何到达主机(如:需要经过哪些路由器转发)
  • 无连接:数据包根据 IP 地址在网络上传递(无需与目标主机建立连接)
Mac 地址:数据链路层所使用的硬件地址
Mac 地址与网络无关,出厂时写入到网络设备中
当主机从网络上每收到一个数据帧时,首先检查数据中的 MAC 地址。如果是发往本机的数据帧则收下,之后进行其他的处理;否则就将此帧丢弃,不再进行其他的处理。

IP 地址和 MAC 地址

  • IP 地址是动态的,不属于某个具体的硬件 (MAC 地址隶属于具体硬件)
  • IP 地址是网络层使用的地址(用于跨网络投递数据包)
  • MAC 地址是数据链路层使用的地址(用于确定目标网络中接收数据的主机)
  • 路由器中记录了本网络中主机 IP 地址与 MAC 地址的映射关系(ARP协议完成)

IP 路由控制

  • 为了将数据发给目标主机,所有主机都维护着一张路由表
  • 路由表记录了 IP 数据包下一步应该发给哪个路由器

《Linux网络开发必学教程》7_TCP 与 UDP_第5张图片

IP 数据转发

  • IP 包转发用的是 ”尽力服务“ 策略

    • ”尽力服务“ 指 ”会努力“, 但不保证结果
    • 转发时会通过附加信息检查数据合法性,但出现异常不会进行重发
    • 以包为单位进行转发,不保证到达(发出之后,石沉网海)
TCP/IP 网络层次结构是否能提供可靠数据传输?

传输控制协议 (Transmission Control Protocol)

  • TCP 在协议实现上提供可靠数据传输

    • TCP 不存在 ”数据包“ 的概念,实现了流式传输 (数据如流水,无头无尾)
    • TCP 内部有服务状态,能够精确知道数据是否已经发送成功,是否被接收...
    • TCP 在行为上可进行阻塞控制(网络环境变差时,能够调整数据发送速度)

TCP 连接建立

《Linux网络开发必学教程》7_TCP 与 UDP_第6张图片

问:三次交互结束后,建立连接,为什么是三次?
答:防止旧的重复连接引起连接混乱问题
比如在网络环境比较复杂的情况,客户端可能会连续发送多次请求。如果只设计成两次握手的情况,服务端只能一接收请求,然后返回请求信息,也不知道客户端是否请求成功。这些过期请求的话就会造成网络连接的混乱。
所以设计成三次握手的情况,客户端在接收到服务端SEQ+1的返回消息之后,就会知道这个连接是历史连接,所以会发送报文给服务端,告诉服务端。
所以TCP设计成三次握手的目的就是为了避免重复连接。
然后可以设计成四次握手?五次握手?不可以?答案是也是可以的,不过为了节省资源,三次握手就可以符合实际情况,所以就没必要设计成四次握手、五次握手等等情况

《Linux网络开发必学教程》7_TCP 与 UDP_第7张图片

TCP 的天生缺陷 (DDoS攻击)

  • 客户端收到 SYN,ACK 之后,不再回复最后的 ACK 消息
  • 这将导致服务端消耗资源,但并不会实际进行通讯
  • 当多个傀儡客户端同时对服务端进行 ”连接请求“,服务端资源将耗尽

《Linux网络开发必学教程》7_TCP 与 UDP_第8张图片

TCP 连接断开

《Linux网络开发必学教程》7_TCP 与 UDP_第9张图片

问:四次交互结束后,连接断开,为什么是四次?
答:因为TCP是全双工通信的
第一次挥手:当主动方发送断开连接的请求(即FIN报文)给被动方时,仅仅代表主动方不会再发送数据报文了,但主动方仍可以接收数据报文。
第二次挥手:被动方此时有可能还有相应的数据报文需要发送,因此需要先发送ACK报文,告知主动方“我知道你想断开连接的请求了”。这样主动方便不会因为没有收到应答而继续发送断开连接的请求(即FIN报文)
第三次挥手:被动方在处理完数据报文后,便发送给主动方FIN报文;这样可以保证数据通信正常可靠地完成。发送完FIN报文后,被动方进入LAST_ACK阶段(超时等待)。
第四挥手:如果主动方及时发送ACK报文进行连接中断的确认,这时被动方就直接释放连接,进入可用状态。

《Linux网络开发必学教程》7_TCP 与 UDP_第10张图片

UDP 的特点:完全继承网络层工作方式

  • 无需连接,直接指定 IP 地址和端口即可发送数据
  • 监听固定端口,只要有数据,统统接收
  • 不管网络情况,只要有数据统统可发送
  • 不关心数据是否到达

UDP 的使用场合

  • 对数据不敏感,需要实时性的场合(如:直播,实时游戏)
  • 网络环境比较好的场合(如:物联网家居)
  • 需要深度定制协议的场合(如:”不丢包的“UDP协议)

TCP 与 UDP 的区别

  • TCP: 瓶口到嘴上了吗?瓶口到嘴上了吗?瓶口到嘴上了吗?好,给你喝水。
  • UDP:给你给你都给你,我懒得管你喝不喝得到。

《Linux网络开发必学教程》7_TCP 与 UDP_第11张图片

你可能感兴趣的:(clinux网络编程)