网络知识拾遗

最近需要用到一些网络知识,一段时间不用,发现遗忘了挺多。


TCP 是一个流协义

也就是说 TCP 传输的是字节流,没有一般意义上的报文边界。当我们连续调用 2次 send 的时候,并不一定会分两次发送。很有可能2次数据合在一起发送,也可能先发送了第一请求的一部分,剩下的部分和第二个请求一起发送。

所以需要在应用程序端进行处理


而 UDP 是面向“包”的,Send 一次就发送一个。


TCP 的端到端

TCP 是端到端的协议,但是这个端指的只是 TCP 层,并不是应用程序层。所以就算 TCP 可以保证消息可靠传输,那也只是在 TCP 层,不能保证消息抵达应用程序层的可靠。

所以任然需要在应用程序层来做可靠性的检测。

TCP和流


TCP 并不那么可靠

说 TCP 是可靠是因为 TCP 会进行发送确认及重发(retransmission and acknowledgement ),另外还会进行数据CRC校验(防止因为电气故障,如电磁干扰)导致的数据错误。

但是这并不代表 TCP 不会出错,当网络突然中断(来不及发送关闭连接的请求)、或者应用程序中断都有可能导致消息发送或接受出现错误。

(e.g. 当接收端发送了 ACK 给发送端,这个时候发送端已经认为发送成功了。但是接收端在发送完 ACK,正要读取数据的时候奔溃了,而对于发送端的 TCP 是不可能知道的。)


所以不能因为 TCP 是有序可靠的传输,就一定认为应用程序肯定可以正确传输数据,还是必须在应用程序层进行可靠性的确认。


TCP 是双向的,支持全双工

全双工意味着在同一个连接里既能发送,又能接受。有点类似手机。TCP 本身是一个 bidrectional 的协议,因此它支持全双工模式,但是到底通信过程是不是全双工还要看更底层的协议(比如 Ethernet 协议) 及硬件(一般情况交换机都支持全双工,集线器只支持ban)支不支持。


以太网 与 Internet

Ethernet (以太网)是局域网的一种通信协议,更精确的说它是一个数据链路层的协议。局域网的通信协议除了以太网,还有令牌环等。

internet 是组合了多种不同网络的一种网络之上的网络


什么是 socket

中文名:套接字,由操作系统直接提供的一种网络 API(主要被用于传输层)。最早作为 Unix 系统中的一个网络 Handle (句柄) 存在,Unix 提供了 API 来使用该句柄,以便将数据发送到网络上(本质上,句柄只是一串数字,用来标识不同的网络连接)。起初,这套用来操作句柄的 API,只是 Unix 自己用的,在不断的修改后,最终被当成标准的网络 API 的标准提了出来(即,Berkeley sockets。随着时间的发展,不同的操作系统有各自的实现方式,比如 Windows 的 winsock。

除了 socket 这个网络 API 标准,后来演化了另一个版本: Transport Layer Interface (TLI)。TLI 和 socket 非常相似,不过它是基于 OSI 模型的(因为原本认为标准化组织提出的 OSI 7 层模型会替换 TCP/IP 4 层模型,但是后来却并为如此,开发人员觉得 OSI 7 层模型过于庞大复杂)。

标准的 socket 提供了如下的功能:

socket()

bind()

listen()

accept()

send()


参考《Network socket


多个 Socket 使用同一个端口

端口本质上只是一个数字,并不是硬件上的东西。那多个 socket 能否使用同一个端口呢?

首先我们要清楚为什么会有多个 socket?

一个 socket 只能用于一个连接,无法同时承载多个连接。这个从 socket 的定义就可以看出来,一个 socket 由五个部分进行标识 {SRC-IP, SRC-PORT, DEST-IP, DEST-PORT, PROTOCOL},SRC 即源机器,DEST 即目标机器,显然是一对一的映射关系,这就说明无法同时连接多个不同的 DEST。

只有当这5个部分完全相同的时候,才认为是同一个 socket,如果两个 socket 相同,当数据抵达后,也就无法分辨将发送给哪个 socket 进行处理。只要 socket 中的这5个部分有一个不同,那就认为这两个 socket 是不同的。如果一个客户端对同一个服务器(IP,Port)发起两个连接,则这两个连接的 SRC-IP 肯定相同,如果期望能建立成功,要不是不同的端口,要不就是不同的协议(,或两者都不同)。

有些同学会好奇,那如果我的服务器开了 808 端口进行监听,按上面的说法,岂不是只能连一个客户端了?No~,当 listening 到一个连接,调用 accept 后,会创建一个新的 socket (把当前 socket 的信息,主要为 协议、IP 和 端口, pass 给新的 socket),这样针对不同的客户端都会由一个单独的 socket 进行连接。

参考《How do multiple clients connect simultaneously to one port, say 80, on a server?


文章索引

[隐 藏]

本站采用知识共享署名 3.0 中国大陆许可协议进行许可。 ©2014 Charley Box | 关于本站 | 浙ICP备13014059号