http digest

2023-05-16

HTTP digest

摘要访问认证是一种协议规定的Web服务器用来同网页浏览器进行认证信息协商的方法。它在密码发出前,先对其应用哈希函数,这相对于HTTP基本认证发送明文而言,更安全。
从技术上讲,摘要认证是使用随机数来阻止进行密码分析的MD5加密哈希函数应用。它使用HTTP协议。

图片来自 unsplash.com

HTTP认证方式

  • Basic authentication
  • Digest authentication
  • WSSE(WS-Security) HTTP authentication
  • token Authentication
  • OAuth1.0 Authentication
  • OAuth2.0 Authentication
  • Kerberos
  • NTLM
  • Hawk Authentication
  • AWS Signature
  • https

今天主要科普的是digest认证,其他的认证我也不太熟悉.

http基本认证和digest认证

基本流程都是如下:

a.客户端发起GET请求
b.服务器响应401 Unauthorized,WWW-Authenticate指定认证算法,realm指定安全域
c.客户端重新发起请求,Authorization指定用户名和密码信息
d.服务器认证成功,响应200,可选Authentication-Info

basic和digest的区别如下:
  1. basic

将“用户名:密码”打包并采用Base-64编码。(提示:base64是可以直接解码的)
缺点:密码很容易被窥探,可以挟持编码后的用户名、密码信息,然后发给服务器进行认证;可以与SSL配合,隐藏用户名密码。

  1. digest

不以明文发送密码,在上述第2步时服务器响应返回随机字符串nonce,而客户端发送响应摘要 =MD5(HA1:nonce:HA2),其中HA1=MD5(username:realm:password),HA2=MD5(method:digestURI)
在HTTP 摘要认证中使用 MD5 加密是为了达成"不可逆的",也就是说,当输出已知的时候,确定原始的输入应该是相当困难的。
如果密码本身太过简单,也许可以通过尝试所有可能的输入来找到对应的输出(穷举攻击),甚至可以通过字典或者适当的查找表加快查找速度。

digest中一些参数介绍

username: 用户名(网站定义)
password: 密码
realm: 服务器返回的realm,一般是域名
method: 请求的方法
nonce: 服务器发给客户端的随机的字符串
nc(nonceCount):请求的次数,用于标记,计数,防止重放攻击
cnonce(clinetNonce): 客户端发送给服务器的随机字符串
qop: 保护质量参数,一般是auth,或auth-int,这会影响摘要的算法
uri: 请求的uri(只是path)
response: 客户端根据算法算出的摘要值

digest的算法:

A1 = username:realm:password
A2 = mthod:uri

HA1 = MD5(A1)
如果 qop 值为“auth”或未指定,那么 HA2 为
HA2 = MD5(A2)=MD5(method:uri)
如果 qop 值为“auth-int”,那么 HA2 为
HA2 = MD5(A2)=MD5(method:uri:MD5(entityBody))

如果 qop 值为“auth”或“auth-int”,那么如下计算 response:
response = MD5(HA1:nonce:nc:cnonce:qop:HA2)

如果 qop 未指定,那么如下计算 response:
response = MD5(HA1:nonce:HA2)
上面的算法,是不是把你绕晕了,下面,用实例介绍一下,便于你的理解

客户端请求 (无认证)

Host: localhost```

**服务器响应**

HTTP/1.0 401 Unauthorized
Server: HTTPd/0.9
Date: Sun, 10 Apr 2005 20:26:47 GMT
WWW-Authenticate: Digest realm="testrealm@host.com",
qop="auth,auth-int",
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
opaque="5ccc069c403ebaf9f0171e9517f40e41"
Content-Type: text/html
Content-Length: 311

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<HTML>
<HEAD>
<TITLE>Error</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">
</HEAD>
<BODY><H1>401 Unauthorized.</H1></BODY>
</HTML>```

客户端请求 (用户名 "Mufasa", 密码 "Circle Of Life")

GET /dir/index.html HTTP/1.0
Host: localhost
Authorization: Digest username="Mufasa",
                     realm="testrealm@host.com",
                     nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
                     uri="/dir/index.html",
                     qop=auth,
                     nc=00000001,
                     cnonce="0a4f113b",
                     response="6629fae49393a05397450978507c4ef1",
                     opaque="5ccc069c403ebaf9f0171e9517f40e41"

服务器响应

