无线电的历史

Nikola Tesla(1856年7月10日-1943年1月7日)

尼古拉-特斯拉,生于欧洲奥地利帝国,后加入美国国籍
尼古拉-特斯拉,生于欧洲奥地利帝国,后加入美国国籍

尼古拉·特斯拉 | 维基百科

尼古拉·特斯拉 | 百度百科

通过电磁感应发现了交流电(远距离传输电流)和无线电(远距离传输电磁波)这两个重大发明改变世界。

什么是电磁波?

我的理解能量的流动给周围带来变化,通过的电流就好比正在扔进池塘里面的石头

电磁波就是石头撞击水面的波纹。电磁波是可以在真空传递的,在真空是可以达到光速的。

水面的波浪多少又称为射频频率,射频就是一定时间内波浪产生多少次。

波浪在一定时间内产生的越多,那么意味着

高射频可以传递的更远,更快, 携带更多的信息, 前提是石头够大。

如果石头动能只有一点点,小石头激发的能量是有限的,假设小石头也产生了高射频,

但是这些射频没有力量,穿透不了高密度物质,到了一定的范围就消失了,就类似家用wifi,手机热点。

电磁波是如何携带数据的?

我的理解就是,虽然射频的大小是固定的,但是却可以通过某种工具控制波浪的宽度(波长)

波浪特别宽那就是0,波浪正常就是1。数据就是这样传递的。

电磁波如何做到互不干扰?

电磁波是一种比较特殊的东西,两个频率不同的电磁波就好比石头和水,它们两个虽然交融在一起

却可以轻易分离出来,从而互不干扰.

生活中的电磁波的规范与应用

美国电子电气工程师协会IEEE(Institute of Electrical and Electronics Engineers)
IEEE | 百度百科

常见的电磁波通信标准: 802.1x
802.1x | 百度百科

802.1x, Client/Server的访问控制和认证协议,局域网的一种访问传输规则。

网线的历史

亚历山大·贝尔|电话:使用电流传递声音
亚历山大·贝尔 | 百度百科

在很早以前人们用铜线传输数据,但是距离有限,数据损耗高,传输的数据少,但是它还可以供电.

在19世纪末和20世纪初,人们使用提出使用玻璃纤维,利用光来传输数据, 也就是现在的光纤.

光纤传递数据快,多,损耗低,制作成本低,工艺要求高.组网要求高,对硬件要求比较高.

光纤|利用光的反射传递数据
光纤 | 维基百科

双绞线 1881贝尔发明| 静距离传输,实惠,便捷的选择
双绞线 | 百度百科
双绞线 | 维基百科

双绞线通过缠绕在一起消除两根方向,频率,相同导线间的磁场干扰,并加强了磁场信号
{% image /img/net_line.png '常见的网线,其材质有铜>铝>铁' '' %}
EIA/TIA 568B(网络连网络)标准:橙白、橙、绿白、蓝、蓝白、绿、棕白、棕

1 输出数据 (+) 

2 输出数据 (-) 

3 输入数据 (+) 

4 保留为电话使用(当1236出现故障时,自动切入使用状态);

5 保留为电话使用(当1236出现故障时,自动切入使用状态);

6 输入数据 (-) 

7 保留为电话使用(当1236出现故障时,自动切入使用状态); 

8 保留为电话使用(当1236出现故障时,自动切入使用状态);

IP、掩码,网关

ip是你的网络地址标识,但是一个ip是无符号的32位字节数,ip是有限的。

ip的分配肯定不能由一台机器完成,网关来把一台机器分成多个机器来完成分配ip的问题,

但是多个网关有可能会分配重复的ip地址。当路由器收一个数据包但是有两个相同的ip地址。

实际上这两个ip地址是属于不同的网关的, 怎么判断呢?子网掩码来解决这个问题

掩码越小意味着你离网络的根节点越近,掩码标识你属于哪个网关。

但是这样拓扑式组网,ip和掩码字节大小始终是有限的

