zoukankan      html  css  js  c++  java
  • 计算机网络二 ---- 应用层

    1. 运输层通信

    我们知道,网络层的通信虽然通过IP协议能把分组送到目的主机,但这个分组还停留在主机的网络层而没有交付主机中的应用进程。而我们平时上网真正需要通信的是应用进程相互通信,而从运输层的角度看也是如此,端对端的通信是主机中进程之间的通信

    简而言之,网络层为主机之间提供逻辑通信,而运输层为应用进程之间提供端对端的逻辑通信

    而主机中会有很多个应用进程,怎么才能区分每个应用进程?这就需要在运输层使用协议端口号,通常简称为端口

    TCP/IP 的运输层用一个 16 位端口号来标志一个端口(端口号只具有本地意义,而且很多情况个自行修改)。16 位的端口号可允许有 65535 个不同的端口号,这个数目对于一台计算机来说是足够用的。

    由此可见,两个计算机中的进程要互相通信,不仅需要知道对方的 IP 地址,还要知道对方端口号(为了找到指定计算机中的指定进程)。

    运输层要完成通信还需要依靠协议, TCP/IP 运输层的两个主要协议都是互联网的正式标准即:

    (1)用户数据报协议 UDP (User Datagram Protocol)

    (2)传输控制协议 TCP(Transmission Control Protocol)

    2. 用户数据报协议 UDP

    2.1 UDP 概述

    用户数据报协议 UDP 只在 IP 的数据报服务之上增加了很少一点的功能,这就是复用和分用的功能以及差错检测的功能。

    UDP 的主要特点是:

    1. UDP 是无连接的。即发送数据之前不需要建立连接,因此减少了开销和发送数据之前的时延。
    2. UDP 使用尽最大努力交付。即不保证可靠交付,因此主机不需要维持复杂的连接状态表。(但也不保证数据的完整性,可能导致数据丢失。)
    3. UDP 是面向报文的。即对应用层交下来的报文,在添加首部后就向下交付 IP 层。对应用层交下来的报文既不合并也不拆分,而是保留这些报文的边界。接收时也只是取出首部后就向上交付,也就是说 UDP 一次交付一个完整的报文。因此,应用程序必须选择合适大小的报文。否则太大或太小,都会降低 IP 层的效率。
    4. UDP 没有拥塞控制。因此网络出现的拥塞不会影响源主机的发送速率。
    5. UDP 支持一对一、一对多、多对一和多对多的交互通信。
    6. UDP 的首部开销小。只有 8 个字节,比 TCP 的 20 个字节的首部要短。

    2.2 UDP 的首部格式

    用户数据报 UDP 有两个字段:数据字段和首部字段。首部字段很简单,只有 8 个字节,由四个字段组成,每个字段长度都是 2 个字节。各字段意义如下:

    1. 源端口:源端口号。在需要对方回信时选用。不需要时可用全0。
    2. 目的端口:目的端口号。这在终点交付报文时必须要使用到。
    3. 长度: UDP用户数据报的长度,其最小值是8(仅有首部)。
    4. 校验和:检测UDP用户数据报在传输中是否有错。有错就丢弃。

    当运输层从 IP 层收到 UDP 数据报时,就根据首部中的目的端口,把 UDP 数据报通过相应端口上交应用进程。

    如果接收方 UDP 发现收到的报文中的目的端口号不正确,就丢弃该报文,并由网际控制报文协议 ICMP 发送 “端口不可达” 差错报文给发送方。

    【伪首部】

    UDP 的数据报格式中,在数据报首部前面增加源 IP 地址、目的 IP 地址、IP 分组的协议字段、TCP 或 UDP 数据报的总长度等共12字节,所构成的扩展首部结构。此伪首部是一个临时的结构,它既不向上也不向下传递,仅仅只是为了保证可以校验套接字的正确性。

    3. 传输控制协议 TCP

    TCP 协议比较复杂,重点包括可靠传输、流量控制和拥塞控制等。

    TCP 的主要特点是:

    1. TCP 是面向连接的运输层协议。就是说,应用程序在使用 TCP 协议之前,必须先建立TCP 连接。传输完毕后,必须释放 TCP连接。
    2. 每一条 TCP 连接只能有两个端点每一条 TCP 连接只能是点对点的(也就是一对一)。
    3. TCP 提供可靠交付的服务。无差错、不丢失、不重复,并且按序到达。
    4. TCP 提供全双工通信。TCP 允许通信双方的应用在任何时候都能发送数据。
    5. 面向字节流。
  • 相关阅读:
    并查集
    树状数组及二维树状数组
    maven工程编译成jar包
    The Salt Master has rejected this minion's public key!
    salt-minion dead but pid file exists 正确解决方法
    mysql 查找表的auto_increment和修改
    fastjson --JSONObject 和JSONArray 转换
    git 获取当前版本的commitid
    fastjson 使用笔记
    spring IOC 注解@Resource
  • 原文地址:https://www.cnblogs.com/luler/p/14266091.html
Copyright © 2011-2022 走看看