- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在学习 TCP/IP 基础知识。我制作了一个服务器-客户端聊天应用程序,其中服务器打开一个端口 1024,客户端可以向它发送消息。我对服务器和客户端交换的 TCP/IP 数据包的内容有点困惑。如果客户端向服务器发送消息,它会通过以太网作为数据包发送。在来自客户端的以太网帧中,数据字段以 TCP/IP 格式编码。在 TCP/IP 帧中,目标端口将为 1024。但是源端口的值是多少?客户端未打开任何端口。只有服务器打开一个端口。另外我想知道是否有任何方法可以监视在 PC 中发送和接收的这些 TCP/IP 数据包。
最佳答案
别忘了还有 multiple layers involve here . TCP、IP 和以太网虽然经常结合使用,但属于不同的范畴。记住分离很重要。以太网(第 2 层)是一种将各个计算机连接在一起的协议(protocol),但它不关心它们具有什么 IP 地址。 IP 连接更大规模的计算机,它可以通过各种“第二层”网络技术进行路由和发送,其中以太网只是其中之一。
IETF 互联网协议(protocol)的伟大之处在于它们都是 thoroughly documented这样您就可以了解它们的内部工作方式。对于在 IP 之上运行的 TCP,端口号位于 TCP 层。 IP 本身并不关心它们,它只关心源地址和目标地址。
关键就在描述 TCP header 的图中:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
必须填充源端口和目标端口。这是系统 IP 堆栈如何跟踪哪些数据包属于哪些连接的关键组成部分。
通常,当您编写连接到服务器的代码时,您的连接源自(某种程度上)随机源端口。当您创建监听端口的服务器进程时,可以自动分配或专门设置该端口。
对于像 HTTP 这样的服务,如果您希望其他客户端连接到该服务,您会希望将该端口固定到 80,因此自动分配没有帮助。有时自动分配更可取,这样就不会发生冲突。
您可以使用 tcpdump
等工具监控所有这些或 Wireshark在许多其他人中。他们可以深入各个层次并展示正在发生的事情。
关于ethernet - TCP/IP 数据包中的端口号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47998094/
我认为波特率是符号的速率,如果每个符号包含 n 位,那么比特率应该是 n x baud rate 在以太网(曼彻斯特编码)中,如果比特率是波特率的一半,那么一个符号包含 1/2 位?据我所知,比特率至
我必须在 Linux 上编写一个应用程序,该应用程序需要与具有自定义以太网类型的设备进行通信。甚至在如何编写这样的应用程序中也有很多解决方案。一个缺点是需要 root 访问权限(AFAIK)。之后释放
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 8年前关闭。 Improve this qu
所以我正在使用需要发送和接收原始以太网帧的设备。它是一种 radio ,它使用以太网向其主机发送状态消息。它使用的协议(protocol)实际上是 IPX,但我认为使用 libpcap 发送原始以太网
是否可以从标准计算机以太网接口(interface)直接从物理以太网连接接口(interface)读取位? 例如,假设我想将笔记本电脑的以太网插孔用作差分逻辑探头(使用标准以太网电缆)。我是否可以潜在
我正在尝试将设备的 IP 地址分配给一个字符串变量。当我使用 Serial.println(Ethernet.localIP())测试它以八位字节显示 IP 地址。如果我使用 String(Ether
我有一个用 Wireshark 捕获的 pcap。 Wireshark 中是否有任何函数可以从结果中剥离以太网层?或者任何命令行工具来做到这一点? 最佳答案 我搜索了更多关于 pcap 编辑器的信息,
我正在学习 TCP/IP 基础知识。我制作了一个服务器-客户端聊天应用程序,其中服务器打开一个端口 1024,客户端可以向它发送消息。我对服务器和客户端交换的 TCP/IP 数据包的内容有点困惑。如果
解释起来很奇怪,但是,我们在 cron 中有 perl 脚本,它工作得很好,但今天它开始在所有行中抛出带有 DDD 的输出。 perl 脚本输出中的 DDD 是什么?像这样的东西?这个 DDD 从哪里
我一直在玩 arduino 以太网防护罩,试图让基本示例正常工作,但无济于事。这是我的设置: Arduino Mega 2560 通过 USB 连接到计算机,以太网屏蔽堆叠在其上。我已经尝试了 ard
我正在使用 Arduino 的以太网屏蔽将其连接到套接字服务器(不同的计算机),以便我可以从它接收消息以激活一些例程。这是我的代码: #include #include byte mac[] =
我见过几个创建套接字来嗅探 IP 数据包的示例,例如使用: s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
标题是尝试运行名为 l2fwd 的 dpdk 示例应用程序时出现的错误的最后一行。当我通过 ./build/l2fwd -l 0-3 -n 4 -- -q 8 -p ffff 运行应用程序时,但最后几
我最近获得了一个 ACS 线性执行器(Tolomatic 步进器),我试图从 Python 应用程序向其发送数据。设备本身使用以太网/IP 协议(protocol)进行通信。 我已经通过 pip 安装
Arduino 默认 Ethernet library class包含 IPAddress变量类型。这个 IPAddress 有什么用?我为什么要使用它,为什么它不用于 official exampl
我购买了以太网扩展板 v1.1 ENC28J60。卡的 MAC 地址没有纸/粘性纸。我正在尝试运行这些示例,但没有任何效果。 我认为问题是 MAC address . MAC地址真的有必要吗?如果是这
我有一个带 8 个模拟输入的 I/O 远程设备 (EIP-2017),它实现 EtherNet/IP 协议(protocol)来读取 I/O 值。我在 codeplex ( https://eipne
在 Zynq Ultrascale+(主板 ZCU102 版本 1)上启动基于 Linux 的操作系统并按照 here 中的描述配置内核, 具有由 Vivado SDK 2017.2 自动生成的设备树
我有一个 python 脚本,它会在终端运行时启动 cherrypy webserver。在脚本中,我通过导入 serial 使用 pyserial,然后我打开端口/dev/ttyAMA0,我可以发送
我需要将 rPi 设置为桥接模式,这样它就可以通过其 wifi 接口(interface)在家庭 LAN 中访问,同时通过其以太网接口(interface)物理连接到另一台计算机(目标系统)。目标是能
我是一名优秀的程序员,十分优秀!