ipv4意味着最多提供26亿公网ip地址。

网关是自己设置的特殊ip,是局域网的出口,通常分配ip由路由的DHCP自动完成


电信号协议TCP/IP

在1970年美国国防高级研究计划局(DARPA),

Vint Cerf(生于美国:谷歌大佬)和Bob Kahn(美国 :麻省教授)

这两人也被称为互联网之父。TCP和IP协议就是由两人设计。

设计目的:为了组网通信,要求稳定,可靠,便捷.


TCP建立连接

测试 环境win10 编译工具VS2019 和抓包工具 wirehark

server.cpp

#include<WinSock2.h>

#pragma warning(disable:4996)//将某个警报置为失效
#pragma comment(lib,"ws2_32.lib")//将ws2_32.lib加入到工程文件中
#include<stdio.h>

int main(int argc, char* argv[])
{            
    //请求版本号
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);

    if (HIBYTE(wsaData.wVersion) != 2 || LOBYTE(wsaData.wVersion) != 2)
    {
        printf("请求版本失败!");
        return -1;
    }
    //创建socket
    SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);


    //创建协议地址族
    SOCKADDR_IN addr = { 0 };
    addr.sin_family = AF_INET;
    addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    addr.sin_port = htons(10086);

    //绑定
    int r = bind(serverSocket, (sockaddr*)&addr, sizeof addr);

    //监听
    r = listen(serverSocket, 10);

    //接受客户端连接
    SOCKADDR_IN cAddr = { 0 };
    int size = sizeof cAddr;
    SOCKET clientSocket = accept(serverSocket, (sockaddr*)&cAddr, &size);
    printf("init ok!\n");
    //通信
    char buf[256];
    while (1)
    {
        memset(buf, 0, 256);
        r = recv(clientSocket, buf, 255, NULL);
        if (r > 0)
        {
            printf("来自%s的数据:%s\n", inet_ntoa(cAddr.sin_addr), buf);
        }

    }
    //断开连接
    closesocket(clientSocket);

    //清楚协议信息
    WSACleanup();
    return  0;

}

client.pp

#include<WinSock2.h>
#include<WS2tcpip.h>
#include<stdio.h>
#include<iostream>
#include<cstring>

#pragma warning(disable:4996)
#pragma comment(lib,"ws2_32.lib")
#include<stdio.h>

int  main(int argc, char* argv[])
{
    //请求版本号
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);

    if (HIBYTE(wsaData.wVersion) != 2 || LOBYTE(wsaData.wVersion) != 2)
    {
        printf("请求版本失败!");
        return -1;
    }
    //创建socket
    SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);


    //创建协议地址族
    SOCKADDR_IN addr = { 0 };
    addr.sin_family = AF_INET;
    addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    addr.sin_port = htons(10086);


    //连接
    int r = connect(clientSocket, (sockaddr*)&addr, sizeof addr);
    //通信
    char buf[256];
    while (1)
    {
        printf("请输入发送内容: ");
        scanf("%s", buf);
        r = send(clientSocket, buf, strlen(buf), NULL);
        if (r > 0)
        {
            printf("发送%d字节数据成功\n", r);
        }
    }

}

已知IP头部格式如下

IP头部,总长度20字节

typedef struct _ip_hdr
{
    #if LITTLE_ENDIAN
    unsigned char ihl:4;     //首部长度
    unsigned char version:4, //版本 
    #else
    unsigned char version:4, //版本
    unsigned char ihl:4;     //首部长度
    #endif
    unsigned char tos;       //服务类型
    unsigned short tot_len;  //总长度
    unsigned short id;       //标志
    unsigned short frag_off; //分片偏移
    unsigned char ttl;       //生存时间
    unsigned char protocol;  //协议
    unsigned short chk_sum;  //检验和
    struct in_addr srcaddr;  //源IP地址
    struct in_addr dstaddr;  //目的IP地址
}ip_hdr;

TCP头部,总长度20字节