HTTP/1.0 200 OK
Server: HTTPd/0.9
Date: Sun, 10 Apr 2005 20:27:03 GMT
Content-Type: text/html
Content-Length: 7984

如下所述,response 值由三步计算而成。当多个数值合并的时候,使用冒号作为分割符。

  1. 对用户名、认证域(realm)以及密码的合并值计算 MD5 哈希值,结果称为 HA1。
  2. 对HTTP方法以及URI的摘要的合并值计算 MD5 哈希值,例如,"GET" 和 "/dir/index.html",结果称为 HA2。
  3. 对 HA1、服务器密码随机数(nonce)、请求计数(nc)、客户端密码随机数(cnonce)、保护质量(qop)以及 HA2 的合并值计算 MD5 哈希值。结果即为客户端提供的 response 值。

因为服务器拥有与客户端同样的信息,因此服务器可以进行同样的计算,以验证客户端提交的 response 值的正确性。在上面给出的例子中,结果是如下计算的。 (MD5()表示用于计算 MD5 哈希值的函数;“\”表示接下一行;引号并不参与计算)
根据上面的算法所给出的示例,将在每步得出如下结果。

    HA1 = MD5( "Mufasa:testrealm@host.com:Circle Of Life" )
       = 939e7578ed9e3c518a452acee763bce9

   HA2 = MD5( "GET:/dir/index.html" )
       = 39aff3a2bab6126f332b942af96d3366

   Response = MD5( "939e7578ed9e3c518a452acee763bce9:\
                    dcd98b7102dd2f0e8b11d0f600bfb0c093:\
                    00000001:0a4f113b:auth:\
                    39aff3a2bab6126f332b942af96d3366" )
            = 6629fae49393a05397450978507c4ef1

此时客户端可以提交一个新的请求,重复使用服务器密码随机数(nonce)(服务器仅在每次“401”响应后发行新的nonce),但是提供新的客户端密码随机数(cnonce)。在后续的请求中,十六进制请求计数器(nc)必须比前一次使用的时候要大,否则攻击者可以简单的使用同样的认证信息重放老的请求。由服务器来确保在每个发出的密码随机数nonce时,计数器是在增加的,并拒绝掉任何错误的请求。显然,改变HTTP方法和/或计数器数值都会导致不同的 response 值。
服务器应当记住最近所生成的服务器密码随机数nonce的值。也可以在发行每一个密码随机数nonce后,记住过一段时间让它们过期。如果客户端使用了一个过期的值,服务器应该响应“401”状态号,并且在认证头中添加stale=TRUE,表明客户端应当使用新提供的服务器密码随机数nonce重发请求,而不必提示用户其它用户名和口令。
服务器不需要保存任何过期的密码随机数,它可以简单的认为所有不认识的数值都是过期的。服务器也可以只允许每一个服务器密码随机数nonce使用一次,当然,这样就会迫使客户端在发送每个请求的时候重复认证过程。需要注意的是,在生成后立刻过期服务器密码随机数nonce是不行的,因为客户端将没有任何机会来使用这个nonce。

______________________________________

眼睛休息一下

放松一下

php客户端的实现

下面是用php实现生成digest认证的头部信息的函数

     * @param $params 传递的参数是一个数组,包含key:url,username,password,realm,method,cnonce,nc
     * @return array返回的数组包含Authorization: Digest所需的所有数据
     */
    protected function _gen_digest_auth_header_param($params) {
        $url = $params['url'];
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, TRUE);
        curl_setopt($ch, CURLOPT_NOBODY, FALSE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE);
        curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
        curl_setopt($ch, CURLOPT_TIMEOUT, 120);
        $result = curl_exec($ch);
        if(curl_getinfo($ch, CURLINFO_HTTP_CODE) == '401') {
            $raw = explode(PHP_EOL,$result);
            foreach ($raw as $value) {
                if(explode(': ',$value)[0] == 'WWW-Authenticate') {
                    $all = explode(': ',$value)[1];
                    $all = str_replace('"','',$all);
                    $all = trim($all);
                    $all = explode('Digest ',$all)[1];
                    $auth = str_replace(', ','&',$all);
                    parse_str($auth,$digest);
                    break;
                }
            }
        } else {
            return array();
        }
        $c = explode('/',$url,4)[3];
        $d = '/'.$c;
        $digest['uri'] = $d;
        $data = array_merge($digest,$params);
        $HA1 = md5($data['username'].':'.$data['realm'].':'.$data['password']);
        $HA2 = md5($data['method'].':'.$data['uri']);
        $response = md5($HA1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$HA2);
        $data['response'] = $response;
        return $data;
    }
 // 传给函数的参数格式如下:
         $params = array(
            'username' => $username,
            'password' => $password,
            'nc' => '00000015',
            'method' => 'GET',
            'cnonce' => 'noasgnsijhretrkksanmlghnebitb',
            'opaque' => '',
            'url'   => $url
        );

