<TCP/IP>链路层小结

   图片和部分内容转载自Chang Zhao


    这章大致介绍了以太网以太网帧的格式网桥和交换机无线局域网(Wi-Fi),点到点协议MTU(最大传输单元)的知识点,所谓链路,在此可以解释为 IP数据报传递所在的介于发送方和接受方之间的通信路径,而链路层的存在就是为了IP的发送和接收

  以太网


   以太网是一种广播网络,包括一个或多个站,连接到一个共享的介质(如电缆)上,然而当每个站都想发送数据时,就会不可避免的出现冲突。因此每个以太网接口都会实现一种分布式算法,称为带冲突(碰撞)检测的载波侦听多路访问CSMA/CD),它可以协调哪些站可以访问共享的介质,用于降低成本提高效率,也促进了以太网技术的普及

    

 

   CSMA/CD具体实现方法如下:

  • 一个站(如计算机)首先检测目前网络上正在发送的信号,并在网络空闲时发送自己的帧
  • 如果其他站也刚好同时发送,而且两信号并碰撞了,在此情况下,这两个站都等待一个随机时间,然后再次发送,如果再碰撞重复此过程
  • 在任何给定时间内,网络中只能有一个帧在传输,最终每个站都会得到机会发生,或者在尝试一定次数后超时(传统以太网为16次)

  随着以太网的发展,传输速度越来越快,为了跟上发展,每个站之间的线路已不再共享,而是提供了一个专用的星形拓扑结构,交换机(switch)应运而生

  以太网帧的格式


    这里说得帧其实就是链路层上传输的PDU(协议数据单元),所有的以太网帧都有一个共同的格式,结构图如下

 

   帧的开始是一个前导字段,目的是为了同步,SFD为起始分隔符,标识着以太网帧的开始,DST为目的地址,SRC为源地址,两者合称MAC地址或物理地址

  网桥和交换机


   网桥或交换机用于连接多物理的链路层网络(如一对物理的以太网段)或成组的站,交换机(switch)本质上是高性能的网桥(bridge)

   正如上面提到过的,局域网中的每个站之间的线路变成不共享,而是由以太网交换机(Ethernet Switch)实现了一个专用的星形拓扑结构。

  

    

  • 交换机为以太网中的每个站提供同时发送和接受数据的能力。
  • 每个站使用一条专用的线路连接到一个交换机端口(port),在这种情况下,以太网以全双工方式运行,不需要使用 CSMA/CD 算法。
  • 交换机可以通过交换机端口级联(interconnect)来形成更大的以太网。这种端口叫做“上行(uplink)端口”

  

  下面介绍一下MAC学习

  • 每个交换机都有自己的MAC地址
  • 每个交换机都有一张表(过滤数据库),记录着交换机基于每个端口的地址列表
  • 交换机原来的数据库是空的,每当他接收到一个目的地不是自己的帧时,它便为所有端口都做一个备份,并向所有其他端口发生这个帧的备份
  • 由于站可能出现移动,网卡更换,MAC地址改变等情况,交换机会在每次学习一个地址之后,启动一个默认时间为5分钟的计时器,如果没有在倒数计时这段时间里看到这个地址,则将这个地址删掉

  

 

  无限局域网(Wi-Fi)


   待续

  点到点协议(PPP)


  • PPP是一种在串行链路上传输IP数据报的方法
  • 它实际上是一个协议集合,它支持建立链路的基本方法称为LCP链路控制协议),在LCP建立基本链路之后,用于各种协议(包括IPv4,IPv6和非IP协议)建立网络层链路
  • 用于在两个节点之间建立直接连接的数据链路层通信协议。PPP 操作只关注一条链路的两端,不需要像 MAC 协议或者 Wi-Fi 那样处理共享资源访问的问题

  MTU


  •  在很多链路层网络(如以太网)中,携带高层协议PDU的帧大小是有限制的,这种特征被称为MTU(最大传输单元),如果IP需要发生一个数据报,但是比MTU大,那么IP会通过分片将数据报分解成比MTU小的分片
  • 当两台主机跨越多种网络通信时,每种不同的链路可能有不同大小的 MTU。因此,在包含所有链路的整个网络路径上,最小的 MTU 叫做 路径 MTU

     

  

转载于:https://www.cnblogs.com/peacepeacepeace/p/8681837.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在你提供的引用内容中,有关于使用`#include <arpa/inet.h>`头文件的说明。根据这个头文件的说明,我们可以使用其中的函数和结构体,而不需要重新定义。所以,在你提供的代码中,不需要重新定义`struct in_addr`。 以下是使用`#include <pcap.h>`、`#include <netinet/ip.h>`和`#include <netinet/tcp.h>`的示例代码: ```c #include <pcap.h> #include <netinet/ip.h> #include <netinet/tcp.h> int main() { // 打开网络设备 pcap_t *handle; char errbuf[PCAP_ERRBUF_SIZE]; handle = pcap_open_live("eth0", BUFSIZ, 1, 1000, errbuf); if (handle == NULL) { printf("Couldn't open device: %s\n", errbuf); return 1; } // 抓取数据包 struct pcap_pkthdr header; const u_char *packet; packet = pcap_next(handle, &header); if (packet == NULL) { printf("No packet found.\n"); return 1; } // 解析IP头部 struct ip *ip_header; ip_header = (struct ip *)(packet + 14); // 偏移14字节,跳过以太网头部 printf("Source IP: %s\n", inet_ntoa(ip_header->ip_src)); printf("Destination IP: %s\n", inet_ntoa(ip_header->ip_dst)); // 解析TCP头部 struct tcphdr *tcp_header; tcp_header = (struct tcphdr *)(packet + 14 + ip_header->ip_hl * 4); // 偏移14字节 + IP头部长度 printf("Source Port: %d\n", ntohs(tcp_header->th_sport)); printf("Destination Port: %d\n", ntohs(tcp_header->th_dport)); // 关闭网络设备 pcap_close(handle); return 0; } ``` 这段代码使用了libpcap库来捕获网络数据包,并解析其中的IP头部和TCP头部。其中,`inet_ntoa()`函数用于将IP地址转换为字符串格式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值