typedef struct _tcp_hdr
{
    unsigned short src_port;    //源端口号
    unsigned short dst_port;    //目的端口号
    unsigned int seq_no;        //序列号
    unsigned int ack_no;        //确认号
    #if LITTLE_ENDIAN
    unsigned char reserved_1:4; //保留6位中的4位首部长度
    unsigned char thl:4;        //tcp头部长度
    unsigned char flag:6;       //6位标志
    unsigned char reseverd_2:2; //保留6位中的2位
    #else
    unsigned char thl:4;        //tcp头部长度
    unsigned char reserved_1:4; //保留6位中的4位首部长度
    unsigned char reseverd_2:2; //保留6位中的2位
    unsigned char flag:6;       //6位标志 
    #endif
    unsigned short wnd_size;    //16位窗口大小
    unsigned short chk_sum;     //16位TCP检验和
    unsigned short urgt_p;      //16为紧急指针
}tcp_hdr;

解析客户端的第一个包

TCP第一次建立通信
TCP第一次建立通信

由于只有一台电脑测试TCP,这次TCP通信是不经过路由器的,所以网络协议会显示null/loopback

如果经过路由器的话是会显示源mac地址和目标mac地址和以太网类型的

//Mac头部,总长度14字节
typedef struct _eth_hdr
{
    unsigned char dstmac[6]; //目标mac地址
    unsigned char srcmac[6]; //源mac地址
    unsigned short eth_type; //以太网类型
}eth_hdr;

可以看到52814向10086发送了两个包,客户端向服务端发了两个包,长度分别为为108,84

可以看到10086向52814发了一个包,服务端向客户端发送了一个包,长度为108

TCP的6种标示

SYN(synchronous建立联机) 

ACK(acknowledgement 确认) 

PSH(push传送) 

FIN(finish结束)

RST(reset重置) 

URG(urgent紧急)

TCP建立通信的流程

客户端请求建立联机(SVN), 服务端请求建立联机,并确认(SYN,ACK), 客户端确认(SVN)

解析TCP的第一个包

1.客户端->服务端
1.客户端->服务端

TCP通信的大致流程

TCP建立通信流程
TCP建立通信流程

TCP建立连接的第二个包

2.服务端->客户端
2.服务端->客户端

TCP建立连接的第三个包

3.客户端->服务端
3.客户端->服务端

IP报文结构

IP报文结构
IP报文结构

TCP报文结构

TCP报文结构
TCP报文结构

建立通信后的TCP连接

向服务端发送Hello

发送hello
发送hello

一共有两次通信过程,第一次客户端向服务端push,第二次服务端向客户端确认

1.客户端->服务端
1.客户端->服务端
2.服务端->客户端
2.服务端->客户端

TCP建立连接后的传输数据结构图

TCP数据流程传输图
TCP数据流程传输图

建立连接后,客户端通过服务端发过来的Ack来确认是否存在丢包


断开连接

客户端断开连接
客户端断开连接

客户端向服务端发送一个(RST,ACK)报文,一个重置连接状态的请求

服务端断开连接
服务端断开连接

服务端向客户端发送一个(RST,ACK)报文,一个重置连接状态的请求

任何一端在断线后会发送一个重置连接包,如果这时另一端也断开是不会发出任何包的

如果两方同时断开,同时这个概念有点难,理论上两方都会同时发出重置连接状态包

TCP连接数据传输中,谁要断开,谁就得告知另一方,谁断开,谁负责


电信号协议UDP/IP

用户数据报协议(英语:User Datagram Protocol,缩写:UDP;又称用户数据包协议)

由美国计算机科学家David Patrick Reed在1980设计

UDP是一种无连接的传输层的协议,提供面向事务的简单不可靠信息传送服务

设计目的: 快速传输数据包,减少数据包信息冗余,提升效率和实时性

server.cpp