php的服务器实现方式

$realm = 'Restricted area';

//user => password
$users = array('admin' => 'mypass', 'guest' => 'guest');


if (empty($_SERVER['PHP_AUTH_DIGEST'])) {
    header('HTTP/1.1 401 Unauthorized');
    header('WWW-Authenticate: Digest realm="'.$realm.
           '" qop="auth" nonce="'.uniqid().'" opaque="'.md5($realm).'"');

    die('Text to send if user hits Cancel button');
}


// analyze the PHP_AUTH_DIGEST variable
if (!($data = http_digest_parse($_SERVER['PHP_AUTH_DIGEST'])) ||
    !isset($users[$data['username']]))
    die('Wrong Credentials!');


// generate the valid response
$A1 = md5($data['username'] . ':' . $realm . ':' . $users[$data['username']]);
$A2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']);
$valid_response = md5($A1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2);

if ($data['response'] != $valid_response)
    die('Wrong Credentials!');

// ok, valid username & password
echo 'Your are logged in as: ' . $data['username'];


// function to parse the http auth header
function http_digest_parse($txt)
{
    // protect against missing data
    $needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1);
    $data = array();

    preg_match_all('@(\w+)=([\'"]?)([a-zA-Z0-9=./\_-]+)\2@', $txt, $matches, PREG_SET_ORDER);

    foreach ($matches as $m) {
        $data[$m[1]] = $m[3];
        unset($needed_parts[$m[1]]);
    }

    return $needed_parts ? false : $data;
}
?>

______________________________________

