精华内容
下载资源
问答
  • 全面分析linux内核的网络协议栈,非常适合对linux网络协议栈源码的学习
  • linux TCP/ip协议栈源码分析文档,逐块分析协议栈各个子模块。
  • linux TCP/IP协议源码

    2015-11-17 15:37:33
    linux TCP/IP协议源代码和详细的解析文档
  • linux tcp/ip协议

    2015-04-22 16:30:55
    分为上篇和下篇,上下篇共十八章,上篇九章部侧重于TCP/IP数据收发流程,即OSI模型的IPTCP层,下篇也是九章,并不属于TCP/IP本身,但是多少和网络有关且常用到,比如LC-trie路由、netfilter包过滤防火、还有一些...
  • linux tcp/ip协议栈分析

    2017-11-27 11:24:03
    linux内核协议栈源码分析--基于linux2.6.18内核源码。非扫描版,有目录
  • 一.linux内核网络栈代码的准备知识 1. linux内核ipv4网络部分分层结构...BSD socket是个可以用于各种网络协议的接口,而当用于tcp/ip,即建立了AF_INET形式的socket时,还需要保留些额外的参数,于是就有了struct sock

    一.linux内核网络栈代码的准备知识

    1. linux内核ipv4网络部分分层结构:

    BSD socket层:

    这一部分处理BSD socket相关操作,每个socket在内核中以struct socket结构体现。这一部分的文件主要有:/net/socket.c /net/protocols.c etc

    INET socket层:

    BSD socket是个可以用于各种网络协议的接口,而当用于tcp/ip,即建立了AF_INET形式的socket时,还需要保留些额外的参数,于是就有了struct sock结构。文件主要有:/net/ipv4/protocol.c /net/ipv4/af_inet.c /net/core/sock.c etc

    TCP/UDP层:

    处理传输层的操作,传输层用struct inet_protocol和struct proto两个结构表示。文件主要有:
      /net/ipv4/udp.c /net/ipv4/datagram.c /net/ipv4/tcp.c /net/ipv4/tcp_input.c /net/ipv4//tcp_output.c /net/ipv4/tcp_minisocks.c /net/ipv4/tcp_output.c /net/ipv4/tcp_timer.c etc

    IP层:

    处理网络层的操作,网络层用struct packet_type结构表示。文件主要有:/net/ipv4/ip_forward.c ip_fragment.c ip_input.c ip_output.c etc.

    数据链路层和驱动程序:

    每个网络设备以struct net_device表示,通用的处理在dev.c中,驱动程序都在/driver/net目录下。

    2. 数据发送流程图

    在这里插入图片描述

    3 数据接收流程图

    在这里插入图片描述

    二. 内核源代码的组织

    表1是本文要使用的Linux Net/4网络源代码的,其中大部分位于目录/usr/src/linux-2.2.x/net,列表如下,
    插口层
    BSD Socket
    /net/socket.c
    /net/protocols.c
    INET Socket
    /ipv4/protocol.c
    /ipv4/af_inet.c
    /net/ipv4/core/sock.c
    协议层
    TCP/UDP
    /net/ipv4/udp.c
    /net/ipv4/datagram.c
    /net/ipv4/tcp_input.c
    /net/ipv4//tcp_output.c
    /net/ipv4/tcp.c
    /net/ipv4/tcp_minisocks.c
    /net/ipv4/tcp_timer.c etc…
    IP
    /net/ipv4/ip_forward.c
    /net/ipv4/ip_fragment.c
    /net/ipv4/ip_input.c
    /net/ipv4/ip_output.c
    接口层
    Ethernet

    三. Linux中TCP/IP网络层次结构与实现

    Linux通过一组相邻的软件层实现了TCP/IP模型,它由BSD Socket层、INET Socket层、传输层、网络层,和链路层构成。应用程序使用系统调用向内核函数传递参数和数据从而进入内核空间,由内核中注册的内核函数对相应的数据结构进行处理。

    Linux的TCP/IP层次结构和实现方式如图 1 所示。
    在这里插入图片描述

    展开全文
  • tcp-ip协议栈分析。520页的PDF文档,全面详细的阐述了TCP/IP协议栈。
  • LinuxTCP/IP协议实现及嵌入式应用, 一本低估的好书, 讲解LINUX tcp/ip协议, 推荐给大家, 清爽版本
  • Linux 中TCPIP协议实现及嵌入式应用 北京航空航天大学出版社
  • 摘要:介绍嵌入式TCP/IP协议在低速处理器中的一种简化实现方案,并成功应用于某分布式监控系统中。 关键词:TCP/IP协议 嵌入式 ARM在网络应用日益普遍的今天,越来越多的嵌入式设备实现Internet网络化。...
  • 全面了解linux TCP/IP协议

    万次阅读 多人点赞 2017-09-03 19:17:03
    简要说明 自从熟悉了linux socket编程(主要做posix socket的TCP/IP)之后,就一直以来就想写一篇对TCP/IP有一个比较全面的涵盖用户空间、内核以及网卡的文章,以便帮助大家在遇到基于socket的TCP/IP问题或困惑时能...

    转载请附本文链接:https://blog.csdn.net/maxlovezyy/article/details/77824679

    简要说明

    自从熟悉了linux socket编程(主要做posix socket的TCP/IP)之后,就一直以来就想写一篇对TCP/IP有一个比较全面的涵盖用户空间、内核以及网卡的文章,以便帮助大家在遇到基于socket的TCP/IP问题或困惑时能进行有目的的、恰当的分析以便解决问题。只是一是本人上学时是个“不学无术”的不良少年。工作后自己也是不断学习中,还有比较忙(都是懒的借口吧,不然怎么还有时间看龙珠),一直没动笔,今天就花一下午时间来做一个介绍。如果大家发现了谬误之处,请及时留言,我好更正之、学习之。话不多说,下面就进入正题。
     
     现如今的internet services可以说就是基于TCP/IP构建的。理解数据是如何通过network传输的,无论对你调试net IO的性能还是解决问题还是学习新的技术都是有很大助益的。本文将会全面的,尽力细致的通过内核及硬件中的数据流和控制流来介绍这方面的知识。
     
     PS: 有一个我自认为实现的还不错的项目,有兴趣的童鞋可以参与github c/c++连接复用库实现

    TCP/IP的关键特征

    我们如何设计一个数据传输协议以便保证数据快速、有序、无误?TCP/IP正是为了这样的需求被创造的。下面的几个特征用于帮助了解什么是TCP/IP协议(栈)。由于对于TCP来讲IP是紧密相关的,我们放到一起介绍。更多的内容,大家可以参考大学教材《计算机网络》(谢希仁著)以及《TCP/IP协议》三卷(国外)。

    • 面向连接的(Connection-oriented)
      一个tcp connection有两个端(endpoint),每一个endpoint可以用一个***(ip、port)来表达,所以两端的话就可以用(local IP address, local port number, remote IP address, remote port number)***来表达。

    • 数据是双向流动的
      双向的传递二进制流。

    • 按序传送的
      接受者接收数据一定是会按照发送者发送数据的顺序的。通过一个32-bit integer做标记。通过ACK来保证可靠性,如果发送者收不到接受者的ACK,则会重新发送。

    • 流量控制
      发送方会根据接收方提供的的窗口大小来决定如何发送数据,不会超过接收方的缓冲能力。

    • 拥塞控制
      拥塞窗口(congestion window)区别于receive window,是发送方自己根据包ACK的状态结合特定的拥塞算法计算出的一个window。它表达的当前的网络状态。发送发发送的数据上限受到流量控制和拥塞控制共同的作用。

    数据传送

    这里写图片描述
     
     数据通过网络协议栈发送,如下图1。
     
     这里写图片描述
                 图1:数据发送的流动过程

    借用于国外大神的图(下文也会借用很多,不一一说明了),其表达了数据的流动过程。这里为了防止大家不认真看,我要强调一下右侧黑色方块表达用户write的新的数据,而灰色的代表发送缓冲区中已有的数据,大括号圈的灰黑两块结合代表了一个TCP报文段。整个过程可以分为三个区域,user、kernel和device,其中user和kernel的部分要吃CPU的。这里的device就是我们说的网卡(Network Interface Card)。

    内核socket关联了两个缓冲区:

    一个发送缓冲区为了数据发送。
    一个接收缓冲区为了接收数据。

    在内核中有一个TCP control block(TCB)关联到socket。TCB包含了连接需要处理的一系列数据,这里面包含了TCP的state(LISTEN, ESTABLISHED, TIME_WAIT),receive window, congestion window, sequence number, resending timer等等。
     
     内核中如果当前的TCP状态允许数据发送,则一个新的TCP报文段(或者说包)就会被创建。
     这里写图片描述
                 图2:TCP报文段

    之后报文段流向IP层。IP层在TCP的报文段上加上IP头并执行IP路由。IP路由是寻找到达目的IP的下一跳的一个程序。IP层计算完并加上IP头的checksum之后就会把数据发送到链路层。链路层通过ARP和下一跳的IP地址查找到下一跳的MAC地址,之后链路层把其头加到数据中。至此主机端数据包完成。之后就是调用网卡驱动了。此时如果有包捕获程序比如tcpdump或者Wireshark处于运行中,内核会把数据包拷贝给它们一份。
     
     驱动根据硬件厂商定义的协议请求传送数据。网卡在接到数据传送请求之后把数据包从主存拷贝到它的存储空间中,之后把数据打到网线。这时,为了遵从以太网标准,网卡会添加IFG(帧间隔)到数据包以便区分数据包的开始。网卡发送完数据包之后就会产生一个CPU中断,每一个中断都一个特定的中断号,OS根据中断号选择合适的驱动对中断进行处理(驱动启动的时候会注册一个对应中断号的处理函数)。

    数据接收

    这里写图片描述

    现在我们来看看是怎么接收数据的,如图3。
     
     这里写图片描述
                  图3:数据流入过程
     首先网卡把接收到的数据包写入到它的内存之中。然后对其进行校验,通过后发送到主机的主存之中。主存中的buffer是驱动分配好的,驱动会把分配好的buffer描述告诉网卡,如果没有足够的buffer接受网卡的数据包,网卡会将数据包丢弃。一旦数据包拷贝到主存完成,网卡会通过中断告知主机OS。
     之后驱动会检查它是否能处理这个新的包。如果能处理,驱动会把数据包包装成OS认识的结构(linux sk_buffer)并推送到上层。
     链路层接收到帧后检查通过的话会按照协议解帧并推送至IP层。
     IP层会在解包之后根据包中包含的IP信息决定推送至上层还是转发到其他IP。如果判断需要推送至上层,则会解掉IP包头并推送至TCP层。
     TCP在解报之后会根据其四元组找到对应的TCB,之后通过TCP协议处理这个报文。在接收到报文后,会把报文加到接受报文,之后根据TCP的状态发送一个ACK给对端。
     当然上述过程会受到NAT等等Netfilter的作用,这里不谈了,也没深研究过。当然为了性能,大牛们方方面面也做了很多努力,比如大到RDMA、DPDK等大的软硬件技术,小到zero-copy、checksum offload等。

    数据结构

    下面介绍一下关键数据结构sk_buff(skb)。
     
    这里写图片描述
             图4:sk_buffer(意为socket buffer?)
     
     一个skb就是一个发送缓冲区可发送的数据包。从图4中可以看到其各个指针。不同层级的数据包头的添加和删除、数据包的联合和分割都是通过控制这些指针来实现的。真正的数据结构可能比这复杂很多,但是基本思路是一致的。

    • TCP control block
       一个TCB代表了一个connection,这里TCB是一个抽象,linux用tcp_sock这个结构表达。下图5可以看出tcp_sock和fd、socket之间的关系。
       这里写图片描述
                  图5:TCP connection结构
       
       当调用系统调用的时候,OS先找到file结构。对于类unix系统,socket、本地file、device都被抽象成file。因此file拥有最少的信息。对于socket,有其自己的结构关联到file,tcp_sock也会关联到socket。tcp_sock只是socket的一类,其他还有诸如inet_sock等支持各种协议的sock。所有TCP相关的信息都在tcp_sock中,比如序号啊,各种窗口等。
       
       发送和接收缓冲区就是sk_buffer的list。dst_entry就是路由的结果,为了避免太频繁的路由,他们是sock关联的。dst_entry允许简单的ARP查找,它也是路由表的一部分。tcp_sock通过对四元组进行hash来索引。

    驱动和网卡的交互

    这一部分的知识可能是网上最难搜索到的部分,很大一部分原因应该是很少有人关注吧,但是了解了这部分知识会让你更通透。
     
     驱动和网卡之间是异步通信。驱动在请求发送数据之后CPU就去干别的事情去了。网卡发送完包之后通过中断通知CPU,CPU再通过驱动程序了解到结果。和发送数据一样,接收数据也是异步的。网卡把数据倒腾到主存之后再通过中断通知CPU。

    因此,预留一些空间来缓存发送和接受的buffer是必要的。大多数情况下,网卡使用环结构,这个环基本上就是一个队列,它具有固定的条目数,每一个条目存储一个发送或者接受的数据。条目被顺序的轮流使用,可以复用。如下图6,可以看到数据传送过程。
     这里写图片描述
               图6:驱动与网卡发送数据流

    驱动接收上层的数据并创建一个网卡可以理解的数据包描述(send descriptor),包含了主存地址和大小。由于网卡只认识物理地址,所以驱动还需将虚拟地址转换成物理地址,之后把send descriptor放到Tx ring之中。下一步通过通知网卡有新的数据了,之后网卡通过DMA(直接内存访问)获取元数据和数据发送出去。发送完之后通过DMA把结果写回,之后发送中断通知。

    数据的接收和发送反推过程差不多,自己看图7说话吧;-)。
     这里写图片描述
               图7:驱动与网卡接收数据流

    协议栈buffer和控制流

    协议栈中的控制流分为几个阶段。图8显示了buffer的发送过程。
             这里写图片描述
                  图8:buffer发送流

    首先应用程序创建数据并加入到发送缓冲区。如果缓冲区不足则调用失败或者阻塞调用线程。因此应用程序向内核灌入数据的速率收到缓冲区大小的限制。
     
     之后TCP创建包并通过传输队列(qdisc)发送给驱动。qdisc是一个FIFO结构并且是固定大小,这个大小可以通过ifconfig命令查看,其中的txqueuelen便是,一般情况下它是千级别的。

    在驱动和网卡之间是TX ring。之前提到它是定长的,如果它没有足够的空间,那么当传输队列(qdisc)也满了之后包就会被drop,就形成了之下而上的反压。

    下图9表现了buffer接收流。
              这里写图片描述
                   图9:buffer接收流

    很容易通过发送流反推。值得注意的是驱动和协议栈之间没有了队列,数据是通过poll直接获取的。如果主机处理的速度没有网卡接收的快,则Rx ring会满,就会有包被丢弃。一般情况下丢弃不会是因为TCP连接导致的,因为TCP连接有流量控制,但是UDP是没有的。可以通过ifconfig命令看到很多信息,比如drop、error等包的数量。

    最后

    现代的软硬件TCP/IP协议栈单链接发送速率到1~2GiB/s完全没有任何问题(经过实测)。如果你想探索更优秀的性能,你可以尝试RMDA等技术,他们通过绕过内核以减少拷贝等方式优化了性能,当然可能依赖硬件。

    原文:https://blog.csdn.net/maxlovezyy/article/details/77824679

    展开全文
  • Linux TCP_IP协议栈-高清

    2018-05-15 09:18:53
    Linux TCP_IP协议栈-高清,分享给所有需要的人.........
  • linux TCP/IP协议端口分配规则与分类

    千次阅读 2017-12-30 22:38:34
    TCP/IP 协议中的端口在报头中占2个字节即16位,范围是从0-65535。端口号用来表示和区别网络中的不同应用程序 端口分类 (1)公认端口(Well Known Ports):0-1023之间的端口号,也叫Well Known ports。这些端口由...

    简述
    TCP/IP 协议中的端口在报头中占2个字节即16位,范围是从0-65535。端口号用来表示和区别网络中的不同应用程序
    端口分类
    (1)公认端口(Well Known Ports):0-1023之间的端口号,也叫Well Known ports。这些端口由 IANA 分配管理。IANA 把这些端口分配给最重要的一些应用程序,让所有的用户都知道,当一种新的应用程序出现后,IANA必须为它指派一个公认端口。
    常用的公认端口有:
    FTP : 21
    TELNET : 23
    SMTP : 25
    DNS : 53
    TFTP : 69
    HTTP : 80
    SNMP : 161
    (2)注册端口(Registered Ports):从1024-49151。是公司和其他用户向互联网名称与数字地址分配机构(ICANN)登记的端口号,利用因特网的传输控制协议(TCP)和用户数据报协议(UDP)进行通信的应用软件需要使用这些端口。在大多数情况下,这些应用软件和普通程序一样可以被非特权用户打开。
    (3)客户端使用的端口号:49152~65535.这类端口号仅在客户进程运行时才动态选择,因此又叫做短暂端口号。被保留给客户端进程选择暂时使用的。也可以理解为,客户端启动的时候操作系统随机分配一个端口用来和服务器通信,客户端进程关闭下次打开时,又重新分配一个新的端口。
    总结
    端口就像一道门,外部可以通过不同的端口和本机上不同服务的进程进行交流。而IP 地址和端口标识了接入互联网主机的唯一 一个进程。

    展开全文
  • [TCP/IP] TCP/IP 详解 卷1 协议 第2版 (英文版)

    千次下载 热门讨论 2013-12-28 09:00:19
    [Addison-Wesley Professional] TCP/IP 详解 卷1 协议 第2版 (英文版) [Addison-Wesley Professional] TCP/IP Illustrated Volume 1 The Protocols 2nd Edition (E-Book) ☆ 图书概要:☆ TCP/IP Illustrated, ...
  • 本案例中包含了完整的基于TCP/IP协议的传输一小段视频的代码,含有一个服务端程序和一个客户端程序,服务端开启监听,收到客户端的连接请求后就发送一段视频给客户端,客户端接收并且保存。
  • 本文主要介绍了如何开发基于TCPIP 协议网络编程的自定义通讯协议. 在QNX.Linux和Windows三种不同的操作系统平台下实现多节点间的互相通讯。 测试结果表明,该协议可以方便高效地实现多平台下控制节点间的相互...
  • Linux TCP/IP 协议栈分析

    2011-12-29 18:52:43
    Linux TCP IP 协议栈分析 Linux2.6 协议栈源代码分析
  • Linux TCP/IP 协议栈数据发送流程

    千次阅读 2017-08-13 16:50:05
    tcp protocal
    一.linux内核网络栈代码的准备知识

    1. linux内核ipv4网络部分分层结构

    BSD socket层: 这一部分处理BSD socket相关操作,每个socket在内核中以struct socket结构体现。这一部分的文件主要有:/net/socket.c /net/protocols.c etc 

    INET socket层:BSD socket是个可以用于各种网络协议的接口,而当用于tcp/ip,即建立了AF_INET形式的socket时,还需要保留些额外的参数,于是就有了struct sock结构。文件主要

      有:/net/ipv4/protocol.c /net/ipv4/af_inet.c /net/core/sock.c etc 
    TCP/UDP层:处理传输层的操作,传输层用struct inet_protocol和struct proto两个结构表示。文件主要有:

      /net/ipv4/udp.c /net/ipv4/datagram.c /net/ipv4/tcp.c /net/ipv4/tcp_input.c /net/ipv4//tcp_output.c /net/ipv4/tcp_minisocks.c /net/ipv4/tcp_output.c /net/ipv4/tcp_timer.c

      etc   
    IP层:处理网络层的操作,网络层用struct packet_type结构表示。文件主要有:/net/ipv4/ip_forward.c  ip_fragment.c ip_input.c ip_output.c etc. 

    数据链路层和驱动程序:每个网络设备以struct net_device表示,通用的处理在dev.c中,驱动程序都在/driver/net目录下。

     

    4.2 数据发送流程图

     

    4.3 数据接收流程图

     

     

     

    1.1 内核源代码的组织

    表1是本文要使用的Linux Net/4网络源代码的,其中大部分位于目录/usr/src/linux-2.2.x/net,列表如下,

    插口层 
    BSD Socket 
    /net/socket.c 
    /net/protocols.c 
    INET Socket 
    /ipv4/protocol.c 
    /ipv4/af_inet.c 
    /net/ipv4/core/sock.c 
    协议层 
    TCP/UDP 
    /net/ipv4/udp.c 
    /net/ipv4/datagram.c 
    /net/ipv4/tcp_input.c 
    /net/ipv4//tcp_output.c 
    /net/ipv4/tcp.c 
    /net/ipv4/tcp_minisocks.c 
    /net/ipv4/tcp_timer.c etc... 
    IP 
    /net/ipv4/ip_forward.c 
    /net/ipv4/ip_fragment.c 
    /net/ipv4/ip_input.c 
    /net/ipv4/ip_output.c 
    接口层 
    Ethernet 
    ......

    1.2  Linux中TCP/IP网络层次结构与实现 
    Linux通过一组相邻的软件层实现了TCP/IP模型,它由BSD Socket层、INET Socket层、传输层、网络层,和链路层构成。应用程序使用系统调用向内核函数传递参数和数据从而进入内核空间,由内核中注册的内核函数对相应的数据结构进行处理。

    Linux的TCP/IP层次结构和实现方式如图 1 所示。

    展开全文
  • 本系统通过对linux内核中网络TCP/IP网络协议栈的实现进行分析,自主实现了该协议栈,并设计了相应的网络层和传输层报文格式,对于学习linux网络内核编程的同学很有参考价值
  • 深入浅出linux tcp_ip协议栈 清晰版 共4部分,要下就全部下,不然浪费分
  • TCP/IP协议族 详解(TCP/IP四层模型、OSI七层模型)

    千次阅读 多人点赞 2018-04-12 21:53:09
    TCP/IP协议族(TCP/IP Protocol Suite,或TCP/IP Protocols),简称TCP/IP。由于在网络通讯协议普遍采用分层的结构,当多个层次的协议共同工作时,类似计算机科学中的堆栈,因此又被称为TCP/IP协议栈(英语:TCP/IP ...
  • TCP/IP协议竟然有这么多漏洞?

    万次阅读 多人点赞 2021-04-26 23:12:14
    TCP/IP协议作为网络的基础协议,从设计之初并没有考虑到网络将会面临如此多的威胁,导致出现了许多攻击方法。由于网络中的通讯都源于数据包,通过对数据包的自动采集与解码分析,可以快速发现与追溯网络攻击。 ...
  • LinuxTCP IP协议实现及嵌入式应用,北京航空航天大学出版社
  • Linux TCP IP 协议栈分析

    2011-11-23 22:18:40
    Linux TCP IP 协议栈分析Linux TCP IP 协议栈分析Linux TCP IP 协议栈分析
  • tcp/ip协议的c语言实现

    2011-06-24 11:26:26
    tcpip协议的c语言相关实现.。。服务器与客户端程序
  •  TCPTCP/IP体系中面向连接的运输层协议,提供全双工的和可靠交付的服务。TCP报文段的格式如下图所示 源端口和目的端口:各占2个字节,是运输层与应用层的服务接口。 序号:占4个字节。TCP连接...
  • https://www.cnblogs.com/onepixel/p/7092302.html
  • linux聊天工具,基于TCP协议,使用c语言编写,Ubuntu16.04下测试通过。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 199,921
精华内容 79,968
关键字:

linux的tcp/ip协议

linux 订阅