#include<winsock2.h>
#include<stdio.h>
#include<string.h>
#include<iostream>
#pragma warning(disable:4996);
using namespace std;
#pragma comment(lib,"ws2_32.lib")
#define BUFFER_SIZE 1024
int main() {
    WSADATA WSAData;
    char receBuf[BUFFER_SIZE];
    char Response[] = "";
    if (WSAStartup(MAKEWORD(2, 2), &WSAData) != 0) {
        printf("初始化失败");
        exit(1);
    }
    SOCKET sockServer = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (sockServer == INVALID_SOCKET)
    {
        printf("Failed socket() \n");
        return 0;
    }
    SOCKADDR_IN addr_Server; //服务器的地址等信息
    addr_Server.sin_family = AF_INET;
    addr_Server.sin_port = htons(10086);
    addr_Server.sin_addr.S_un.S_addr = INADDR_ANY;
    if (bind(sockServer, (SOCKADDR*)&addr_Server, sizeof(addr_Server)) == SOCKET_ERROR) {//服务器与本地地址绑定
        printf("Failed socket() %d \n", WSAGetLastError());
        return 0;
    }
    SOCKADDR_IN addr_Clt;

    int fromlen = sizeof(SOCKADDR);
    while (true) {
        int last = recvfrom(sockServer, receBuf, 1024, 0, (SOCKADDR*)&addr_Clt, &fromlen);
        if (last > 0) {      //判断接收到的数据是否为空
            receBuf[last] = '\0';//给字符数组加一个'\0',表示结束了。不然输出有乱码
            if (strcmp(receBuf, "bye") == 0) {
                cout << "聊天结束" << endl;
                closesocket(sockServer);
                return 0;
            }
            else {
                printf("接收到数据(%s):%s\n", inet_ntoa(addr_Clt.sin_addr), receBuf);
            }
        }
        cout << "回复客户端消息:";
        cin >> Response; //给客户端回复消息
        sendto(sockServer, Response, strlen(Response), 0, (SOCKADDR*)&addr_Clt, sizeof(SOCKADDR));
    }

    closesocket(sockServer);

    WSACleanup();
    return 0;

}

client.cpp

#include<winsock2.h>
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#pragma warning(disable:4996);
#pragma comment(lib,"ws2_32.lib")
#define BUFFER_SIZE  1024    //缓冲区大小
int main() {
    SOCKET sock_Client; //客户端用于通信的Socket
    WSADATA WSAData;
    char  receBuf[BUFFER_SIZE]; //发送数据的缓冲区
    char  sendBuf[BUFFER_SIZE]; //接受数据的缓冲区

    if (WSAStartup(MAKEWORD(2, 2), &WSAData) != 0) {
        printf("初始化失败!");
        return -1;
    }    //初始化
    sock_Client = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);//创建客户端用于通信的Socket
    SOCKADDR_IN addr_server;   //服务器的地址数据结构
    addr_server.sin_family = AF_INET;
    addr_server.sin_port = htons(10086);//端口号为10086
    addr_server.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");   //127.0.0.1为本电脑IP地址
    SOCKADDR_IN sock;
    int len = sizeof(sock);
    while (true) {
        cout << "请输入要传送的数据:";
        cin >> sendBuf;
        sendto(sock_Client, sendBuf, strlen(sendBuf), 0, (SOCKADDR*)&addr_server, sizeof(SOCKADDR));
        //int last=recv(sock_Client, receBuf, strlen(receBuf), 0);              // (调用recv和recvfrom都可以)
        int last = recvfrom(sock_Client, receBuf, strlen(receBuf), 0, (SOCKADDR*)&sock, &len);
        if (last > 0) {
            receBuf[last] = '\0';      //给字符数组加一个'\0',表示结束了。不然输出有乱码
            if (strcmp(receBuf, "bye") == 0) {
                cout << "                               服务器不跟我聊天了..." << endl;//当服务器发来bye时,关闭socket
                closesocket(sock_Client);
                break;
            }
            else {
                printf("接收到数据:%s\n", receBuf);
            }

        }

    }
    closesocket(sock_Client);
    WSACleanup();


    return 0;

}

UDP报文格式如下