python实现的方法:

    from requests.auth import HTTPDigestAuth
    url = 'http://httpbin.org/digest-auth/auth/user/pass'
    response = requests.get(url, auth=HTTPDigestAuth('user', 'pass'))```


上面获取请求的内容,可以使用response.content,response.text等等
response的方法有

['attrs', 'bool', 'class', 'delattr', 'dict', 'doc', 'format', 'getattribute', 'getstate', 'hash', 'init',
'iter', 'module', 'new', 'nonzero', 'reduce', 'reduce_ex', 'repr', 'setattr', 'setstate', 'sizeof', 'str',
'subclasshook', 'weakref', '_content', '_content_consumed', 'apparent_encoding', 'close', 'connection', 'content', 'cookies', 'elapsed', 'encod
ing', 'headers', 'history', 'is_permanent_redirect', 'is_redirect', 'iter_content', 'iter_lines', 'json', 'links', 'ok', 'raise_for_status', 'raw', 're
ason', 'request', 'status_code', 'text', 'url']


下面,我带你们阅读一下源码:
```language
class HTTPDigestAuth(AuthBase):
    """Attaches HTTP Digest Authentication to the given Request object."""

    def __init__(self, username, password):  # 初始化,参数用户名和密码
        self.username = username
        self.password = password
        self.last_nonce = ''
        self.nonce_count = 0  # digest中的nc
        self.chal = {}
        self.pos = None

    # 构建认证的http请求头
    def build_digest_header(self, method, url):

        realm = self.chal['realm']  # 服务器返回的realm,一般是域名的格式
        nonce = self.chal['nonce']  # 随机数
        qop = self.chal.get('qop')  # 保护质量参数,是auth或auth-int
        algorithm = self.chal.get('algorithm')  # 摘要算法
        opaque = self.chal.get(
            'opaque')  # opaque是个字符串,它只是透传而已,即客户端还会原样返回过来。实际上,上面的那些域,客户端都还是会原样返回的,但返回时除了以上的那些域之外,还会增加新的内容进来。

        # 下面开始区分不同算法
        if algorithm is None:
            _algorithm = 'MD5'
        else:
            _algorithm = algorithm.upper()
        # lambdas assume digest modules are imported at the top level
        if _algorithm == 'MD5' or _algorithm == 'MD5-SESS':
            def md5_utf8(x):
                if isinstance(x, str):
                    x = x.encode('utf-8')
                return hashlib.md5(x).hexdigest()  # 算出摘要值并返回

            hash_utf8 = md5_utf8
        elif _algorithm == 'SHA':
            def sha_utf8(x):
                if isinstance(x, str):
                    x = x.encode('utf-8')
                return hashlib.sha1(x).hexdigest()

            hash_utf8 = sha_utf8

        KD = lambda s, d: hash_utf8("%s:%s" % (s, d))

        if hash_utf8 is None:
            return None

        # XXX not implemented yet
        entdig = None
        p_parsed = urlparse(url)  # 解析url,请求头中参数url是不包含前面主机
        path = p_parsed.path
        if p_parsed.query:
            path += '?' + p_parsed.query

        # 构造 A1,A2,下面开始按http digest算法计算出返回值response
        A1 = '%s:%s:%s' % (self.username, realm, self.password)
        A2 = '%s:%s' % (method, path)

        HA1 = hash_utf8(A1)
        HA2 = hash_utf8(A2)
        # 未完,下面还要将HA1和HA2连在一起再进行一次摘要计算

        # nc的值
        if nonce == self.last_nonce:
            self.nonce_count += 1
        else:
            self.nonce_count = 1
        ncvalue = '%08x' % self.nonce_count
        s = str(self.nonce_count).encode('utf-8')

        # 客户端的随机字符,这里是使用时间+随机值,再hash计算,取得16位的随机字符串
        s += nonce.encode('utf-8')
        s += time.ctime().encode('utf-8')
        s += os.urandom(8)
        cnonce = (hashlib.sha1(s).hexdigest()[:16])

        # 下面开始进行最后一次的摘要计算,有区分摘要算法
        noncebit = "%s:%s:%s:%s:%s" % (nonce, ncvalue, cnonce, qop, HA2)
        if _algorithm == 'MD5-SESS':
            HA1 = hash_utf8('%s:%s:%s' % (HA1, nonce, cnonce))

        if qop is None:
            respdig = KD(HA1, "%s:%s" % (nonce, HA2))
        elif qop == 'auth' or 'auth' in qop.split(','):
            respdig = KD(HA1, noncebit)
        else:
            # XXX handle auth-int.
            return None

        # 上面的respdig就是提交给服务器的response

        self.last_nonce = nonce

        # XXX should the partial digests be encoded too?
        # 下面是放在http头中的请求信息,格式 "Authorization: Digest base"
        base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \
               'response="%s"' % (self.username, realm, nonce, path, respdig)
        if opaque:
            base += ', opaque="%s"' % opaque
        if algorithm:
            base += ', algorithm="%s"' % algorithm
        if entdig:
            base += ', digest="%s"' % entdig
        if qop:
            base += ', qop="auth", nc=%s, cnonce="%s"' % (ncvalue, cnonce)

        return 'Digest %s' % (base)

    # 一般没有加请求头认证信息时,请求服务器,会返回 401 HTTP Status 401 - Unauthorized,但是头部会返回服务器的认证信息
    def handle_401(self, r, **kwargs):
        """Takes the given response and tries digest-auth, if needed."""

        if self.pos is not None:
            # Rewind the file position indicator of the body to where
            # it was to resend the request.
            r.request.body.seek(self.pos)
        num_401_calls = getattr(self, 'num_401_calls', 1)

        # 获取认证的头部信息,格式是WWW-Authenticate →Digest realm="api.ruoyu.com", qop="auth", nonce="MTQ4MTUzMzcwNjM5ODpjYjQ5N2MwNjYyMmM4Y2JkZDM0NzI0ZDZhY2U2YTk4Yw=="
        s_auth = r.headers.get('www-authenticate', '')

        if 'digest' in s_auth.lower() and num_401_calls < 2:
            setattr(self, 'num_401_calls', num_401_calls + 1)
            pat = re.compile(r'digest ', flags=re.IGNORECASE)
            self.chal = parse_dict_header(pat.sub('', s_auth, count=1))

            # Consume content and release the original connection
            # to allow our new request to reuse the same one.
            r.content
            r.raw.release_conn()
            prep = r.request.copy()
            extract_cookies_to_jar(prep._cookies, r.request, r.raw)
            prep.prepare_cookies(prep._cookies)

            prep.headers['Authorization'] = self.build_digest_header(
                prep.method, prep.url)
            _r = r.connection.send(prep, **kwargs)
            _r.history.append(r)
            _r.request = prep

            return _r

        setattr(self, 'num_401_calls', 1)
        return r

    def __call__(self, r): # 定义一个魔术方法,方法用于实例自身的调用,r是request方法的返回对象
        # If we have a saved nonce, skip the 401
        if self.last_nonce:  # 判断是有没有设置认证头
            r.headers['Authorization'] = self.build_digest_header(r.method, r.url)
        try:
            self.pos = r.body.tell()
        except AttributeError:
            pass
        r.register_hook('response', self.handle_401) # 调用钩子函数
        return r

