计算机网络
文章平均质量分 83
theanarkh
这个作者很懒,什么都没留下…
展开
-
捕获TCP/IP协议栈数据包的原理
wireshark或tcpdump相信大家都用过,这些工具看起来都很酷,因为我们平时都是在界面看到应用层的数据,这些工具居然可以让我们看到tcp/ip协议栈每层的数据。本文介绍一下查看tcp/ip协议栈数据的方法。并实现一个简陋的sniffer,通过nodejs暴露出来使用。我们先看实现。#include <stdio.h>#include <errno.h> #include <unistd.h>#include <sys/socket.h>#i原创 2021-05-11 23:56:19 · 578 阅读 · 0 评论 -
从linux5.9看网络层的设计
前言:很久没有看内核的代码了,假期开始看一下,之前看了一下0.11和1.2.13的代码,虽然大致了解了一些原理,但是毕竟比较旧了,再者很多功能还没有实现,比如epoll,所以这次选取的是5.9的版本,再也不怕过时了,当然,现在内核的代码量级非常大,不可能看得完也不可能都看,只是选取自己感兴趣的一些点看一下。看内核代码,总的来说是非常有趣的,不仅是因为知其然知其所以然,而且看到朴素的c语言,还有世界级大佬写代码的思路、思想,设置注释,都是非常有意思的事情。今天分析的内容是从socket函数开始,看看l.原创 2021-05-02 23:02:09 · 145 阅读 · 0 评论 -
使用wireshark分析tcp
今天使用wireshark来分析一下tcp的一些原理。首先我们建立一个tcp服务器。const net = require('net');net.createServer().listen(11111);再建立一个tcp客户端。const net = require('net');net.connect({port: 11111, host: '192.168.8.226'})我们逐个情况分析。1 不启动服务器,启动客户端。我们看看这种情况下tcp的表现。先看看总览。我们看到tcp首原创 2020-06-25 01:08:24 · 1178 阅读 · 0 评论 -
深入理解TCP/IP协议的实现之ip分片(基于linux1.2.13)
上次分析了ip分片重组,这次分析一下ip分片。首先我们要先了解为什么需要分片。比如在以太网中,使用CSMA/CD协议(由网卡实现),他规定了一个链路层数据包(不包括mac头,但是这一版内核实现的时候是包括了mac头的大小)的最大值(MTU)和最小值。所以如果上层的包大于这个阈值就需要被分片。而分片和组包的实现是在ip层。我们看一下具体的逻辑。ip分片的逻辑在ip_fragment函数里实现。vo...原创 2020-03-13 22:56:17 · 337 阅读 · 0 评论 -
深入理解TCP/IP协议的实现之ip分片重组(基于linux1.2.13)
我们都知道数据链路层有mtu的限制,如果我们上层发的包太大,那就要分片,那么对端就需要重组分片,组装好再通知上层。我们看一下分片重组的过程。我们看一下分片重组中用到的数据结构。ipq结构体是代表一个完整的传输层包,他被ip层分成了多个分片。ipfrag结构体是代表一个ip分片。他是传输层包的一个部分。我们开始分析组片之前,先分析一下基础的操作。1 创建一个用于重组传输层数据包的结构体ipq。...原创 2020-03-13 00:10:51 · 559 阅读 · 4 评论 -
深入理解TCP/IP协议的实现之connect(基于linux1.2.13)
分析完了服务器端,我们继续分析客户端,在socket编程中,客户端的流程是比较简单的,申请一个socket,然后调connect去发起连接就行。我们先看一下connect函数的定义。/* socket 通过socket函数申请的结构体 address 需要连接的目的地地址信息*/int connect(int socket, const struct sockaddr *address,...原创 2020-03-10 23:10:19 · 573 阅读 · 0 评论 -
深入理解TCP/IP协议的实现之三次握手(基于linux1.2.13)
上篇我们分析了accept函数,他是消费者,这篇我们看看生产者是怎么实现的。我们从tcp_rcv函数开始,这个函数是一个分发器。当接收到一个tcp包的时候,底层就会调这个函数交给tcp层处理。// daddr,saddr是ip头的字段,len为tcp头+数据长度 int tcp_rcv( struct sk_buff *skb, struct device *dev, struct ...原创 2020-03-07 16:30:08 · 303 阅读 · 0 评论 -
深入理解TCP/IP协议的实现之accept(基于linux1.2.13)
我们解析分析tcp/ip协议的实现,这一篇讲一下accept,accept就是从已完成三次握手的连接队列里,摘下一个节点。我们可以了解到三次握手的实现和过程。很多同学都了解三次握手是什么,但是可能很少同学会深入思考或者看他的实现,众所周知,一个服务器启动的时候,会监听一个端口。其实就是新建了一个socket。那么如果有一个连接到来的时候,我们通过accept就能拿到这个新连接对应的socket。那...原创 2020-03-07 13:33:08 · 928 阅读 · 0 评论 -
深入理解TCP/IP协议的实现之socket(基于linux1.2.13)
socket大家都知道是用于网络通信的,也知道他是ip和端口的组合。但是很多同学可能不是很清楚socket的原理和实现。下面我们深入理解一下socket到底是什么。 我们回忆一下socket编程的步骤,不管是客户端还是服务端,第一个调的函数都是socket。我们就从这个函数的实现开始,看看一个socket到底是什么。// 新建一个socket结构体...原创 2020-03-06 00:40:32 · 345 阅读 · 0 评论 -
TCP/IP协议栈源码冰山一角图
参考linux内核网络栈源代码情景分析一书原创 2017-06-14 07:41:30 · 724 阅读 · 0 评论 -
linux tcp/ip协议栈源码分析---arp协议的实现
参见linux内核网络栈源代码情景分析一书 arp协议是围着一个数组链表的数据结构进行的,包括对节点的增删改查,一些回调函数的设置。 相关数据结构: arp协议流程图: // 维护ip和mac地址映射的数组链表struct arp_table{ struct arp_table *next; /* Linked entry list原创 2017-06-16 21:41:38 · 3050 阅读 · 0 评论