typedef struct _udp_hdr
{
    unsigned short src_port; //远端口号
    unsigned short dst_port; //目的端口号
    unsigned short uhl;      //udp头部长度
    unsigned short chk_sum;  //16位udp检验和
}udp_hdr;

UDP服务端和客户端启动时并不会建立任何连接

udp结构图
udp结构图
客户端向服务端发送Hello
客户端向服务端发送Hello

相比TCP,UDP没有随机序列号和Flags,也没用指定响应某个数据帧

服务端向客户端发送Hello
服务端向客户端发送Hello

任何一方的断开都不会通知对方

在UDP报文中,IP协议头占了20个字节,UDP头结点占用了8个字节,因为UDP的最大长度为16个比特,

最大长度为65536.也就是说UDP的数据长度最大为65521


TCP和UDP数据校验

都需要用的目的和源IP,目的端口和源端口,数据长度,各个二进制数按位取反再求和。计算复杂

就好像一块玉摔成了两半,协议发来了一半,你通过校验得到另一半,拼一下是否能得到一块完整的

这样来判断传输数据是否正确,首先这样计算端口和ip的精度几乎是100%,数据的正确性至少有99.9%


TCP/IP下的FTP协议

FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一。

FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。其中FTP服务器用来存储文件,

用户可以使用FTP客户端通过FTP协议访问位于FTP服务器上的资源。在开发网站的时候,

通常利用FTP协议把网页或程序传到Web服务器上。此外,由于FTP传输效率非常高,

在网络上传输大的文件时,一般也采用该协议。

FTP就是TCP加一些文件传输下载的指令和规范

ftp登陆流程
ftp登陆流程

首次连接服务端

ftp明文登陆
ftp明文登陆

我用的是明文传输的FTP协议,可能和加密连接的FTP略有不同

在上图我们可以TCP和FTP协议是混用的

1.客户端和服务器建立TCP/IP连接

2.服务器表示启动FTP服务

3.服务器用FTP示已经准备等待用户连接

4.客户端用TCP协议表示知道了

5.客户端用FTP开始上传用户名

6.服务端用FTP表示密码必填

7.客户端用FTP上传密码

8.服务端用FTP表示收到,正在校验中

9.服务端用FTP表示登陆成功

10.客户端用TCP表示知道了

11.客户端使用FTP请求服务端告知自己的系统

12.服务端使用FTP告诉客户端自己为*Windows*  NT(微软网络操作系统)

13.客户端用FTP向服务端请求功能列表

14.服务端用FTP告知客户端功能列表如下

15.服务端用FTP告知客户端支持英文等

16.客户端用TCP告知服务器收到

17.服务器用FTP告诉客户端主机不支持套接字加密连接

18.客户端用TCP表示知道了

客户端请求使用UTF-8编码,客户端知道了。客户端请求列出服务端目录,服务端好的...

客户端上传文件到服务端

上传城堡破坏者的快捷方式
上传城堡破坏者的快捷方式

1.客户端请求使用被动方式上传PASV

PASV    服务端是服务器,服务器把它的端口发过来,客户端负责把数据上传
PORT    客户端是服务器,客户端把自己的端口发过来,服务器从客户端把数据下载
客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。
当需要传送数据时,服务器在命令链路上用 PASV命令告诉客户端:“我打开了一个1024+的随机端口,
你过来连接我”。于是客户端向服务器的1024+端口发送连接请求,建立一条数据链路来传送数据。

2.服务端收到后表示已经开启33002端口准备连接

3.开始建立与服务端的33002端口的TCP连接

4.通过FTP-DATA把城堡破坏者快捷方式数据上传上去,

5.客户端通过TCP告诉服务端上传成功

6.客户端重新请求服务器文件列表

服务端显示文件列表…

服务端下载文件

服务器下载404.html
服务器下载404.html

1.请求服务器开启PASV模式

2.服务器开启PASV模式

3.请求下载当前目录下的/404.html

4.客户端和服务器开始建立TCP连接