知道具体的digest加密算法,就很容易了.
实在抱歉,这么多内容辛苦你了!!!

远方
下期再见
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

http digest 的相关文章

  • HttpWebRequest vs Webclient(特殊场景)

    我知道这个问题之前已经回答过thread https stackoverflow com questions 1694388 webclient vs httpwebrequest httpwebresponse 但我似乎找不到详细信息 在
  • ASP.NET 中 HTTP 缓存相关标头的有效含义

    我正在 ASP NET 2 0 中开发一个 Web 应用程序 其中涉及通过资源处理程序 ashx 提供图像 我刚刚实现了处理缓存标头和条件 GET 请求 这样我就不必为每个请求提供所有图像 但我不确定我是否完全理解浏览器缓存发生了什么 图像
  • 面向服务的架构 - AMQP 或 HTTP

    一点背景 非常大的整体 Django 应用程序 所有组件都使用相同的数据库 我们需要分离服务 以便我们可以独立升级系统的某些部分而不影响其余部分 我们使用 RabbitMQ 作为 Celery 的代理 现在我们有两个选择 使用 REST 接
  • 如何转义角度 HttpParams?

    在 Angular 服务中 我使用 HttpParams 将字符串发送到服务 get phone string Observable
  • 我可以使用 HTTP 范围标头“有意”加载部分文件吗?

    我正在研究 HTTP 范围标头 specs http www w3 org Protocols rfc2616 rfc2616 sec14 html sec14 16 据我了解 我可以设置文件的字节范围ala 0 199 2000 200
  • 如何使用 python 的 http.client 准确读取一个响应块?

    Using http client在 Python 3 3 或任何其他内置 python HTTP 客户端库 中 如何一次读取一个分块 HTTP 响应一个 HTTP 块 我正在扩展现有的测试装置 使用 python 编写 http clie
  • Node.js 未处理的“错误”事件

    我编写了一个简单的代码并将其保存在文件 try js 中 var http require http var makeRequest function message var options host localhost port 8080
  • 使用 WCF 支持“application/x-www-form-urlencoded”发布数据的最佳方式?

    我正在基于 W3C 规范构建 WCF 服务 该规范定义了接受 application x www form urlencoded 发布数据的 RESTful Web 服务端点 默认情况下 WCF 不支持这种类型的消息编码 我发现了许多创建如
  • 自定义 HTTP 标头:命名约定

    我们的一些用户要求我们将与其帐户相关的数据包含在HTTP 标头我们向他们发送的请求 甚至是他们从我们的 API 获得的响应 添加自定义 HTTP 标头的一般约定是什么 naming format etc 另外 请随意发布您在网络上偶然发现的
  • put方法中的Angularjs文件上传不起作用

    我有一个简单的待办事项应用程序 我试图在其中上传照片和单个待办事项 现在我已经创建了这个工厂函数来负责待办事项的创建 todosFactory insertTodo function todo return http post baseUr
  • 适用于 Objective-C / iPhone 的良好 HTTP 库? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 UPDATE 这个问题显然已经过时了 参见日期 我建议只使用现代 iOS7 功能 例如 NSURLSession 我想 这个问题是为了历史
  • android httprequest java.net.UnknownHostException

    我想用android发出http请求 是使用这个 void testHTTP HttpClient httpClient new DefaultHttpClient HttpUriRequest request new HttpPost h
  • 我可以从 HTTP 请求中找到无线接入点的 BSSID(MAC 地址)吗?

    假设有人在咖啡店里无线连接到互联网 并向 johnsveryownserver com 发送 HTTP 请求 服务器端 有什么方法可以确定我的MAC地址吗 无线接入点他们连接到什么 请注意 我对他们机器的 MAC 地址不感兴趣 如果我无法使
  • Zoopla 沙箱出现 cURL http 标头错误

    我正在为房地产经纪人开发代码 以通过他们的数据源将房产上传到 Zoopla 我在将所需的配置文件添加到所需的 http 标头时遇到问题 文档中唯一的示例是来自 Linux 的测试 echo branch reference test cur
  • 以 REST 方式更新整个资源集合

    我有一个资源列表的 REST URI 例如 http foo com group users 这些用户中的每一个都有一个序列号 我想公开一种方法来为集合中的所有用户重新编号这些值 并使访问该列表的每个人都可以使用此更改 由于这是对整个集合的
  • 无效数据的 REST 响应代码

    如果出现以下情况 应将什么响应代码传递给客户端 用户注册时传递了无效数据 例如电子邮件格式错误 用户名 电子邮件已存在 我选择了403 我还发现了以下我觉得可以用的 维基百科 412 前提条件失败 服务器不满足请求者要求的先决条件之一 提出
  • Rails api 中阻止用户配置文件的最佳 HTTP 状态代码是什么?

    我在 Rails 中为社交应用程序编写了一个 API 这个应用程序就像Facebook一样 用户可以阻止其他用户 如果用户 A 阻止用户 B 则用户 B 无法查看用户 A 的个人资料页面 那么我应该返回的最佳 HTTP 代码状态是什么 40
  • ASP.NET - 将所有 https 请求重写为 http

    我的问题正是所提出的问题here https stackoverflow com questions 16276860 iis 7 adding ssl to one site all other sites responds to htt
  • 防止表单重新提交

    第一页包含一个 HTML 表单 第二页 处理提交的数据的代码 第一页中的表格已提交 浏览器被重定向到第二页 第二页处理提交的数据 此时 如果刷新第二页 则会弹出 确认表单重新提交 警报 这可以预防吗 人们过去常采取两种方法 方法一 使用 A
  • eBay API 调用不适用于 UPC/EAN

    eBay 的 API findItemsByProduct 操作适用于 UPC 和 EAN 但不幸的是它不起作用 例如 下面的 HTTP GET 请求会抛出 无效的产品 ID 值 错误41 Note 请将 SECURITY APPNAME

