Wireshark 使用

 

 


 

 设置过滤器  ip.sre == 192.168.1.104

显示过滤器

 

 捕获过滤器

 

 

 同时可以选择表达式 识别不同协议

 

 

 

 

 

 

 

 


 

最简单的网络包分析  ping

 

 

设置过滤器arp 点击开始抓包

时间是以开始抓包时刻记录

source 为发数据包源地址  并根据mac地址翻译厂商

info 大概就是谁是 101  我是104   ( ping 192.168.101)

 

 

 通过应答知道了104的mac地址

 

 并存入缓存中了

 

 

 

 

 


 

ICMP

 

 

 windows ping 四次

 看了下自己手机的ip  100  果然dest就是小米

 

 

 

 icmp 会对消息进行checksum  

 


 

TCP 

无论哪一方向对端发送数据都必须先建立连接

 

 

 

 

从示例网站下载包

SampleCaptures · Wiki · Wireshark Foundation / wireshark · GitLab

查看telnet

基于tcp的三次握手

 

 

第一次

第一次握手:建立连接时,客户端发送syn包(seq=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。 [3] 

第二次

第二次握手服务器收到syn包,必须确认客户端的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。 [3] 

第三次

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。 [3] 
完成三次握手,客户端与服务器开始传送数据,在上述过程中,还有一些重要的概念: [3] 

 

 

udp协议


 

众所周知tcp是面向连接的可靠的网络协议

udp是只管发送的不可靠的网络协议

那么学习就先从udp开始把

(25条消息) socket--Linux下的广播_入门到跑路的博客-CSDN博客

代码直接拷贝的这里了

先拿来主义在开始学hhh

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<errno.h>
#include<error.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<string.h>
#include<unistd.h>

int main()
{
    int fd;
    struct sockaddr_in addr;
    fd = socket(AF_INET,SOCK_DGRAM,0);
    if(fd < 0)
    {
        printf("socket error:%s\n",strerror(errno));
        return -1;
    }

    addr.sin_family = AF_INET;
    addr.sin_port = htons(12345);
    addr.sin_addr.s_addr = inet_addr("192.168.10.255");

    int broad_flag = 1;
    setsockopt(fd,SOL_SOCKET,SO_BROADCAST,  &broad_flag,sizeof(int));

    char *str = "hello world!";

    while(1)
    {
        int ret = sendto(fd,str, strlen(str)+1,0,(struct sockaddr *)&addr,sizeof(struct sockaddr_in));
        if(ret < 0)
        {
            printf("sendto error:%s\n",strerror(errno));
            break;
        }
        printf("sendto ok!\n");
        sleep(1);
    }

    close(fd);

    return 0;
}

大概就是设置ip 不停的向外广播helloworld

先跑起来然后再来慢慢理解

运行然后我们打开wireshark

 

 

 

 

 

 追踪下流可以看到广播的消息

 

 

 

这里的Ethernet II 代表的以太网协议帧

Internet Protocol 代表的Internet协议

user data protocol 欸这里 就可以猜到是udp协议了

可以看到对应的网络的七层模型的数据链路层 网络层 传输层

 

 

 

 

 

 

 

 

 

 

 

 

先预习一波把


 

 

 

 低地址放在大位就是大段

1字节序

 

 

 

 发送数据永远都是低地址先出去 所以需要区分大段小段

但是socket不区分 

而是分为主机字节序 和网络字节序

_to_

 

 

 

2.对齐

 

 12 char  

 

编译器对齐结构体 为了减少取值周期 

address/sizeof   32bit 4个字节

5/4  6/4 7/4

 

 

 解决方式 :不对齐

3.类型长度问题

char  有无符号  int 长度 %d显示有符号

解决:统用类型 int32_t   uint32_t  int8_t  uint8_t

AF 协议族 ipv4可以支持 udp tcp ..

为了统一不同的网路协议 抽象出的套接字 就是文件描述符

可以封装到流中。。一切接文件

 

 协议族  某一个protcol 实现这个中type类型的传输

实现的type类型

流:只要接受到包 一定确保包是正确的  点对点一对一  【封装管道】

 

 

 

 

 流式套接字 简单一些 以字节流为单位

 

 

报socket

 

 被动先运行 因为要收消息

并且被动收东西 所以不能省略socket地址 

必须先告诉人家我是哪个ip哪个端口

 

 不用对齐  而且确定大小位数

端口应该使用1024以上

 

 

 

1:

 

 

 

2:

这里的sockaddr是一个抽象的结构体 因为其类型取决于用的什么协议族

 

 

注意这里由于是接受端 所以本机的ip 和端口确定好

还要给对方发过去  所以端口也要转化为网络字节序

 

 

3.

 

re

 

 

posted @ 2021-10-14 23:41  张喆坤  阅读(52)  评论(0)    收藏  举报