5.服务器告诉客户端开启ASCII传输模式

6.开始传输,每传输几次,客户端会实时确认一次

7.服务端告诉客户端传输结束

这样可以看到一个11950字节的404.html分了9次传输,平均每次不大于1327字节
这是因为在以太网中报文段最大传输数据长度为1500
1506个字节 =  数据头部信息54字节 + 长度为1452字节的数据

文件分3次就要响应一次这是因为收到服务器缓冲区大小限制

客户端断开服务器

客户端断开服务器
客户端断开服务器

1.客户端通知服务端结束连接

2.服务端好的,服务端关闭连接

3.客户端好的


TCP/IP下的HTTP协议

http是一个简单的请求-响应协议,它通常运行在TCP之上。

它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。

请求和响应消息的头以ASCII码形式给出;而消息内容则具有一个类似MIME的格式。

HTTP说白了就是一个只提供下载多文本的的协议

就是在TCP下载文件上,扩充了下载文件遇到各种问题的一种协议的补充

访问http网站
访问http网站

1.客户端向服务端建立TCP连接

2.建立成功后,客户端向服务端发起HTTP请求,

3.服务端表示好的

4.服务端把index.html分成7次发了出去

5.服务端把文本传送出去后表示200 OK

7.客户端根据index.html请求对应的其他链接文件

8.服务端依次开始传送其他链接文件,直到客户端不在请求

注意 HTTP 304,当客户端请求服务端返回这个时,表示客户端使用自己本地缓存文件

WINDOWS下的PING/ICMP协议

ICMP(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议簇IP协议簇)的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。

就是一个迅速测试网络道路情况的协议

{% image /img/tcp/icmp.png 'ping www.sht2019.cn' '' %}

ICMP头部,总长度4字节

typedef struct _icmp_hdr
{
    unsigned char icmp_type;   //类型
    unsigned char code;        //代码
    unsigned short chk_sum;    //16位检验和
}icmp_hdr; 

1.发送4次,响应4次,每个ICMP报文为74个字节,平均响应时长为27.5ms

第一个发送的ICMP报文
第一个发送的ICMP报文

1.在下面对应的type:8,code:0意味着ping请求发出

ICMP消息类型

TYPE CODE Description Query Error
0 0 Echo Reply——回显应答(Ping应答) x
3 0 Network Unreachable——网络不可达 x
3 1 Host Unreachable——主机不可达 x
3 2 Protocol Unreachable——协议不可达 x
3 3 Port Unreachable——端口不可达 x
3 4 Fragmentation needed but no frag. bit set——需要进行分片但设置不分片比特 x
3 5 Source routing failed——源站选路失败 x
3 6 Destination network unknown——目的网络未知 x
3 7 Destination host unknown——目的主机未知 x
3 8 Source host isolated (obsolete)——源主机被隔离(作废不用) x
3 9 Destination network administratively prohibited——目的网络被强制禁止 x
3 10 Destination host administratively prohibited——目的主机被强制禁止 x
3 11 Network unreachable for TOS——由于服务类型TOS,网络不可达 x
3 12 Host unreachable for TOS——由于服务类型TOS,主机不可达 x
3 13 Communication administratively prohibited by filtering——由于过滤,通信被强制禁止 x
3 14 Host precedence violation——主机越权 x
3 15 Precedence cutoff in effect——优先中止生效 x
4 0 Source quench——源端被关闭(基本流控制)
5 0 Redirect for network——对网络重定向
5 1 Redirect for host——对主机重定向
5 2 Redirect for TOS and network——对服务类型和网络重定向
5 3 Redirect for TOS and host——对服务类型和主机重定向
8 0 Echo request——回显请求(Ping请求) x
9 0 Router advertisement——路由器通告
10 0 Route solicitation——路由器请求
11 0 TTL equals 0 during transit——传输期间生存时间为0 x
11 1 TTL equals 0 during reassembly——在数据报组装期间生存时间为0 x
12 0 IP header bad (catchall error)——坏的IP首部(包括各种差错) x
12 1 Required options missing——缺少必需的选项 x
13 0 Timestamp request (obsolete)——时间戳请求(作废不用) x
14 Timestamp reply (obsolete)——时间戳应答(作废不用) x
15 0 Information request (obsolete)——信息请求(作废不用) x
16 0 Information reply (obsolete)——信息应答(作废不用) x
17 0 Address mask request——地址掩码请求 x
18 0 Address mask reply——地址掩码应答
响应的icmp报文
响应的icmp报文