随机推荐

  • 通信upf是什么意思_管理UPF的方法、装置及系统与流程

    本发明涉及通信领域 xff0c 具体而言 xff0c 涉及一种管理UPF 用户面功能 xff0c User plane function 的方法 装置及系统 背景技术 xff1a 图1是根据相关技术的3GPP演进分组系统的结构示意图 xff
  • signature=eb47f6441363b915ee5eb8456d7928a2,yarn.lock

    THIS IS AN AUTOGENERATED FILE DO NOT EDIT THIS FILE DIRECTLY yarn lockfile v1 abbrev 64 1 version 34 1 1 1 34 resolved 3
  • 绝地求生现在服务器稳定吗,吃鸡服务器不稳定?《绝地求生》国服宣布将首次使用超性能服务器...

    2月26日消息 要说目前最受国内游戏爱好者期待的游戏 xff0c 相信不少小伙伴都会投火遍全球的 绝地求生 一票 xff01 而据最新消息显示 xff0c 为了给玩家们带来更加优秀的游戏体验 xff0c 绝地求生 国服将首次使用超性能服务器
  • 微信服务器是否记录视频信息,微信视频号有访客记录吗 微信视频号可以查看浏览记录吗...

    视频号是微信的一个全新版块 xff0c 我们可以在视频号浏览视频号发布的短视频 xff0c 同时还可以进行点赞 留言 转发等操作 xff0c 那我们自行发布的视频 xff0c 微信视频号有访客记录吗 xff1f 下面就和IT百科一起来看看吧
  • 萨克斯维修服务器,萨克斯常见故障修理方法

    原标题 xff1a 萨克斯常见故障修理方法 1 如果某一按键突然停止工作了 xff0c 那就检测一下相应的弹簧 xff0c 如果是破裂或是遗失 xff0c 可以暂时用硬橡胶带来代替 记住在演奏完毕后要除去橡胶带 xff0c 因为从长远来看它
  • I2C通讯协议介绍

    2019独角兽企业重金招聘Python工程师标准 gt gt gt I2C总线是PHLIPS公司在20世纪80年代推出的一种串行总线 具有引脚少 xff0c 硬件实现简单 xff0c 可扩展性强的优点 I2C总线的另一优点是支持多主控 xf
  • postman linux 使用教程,Postman 的实用功能

    封面图 前言 基础使用 Collection Environment Test Collection Runner 参考资料 关于我 前言 我是一个 Android 开发工程师 xff0c 日常开发中最免不了的就是使用 Postman 进行
  • UART和RS232、RS485的基础知识

    博客目录 xff1a 1 UART和RS232 RS485的关系 xff1a 2 RS232和RS485的区别和引脚介绍 3 参考文献 正文如下 一 UART和RS232 RS485的关系 xff1a 通讯问题 xff0c 和交通是一样的
  • C语言截取字符串

    1 从左边截取指定长度的字符串 代码功能 xff1a 从字符串开头 xff0c 截取指定长度的字符 include lt stdio h gt include lt wiringPi h gt int main char arr 128 6
  • 【Android-3】Android中的任务栈(Task)

    一 Android任务栈 概述 xff1a Android中的任务栈其实就是Activity的集合 xff0c 在Android中退出程序的时候必须把任务栈中的所有Activity清除出栈 xff0c 此时才能安全的完全的退出程序 xff0
  • Boost 和 STL 相比有哪些优势和劣势?

    1 在设计原则上 xff0c STL和Boost大体统一 因为STL和Boost基本上都是标准委员会那批人在策划 审核和维护 xff0c 所以口味上是相对接近的 但是因为Boost并不在标准中 xff0c 或者说是下一代标准的试验场 xff
  • udp通信 c 语言,Windows程序设计 | 基于UDP的C/S通讯实现

    作者小序 今天翘课一天 xff0c 本打算一个早上写完网络编程实验报告就出去溜达 xff0c 结果从早上九点到这会没出过宿舍门 xff0c 宅到不能再宅了 xff0c 哎 xff0c 一首凉凉送给自己 分享一下干货吧 xff0c windo
  • Linux 下tcp编程例子

    服务器端server程序 编译命令 xff1a gcc Wall g o server server c lpthread include lt stdio h gt include lt string h gt include lt st
  • 微信开发者工具配置服务器信息,微信开发者中心如何配置

    微信开发者中心配置是怎么样的呢 xff0c 那么微信开发者中心又是如何配置的呢 下面是学习啦小编收集整理的微信开发者中心如何配置 xff0c 希望对大家有帮助 微信开发者中心配置的方法 工具 原料 一台电脑和一个微信公众号 需要再SEA上部
  • 【尖端干货】H.264编码下直播视频添加水印的优化

    2016年被称为 中国网络直播元年 xff0c 网络直播已成为网络文化领域重要的经营模式和文化市场的重要组成部分 而以 直播造人 事件为节点 xff0c 直播行业进入了严格规范化的时期 xff0c 鉴黄 版权保护越来越受到直播行业的关注 在
  • C++ 防止重定义

    防止重定义有2种方法 xff1a 第一种 xff1a ifndef MY HEAD H INCLUDED define MY HEAD H INCLUDED endif MY HEAD H INCLUDED 此种方案是一种很通用的方案 xf
  • 51单片机串口通讯c语言程序,如何使用51单片机实现串口通信

    描述 STC51单片机一般带有1个串口 xff0c 有的带有2个串口 xff0c 串口一般用于下载程序和串口通信 串口通信特别适合控制设备 xff0c 所以工控机的电脑上一般都带有串口 51单片机的串口引脚为P3 0引脚与P3 1引脚 xf
  • nautilus命令

    nautilus 是图形程式 效果是以当前用户打开图形界面 所以如果想以root打开图形界面 使用时记得先切为root xff0c sudo没有用的 转载于 https www cnblogs com wangshaowei p 90313
  • 如何在SV中使用结构体struct语法

    前言 测试下可综合的struct xff0c struct和interface的区别 xff1a 两者都可以是信号的组合 xff0c 但interface可以定义信号的不同方向 xff0c 而struct中的所有信号都是同向的 struct
  • http digest

    HTTP digest 摘要访问认证是一种协议规定的Web服务器用来同网页浏览器进行认证信息协商的方法 它在密码发出前 xff0c 先对其应用哈希函数 xff0c 这相对于HTTP基本认证发送明文而言 xff0c 更安全 从技术上讲 xff