雅虎香港 搜尋

搜尋結果

  1. URL 编码(百分比编码). URL 编码将字符转换为可通过因特网传输的格式。. URL 只能使用 ASCII 字符集 通过因特网进行发送。. 由于 URL 通常包含 ASCII 集之外的字符,因此必须将 URL 转换为有效的 ASCII 格式。. URL 编码使用后跟十六进制数字的 "%" 替代不安全的 ASCII ...

  2. 3 天前 · 定期存款2024|虛銀最高4.3厘 盤點14銀行4厘港元定存. 陸續有銀行減港元定存年利率,並全線跌穿4厘,以下14間銀行仍守住4厘高息(不計3個月以下短存期)。. 美國利率前景不明,影響銀行的定存產品部署,再有發鈔行撤走12個月存期優惠,僅餘6個月及3個月存期 ...

    • # TCP 基本认识
    • # TCP 连接建立
    • # TCP 连接断开
    • # Socket 编程

    # TCP 头格式有哪些?

    我们先来看看 TCP 头的格式,标注颜色的表示与本文关联比较大的字段,其他字段不做详细阐述。 序列号:在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。 确认应答号:指下一次「期望」收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。用来解决丢包的问题。 控制位: 1. ACK:该位为 1 时,「确认应答」的字段变为有效,TCP 规定除了最初建立连接时的 SYN 包之外该位必须设置为 1。 2. RST:该位为 1时,表示 TCP 连接中出现异常必须强制断开连接。 3. SYN:该位为 1时,表示希望建立连接,并在其「序列号」的字段进行序列号初始值的设定。 4. FIN:该位为 1 时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换 FIN位为 1 的 TCP 段。

    # 为什么需要 TCP 协议? TCP 工作在哪一层?

    IP层是「不可靠」的,它不保证网络包的交付、不保证网络包的按序交付、也不保证网络包中的数据的完整性。 如果需要保障网络数据包的可靠性,那么就需要由上层(传输层)的 TCP协议来负责。 因为 TCP 是一个工作在传输层的可靠数据传输的服务,它能确保接收端接收的网络包是无损坏、无间隔、非冗余和按序的。

    # 什么是 TCP ?

    TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。 1. 面向连接:一定是「一对一」才能连接,不能像 UDP 协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的; 2. 可靠的:无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个报文一定能够到达接收端; 3. 字节流:用户消息通过 TCP 协议传输时,消息可能会被操作系统「分组」成多个的 TCP 报文,如果接收方的程序如果不知道「消息的边界」,是无法读出一个有效的用户消息的。并且 TCP 报文是「有序的」,当「前一个」TCP 报文没有收到的时候,即使它先收到了后面的 TCP 报文,那么也不能扔给应用层去处理,同时对「重复」的 TCP 报文会自动丢弃。

    # TCP 三次握手过程是怎样的?

    TCP 是面向连接的协议,所以使用 TCP 前必须先建立连接,而建立连接是通过三次握手来进行的。三次握手的过程如下图: 1. 一开始,客户端和服务端都处于 CLOSE 状态。先是服务端主动监听某个端口,处于 LISTEN状态 1. 客户端会随机初始化序号(client_isn),将此序号置于 TCP 首部的「序号」字段中,同时把 SYN 标志位置为 1 ,表示 SYN 报文。接着把第一个 SYN 报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于 SYN-SENT状态。 1. 服务端收到客户端的 SYN 报文后,首先服务端也随机初始化自己的序号(server_isn),将此序号填入 TCP 首部的「序号」字段中,其次把 TCP 首部的「确认应答号」字段填入 client_isn + 1, 接着把 SYN 和 ACK 标志位置为 1。最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于 SYN-RCVD状态。 1. 客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先该应答报文 TCP 首部 ACK 标志位置为 1 ,其次「确认应答...

    # 如何在 Linux 系统中查看 TCP 状态?

    TCP 的连接状态查看,在 Linux 可以通过 netstat -napt命令查看。

    # 为什么是三次握手?不是两次、四次?

    相信大家比较常回答的是:“因为三次握手才能保证双方具有接收和发送的能力。” 这回答是没问题,但这回答是片面的,并没有说出主要的原因。 在前面我们知道了什么是 TCP 连接: 1. 用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗口大小称为连接。 所以,重要的是为什么三次握手才可以初始化Socket、序列号和窗口大小并建立 TCP 连接。 接下来,以三个方面分析三次握手的原因: 1. 三次握手才可以阻止重复历史连接的初始化(主要原因) 2. 三次握手才可以同步双方的初始序列号 3. 三次握手才可以避免资源浪费 原因一:避免历史连接 我们来看看 RFC 793 指出的 TCP 连接使用三次握手的首要原因: The principle reason for the three-way handshake is to prevent old duplicate connection initiations from causing confusion. 简单来说,三次握手的首要原因是为了防止旧的重复连接初始化造成混乱。 我们考虑一个场景,客户端先发...

    # TCP 四次挥手过程是怎样的?

    天下没有不散的宴席,对于 TCP 连接也是这样, TCP 断开连接是通过四次挥手方式。 双方都可以主动断开连接,断开连接后主机中的「资源」将被释放,四次挥手的过程如下图: 1. 客户端打算关闭连接,此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文,也即 FIN 报文,之后客户端进入 FIN_WAIT_1状态。 2. 服务端收到该报文后,就向客户端发送 ACK 应答报文,接着服务端进入 CLOSE_WAIT状态。 3. 客户端收到服务端的 ACK 应答报文后,之后进入 FIN_WAIT_2状态。 4. 等待服务端处理完数据后,也向客户端发送 FIN 报文,之后服务端进入 LAST_ACK状态。 5. 客户端收到服务端的 FIN 报文后,回一个 ACK 应答报文,之后进入 TIME_WAIT状态 6. 服务端收到了 ACK 应答报文后,就进入了 CLOSE状态,至此服务端已经完成连接的关闭。 7. 客户端在经过 2MSL 一段时间后,自动进入 CLOSE状态,至此客户端也完成连接的关闭。 你可以看到,每个方向都需要一个 FIN 和一个 ACK,因此通常被称为四次挥手。...

    # 为什么挥手需要四次?

    再来回顾下四次挥手双方发 FIN包的过程,就能理解为什么需要四次了。 1. 关闭连接时,客户端向服务端发送 FIN时,仅仅表示客户端不再发送数据了但是还能接收数据。 2. 服务端收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN报文给客户端来表示同意现在关闭连接。 从上面过程可知,服务端通常需要等待完成数据的发送和处理,所以服务端的 ACK 和 FIN一般都会分开发送,因此是需要四次挥手。 但是在特定情况下,四次挥手是可以变成三次挥手的,具体情况可以看这篇:TCP 四次挥手,可以变成三次吗?(opens new window)

    # 第一次挥手丢失了,会发生什么?

    当客户端(主动关闭方)调用 close 函数后,就会向服务端发送 FIN 报文,试图与服务端断开连接,此时客户端的连接进入到 FIN_WAIT_1状态。 正常情况下,如果能及时收到服务端(被动关闭方)的 ACK,则会很快变为 FIN_WAIT2状态。 如果第一次挥手丢失了,那么客户端迟迟收不到被动方的 ACK 的话,也就会触发超时重传机制,重传 FIN 报文,重发次数由 tcp_orphan_retries参数控制。 当客户端重传 FIN 报文的次数超过 tcp_orphan_retries 后,就不再发送 FIN 报文,则会在等待一段时间(时间为上一次超时时间的 2 倍),如果还是没能收到第二次挥手,那么直接进入到 close状态。 举个例子,假设 tcp_orphan_retries 参数值为 3,当第一次挥手一直丢失时,发生的过程如下图: 具体过程: 1. 当客户端超时重传 3 次 FIN 报文后,由于 tcp_orphan_retries 为 3,已达到最大重传次数,于是再等待一段时间(时间为上一次超时时间的 2 倍),如果还是没能收到服务端的第二次挥手(ACK报文),那...

    # 针对 TCP 应该如何 Socket 编程?

    1. 服务端和客户端初始化 socket,得到文件描述符; 2. 服务端调用 bind,将 socket 绑定在指定的 IP 地址和端口; 3. 服务端调用 listen,进行监听; 4. 服务端调用 accept,等待客户端连接; 5. 客户端调用 connect,向服务端端的地址和端口发起连接请求; 6. 服务端 accept 返回用于传输的 socket的文件描述符; 7. 客户端调用 write 写入数据;服务端调用 read读取数据; 8. 客户端断开连接时,会调用 close,那么服务端 read 读取数据的时候,就会读取到了 EOF,待处理完数据后,服务端调用 close,表示连接关闭。 这里需要注意的是,服务端调用 accept时,连接成功了会返回一个已完成连接的 socket,后续用来传输数据。 所以,监听的 socket 和真正用来传送数据的 socket,是「两个」 socket,一个叫作监听 socket,一个叫作已完成连接 socket。 成功连接建立之后,双方开始通过 read 和 write 函数来读写数据,就像往一个文件流里面写东西一样。

    # listen 时候参数 backlog 的意义?

    Linux内核中会维护两个队列: 1. 半连接队列(SYN 队列):接收到一个 SYN 建立连接请求,处于 SYN_RCVD 状态; 2. 全连接队列(Accpet 队列):已完成 TCP 三次握手过程,处于 ESTABLISHED 状态; 1. 参数一 socketfd 为 socketfd 文件描述符 2. 参数二 backlog,这参数在历史版本有一定的变化 在早期 Linux 内核 backlog 是 SYN 队列大小,也就是未完成的队列大小。 在 Linux 内核 2.2 之后,backlog 变成 accept 队列,也就是已完成连接建立的队列长度,所以现在通常认为 backlog 是 accept 队列。 但是上限值是内核参数 somaxconn 的大小,也就说 accpet 队列长度 = min(backlog, somaxconn)。 想详细了解 TCP 半连接队列和全连接队列,可以看这篇:TCP 半连接队列和全连接队列满了会发生什么?又该如何应对?(opens new window)

    # accept 发生在三次握手的哪一步?

    我们先看看客户端连接服务端时,发送了什么? 1. 客户端的协议栈向服务端端发送了 SYN 包,并告诉服务端端当前发送序列号 client_isn,客户端进入 SYN_SENT 状态; 2. 服务端端的协议栈收到这个包之后,和客户端进行 ACK 应答,应答的值为 client_isn+1,表示对 SYN 包 client_isn 的确认,同时服务端也发送一个 SYN 包,告诉客户端当前我的发送序列号为 server_isn,服务端端进入 SYN_RCVD 状态; 3. 客户端协议栈收到 ACK 之后,使得应用程序从 connect调用返回,表示客户端到服务端端的单向连接建立成功,客户端的状态为 ESTABLISHED,同时客户端协议栈也会对服务端端的 SYN 包进行应答,应答数据为 server_isn+1; 4. ACK 应答包到达服务端端后,服务端端的 TCP 连接进入 ESTABLISHED 状态,同时服务端端协议栈使得 accept阻塞调用返回,这个时候服务端端到客户端的单向连接也建立成功。至此,客户端与服务端两个方向的连接都建立成功。 从上面的描述过程,我们可以得知客户端...

  3. DeepL Translate: The world's most accurate translator. DeepL Write. AI-powered edits. Detect language. English (US) Type to translate. Drag and drop to translate PDF, Word (.docx), and PowerPoint (.pptx) files with our document translator. Click the microphone to translate speech. Dictionary. Click on a word to look it up.

  4. 2016年10月22日 · 在这里%E4%BD%A0%E5%A5%BD是utf-8 你好 的意思。. 在python里对url 的utf-8编码进行str. decode (‘utf-8’)是不起作用的,但urllib库里面有个urlencode函数,可以把key-value这样的键值对转换成url格式,返回的是a=1&b=2这样的字符串. urllib另外对字符串还单独提供 quote ()函数 和 unquote ...

  5. 2013年11月15日 · 知乎用户. 根据页面编码不同,一般是GB2312或UTF-8编码。. 知乎使用的是 UTF-8编码 ,所以“知乎”两个字被编码为“%E7%9F%A5%E4%B9%8E”。. 详细说明:. 含有中文的网址中显示百分号%、十六进制数字等“乱码”是什么?. 百度空间. 发布于 2013-11-14 22:04. 比如我用知乎 ...

  6. 2023年5月12日 · URL 编码(百分比编码) URL 编码将 字符 转换为可通过因特网传输的格式。 URL 只能使用 ASCII 字符集 通过因特网进行发送。 由于 URL 通常包含 ASCII 字符集之外的字符,因此必须将 URL 转换为有效的 ASCII 格式。 URL 编码使用后跟 十六进制 数字的 % 替代不安全的 ASCII 字符。 URL 不能包含空格。 URL 编码通常使用加号( + )或( %20 )替代空格。 例如 :点击下面的 “提交” 按钮,浏览器将对输入进行 URL 编码,然后再将其发送到服务器。 服务器上的页面将显示收到的输入。 演示.