1.type:0,code:0对应着ping响应,响应的icmp报文还带了一个时间戳,及传过来的数据

2.我们常见的请求超时,对应的type:8,code:0就是指这个

ICMP里面的TTL

一个数据包在网络里面如果没有找到目的地是不能够无限发下去的,

由路由器去计数和停止该数据包的发送,数据包每经过一个路由器TTL就要减一

直到为0,路由器就会舍弃发送该数据包。ttl的值各个操作系统都不一样,我的win10就是64

响应的icmp报文
响应的icmp报文

ARP报文

地址解析协议,即ARP(Address Resolution Protocol),

用于局域网内主机确定目标ip和物理地址的,通过IP地址查找MAC地址

广播报文ARP
广播报文ARP

1.可以看到同一个问题会每个IP都问一遍,这就是广播

ARP报文结构
ARP报文结构
ARP报文结构解析
ARP报文结构解析
ARP的响应过程
ARP的响应过程

OICQ/Open I Seek You

是腾讯为QQ通讯设计的一款协议,同时用到了UDP和TCP

OICQ规范了很多通信用户流程,用户数据加密比较复杂的一个协议

QQ的登陆过程,实际QQ不止使用了OICQ协议
QQ的登陆过程,实际QQ不止使用了OICQ协议

OICQ的报文格式

状态

版本

命令

序列号

QQ号

加密数据/这里面包含了非常重要难以解密的东西

由于在QQ的登陆过程中会不断切换服务的ip地址,一直不重复,而且有多个目标服务器地址

在通信过程中有多种协议,分析QQ协议有点难度


QQ离线传输文件

传输txt文件
传输txt文件
传输png文件
传输png文件

SSDP

简单服务发现协议SSDP,Simple Service Discovery Protocol)是一种应用层协议,

是构成通用即插即用(UPnP)技术的核心协议之一。

UPnp通用即插即用(英语:Universal Plug and Play,简称UPnP**)

是由“通用即插即用论坛”(UPnP™ Forum),https://openconnectivity.org/

推广的一套网络协议。该协议的目标是使家庭网络(数据共享、通信和娱乐)

和公司网络中的各种设备能够相互无缝连接,并简化相关网络的实现。

UPnP通过定义和发布基于开放、因特网通讯网协议标准的UPnP设备控制协议来实现这一目标。

ssdp查询服务
ssdp查询服务
ssdp响应
ssdp响应
upnp:rootdevice 仅搜索网络中的根设备 
uuid:device-UUID 查询UUID标识的设备 
urn:schemas-upnp-org:device:device-Type:version 查询device-Type字段指定的设备类型,设备类型和版本由UPNP组织定义

TLS协议

传输层安全性协议(英语:Transport Layer Security,缩写作tls)

以这个协议来创建安全连线,发送数据

TLS协议是可选的,必须配置客户端和服务器才能使用

设计目的: 是网景公司主要用于Web的安全传输协议

访问www.baidu.com
访问www.baidu.com

ssl的通信过程

访问www.baidu.com
访问www.baidu.com

什么是SSL证书?

就是用来确认服务器真假的, 浏览器通过服务器发来的证书去网上的证书服务器查询是否真的

可信的 SSL 数字证书包括一个公共密钥和一个私用密钥。

公共密钥用于加密信息,私用密钥用于解译加密的信息

SSL通信时互相用对方的公钥加密,用自己的私钥加密,

交换过程中通过对方的SSL证书和数字签名来证明双方的真假