精华内容
下载资源
问答
  • (推荐定位信息数据格式) $GPRMC,HHMMSS.SS,A,DDMM.MMM,N,DDDMM.MMM,W,Z.Z,Y.Y,DDMMYY,D.D,V*CC 例: $GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50 字段0:$GPRMC,语句ID,表明该...
        
    点击上方蓝字[协议分析与还原]关注我们

     整理的GPS有关的协议分析资料。


    之前分析一些车载设备的流量时,有部分经验,在这里和大家分享。


    产生这些流量的设备通常是实体终端设备,里面装有处理芯片,与GPS通信,也通过运营商的网络,与服务器通信,将设备状态和位置这些数据传递到服务器保存。


    这些设备与服务器通信,数据没有那么复杂,一般直接使用TCP/IP封装GPS协议内容进行,服务器只需要相应解析即可获得各项内容,降低了设计开发成本。


    GPS协议标准目前常用到的是NMEA-0183,很显然,这是由NMEA发布的一个标准。


    NMEA是National Marine Electronics Association ,即美国国家海洋电子协会的缩写,NMEA是GPS的管理者,为方便GPS的推广应用,发布了一系列GPS协议的标准格式。

    NMEA-0183就是GPS协议标准的一个,它的早期版本为NMEA-0180和NMEA-0182。虽然它现在仍然用得很多,但时光的车轮在前进,它将会逐渐被最新的NMEA 2000所替代。



    NMEA-183是一个基于ASCII的串行通信协议,它由一个个的语句组成,理解起来很简单。


    下面对它的一些常用的语句进行举例说明,这些,是协议分析中会碰到的。


    这些常用的NMEA-0183语句如下:


    GPGGA(定位信息)


    $GPGGA,HHMMSS.SS,DDMM.MMMM,S,DDDMM.MMMM,S,N,QQ,PP.P,SAAAAA.AA,M,±XXXX.XX,M,SSS,AAAA*CC

    例:

    $GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,M,19.7,M,,,0000*1F

    字段0:$GPGGA,语句ID,表明该语句为Global Positioning System Fix Data(GGA)GPS定位信息

    字段1:UTC 时间,hhmmss.sss,时分秒格式

    字段2:纬度ddmm.mmmm,度分格式(前导位数不足则补0)

    字段3:纬度N(北纬)或S(南纬)

    字段4:经度dddmm.mmmm,度分格式(前导位数不足则补0)

    字段5:经度E(东经)或W(西经)

    字段6:GPS状态,0=不可用(FIX NOT valid),1=单点定位(GPS FIX),2=差分定位(DGPS),3=无效PPS,4=实时差分定位(RTK FIX),5=RTK FLOAT,6=正在估算

    字段7:正在使用的卫星数量(00 - 12)(前导位数不足则补0)

    字段8:HDOP水平精度因子(0.5 - 99.9)

    字段9:海拔高度(-9999.9 - 99999.9)

    字段10:单位:M(米)

    字段11:地球椭球面相对大地水准面的高度 WGS84水准面划分

    字段12:WGS84水准面划分单位:M(米)

    字段13:差分时间(从接收到差分信号开始的秒数,如果不是差分定位将为空)

    字段14:差分站ID号0000 - 1023(前导位数不足则补0,如果不是差分定位将为空)

    字段15:校验值


    GPGSA(当前卫星信息)


    $GPGSA,A,B,CC,DD,EE,FF,GG,HH,II,JJ,KK,MM,NN,OO,P.P,Q.Q,R.R*CC

    例:

    $GPGSA,A,3,01,20,19,13,,,,,,,,,40.4,24.4,32.2*0A

    字段0:$GPGSA,语句ID,表明该语句为GPS DOP and Active Satellites(GSA)当前卫星信息

    字段1:定位模式(选择2D/3D),A=自动选择,M=手动选择

    字段2:定位类型,1=未定位,2=2D定位,3=3D定位

    字段3:PRN码(伪随机噪声码),第1信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

    字段4:PRN码(伪随机噪声码),第2信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

    字段5:PRN码(伪随机噪声码),第3信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

    字段6:PRN码(伪随机噪声码),第4信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

    字段7:PRN码(伪随机噪声码),第5信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

    字段8:PRN码(伪随机噪声码),第6信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

    字段9:PRN码(伪随机噪声码),第7信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

    字段10:PRN码(伪随机噪声码),第8信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

    字段11:PRN码(伪随机噪声码),第9信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

    字段12:PRN码(伪随机噪声码),第10信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

    字段13:PRN码(伪随机噪声码),第11信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

    字段14:PRN码(伪随机噪声码),第12信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

    字段15:PDOP综合位置精度因子(0.5 - 99.9)

    字段16:HDOP水平精度因子(0.5 - 99.9)

    字段17:VDOP垂直精度因子(0.5 - 99.9)

    字段18:校验值


    GPGSV(可见卫星信息)


    $GPGSV,T,M,N,II,EE,AAA,SS,…II,EE,AAA,SS,*CC

    例:

    $GPGSV,3,1,10,20,78,331,45,01,59,235,47,22,41,069,,13,32,252,45*70

    字段0:$GPGSV,语句ID,表明该语句为GPS Satellites in View(GSV)可见卫星信息

    字段1:本次GSV语句的总数目(1 - 3)

    字段2:本条GSV语句是本次GSV语句的第几条(1 - 3)

    字段3:当前可见卫星总数(00 - 12)(前导位数不足则补0)

    字段4:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)

    字段5:卫星仰角(00 - 90)度(前导位数不足则补0)

    字段6:卫星方位角(00 - 359)度(前导位数不足则补0)

    字段7:信噪比(00-99)dbHz

    字段8:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)

    字段9:卫星仰角(00 - 90)度(前导位数不足则补0)

    字段10:卫星方位角(00 - 359)度(前导位数不足则补0)

    字段11:信噪比(00-99)dbHz

    字段12:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)

    字段13:卫星仰角(00 - 90)度(前导位数不足则补0)

    字段14:卫星方位角(00 - 359)度(前导位数不足则补0)

    字段15:信噪比(00-99)dbHz

    字段16:校验值


    GPRMC(推荐定位信息数据格式)


    $GPRMC,HHMMSS.SS,A,DDMM.MMM,N,DDDMM.MMM,W,Z.Z,Y.Y,DDMMYY,D.D,V*CC

    例:

    $GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50

    字段0:$GPRMC,语句ID,表明该语句为Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐最小定位信息

    字段1:UTC时间,hhmmss.sss格式

    字段2:状态,A=定位,V=未定位

    字段3:纬度ddmm.mmmm,度分格式(前导位数不足则补0)

    字段4:纬度N(北纬)或S(南纬)

    字段5:经度dddmm.mmmm,度分格式(前导位数不足则补0)

    字段6:经度E(东经)或W(西经)

    字段7:速度,节,Knots

    字段8:方位角,度

    字段9:UTC日期,DDMMYY格式

    字段10:磁偏角,(000 - 180)度(前导位数不足则补0)

    字段11:磁偏角方向,E=东W=西

    字段16:校验值


    GPVTG(地面速度信息)


    $GPVTG,TTT,C,TTT,C,GGG.GG,U,GGG,GG,U*CC

    例:

    $GPVTG,89.68,T,,M,0.00,N,0.0,K*5F

    字段0:$GPVTG,语句ID,表明该语句为Track Made Good and Ground Speed(VTG)地面速度信息

    字段1:运动角度,000 - 359,(前导位数不足则补0)

    字段2:T=真北参照系

    字段3:运动角度,000 - 359,(前导位数不足则补0)

    字段4:M=磁北参照系

    字段5:水平运动速度(0.00)(前导位数不足则补0)

    字段6:N=节,Knots

    字段7:水平运动速度(0.00)(前导位数不足则补0)

    字段8:K=公里/时,km/h

    字段9:校验值


    GPGLL(地理定位信息)


    $GPGLL,DDMM.MMMM,S,DDDMM.MMMM,S,HHMMSS.SS,S*CC

    例:

    $GPGLL,4250.5589,S,14718.5084,E,092204.999,A*2D

    字段0:$GPGLL,语句ID,表明该语句为Geographic Position(GLL)地理定位信息

    字段1:纬度ddmm.mmmm,度分格式(前导位数不足则补0)

    字段2:纬度N(北纬)或S(南纬)

    字段3:经度dddmm.mmmm,度分格式(前导位数不足则补0)

    字段4:经度E(东经)或W(西经)

    字段5:UTC时间,hhmmss.sss格式

    字段6:状态,A=定位,V=未定位

    字段7:校验值





    资料就这些了,希望对大家有帮助。


    640?wx_fmt=jpeg

    长按进行关注,时刻进行交流。



    点击“在看”,与朋友一起分享↘


    展开全文
  • 文章目录1 网络报文数据格式定义和使用1.1 概述1.2 服务端实现1.3 客户端实现 1 网络报文数据格式定义和使用 1.1 概述 上次我们的代码使用了结构化的网络消息,但是只能发送指定的数据格式的数据,无法完成交互...

    1 网络报文的数据格式定义和使用

    1.1 概述

    上次我们的代码使用了结构化的网络消息,但是只能发送指定的数据格式的数据,无法完成交互。因此,我们需要定义网络报文的数据格式。

    网络数据报文的格式定义:

    • 报文有两个部分,包头和包体,是网络消息的基本单元。
    • 包头:描述本次消息包的大小,描述数据的作用。
    • 包体:数据。

    1.2 服务端实现

    server.cpp:

    #define WIN32_LEAN_AND_MEAN
    
    #include<windows.h>
    #include<WinSock2.h>
    #include<stdio.h>
    
    #pragma comment(lib,"ws2_32.lib")
    
    enum CMD
    {
    	CMD_LOGIN,
    	CMD_LOGOUT,
    	CMD_ERROR
    };
    struct DataHeader
    {
    	short dataLength;
    	short cmd;
    };
    //DataPackage
    struct Login
    {
    	char userName[32];
    	char PassWord[32];
    };
    
    struct LoginResult
    {
    	int result;
    
    };
    
    struct Logout
    {
    	char userName[32];
    };
    
    struct LogoutResult
    {
    	int result;
    
    };
    
    
    int main()
    {
    	//启动Windows socket 2.x环境
    	WORD ver = MAKEWORD(2, 2);
    	WSADATA dat;
    	WSAStartup(ver, &dat);
    	//------------
    	//-- 用Socket API建立简易TCP客户端
    	// 1 建立一个socket
    	SOCKET _sock = socket(AF_INET, SOCK_STREAM, 0);
    	if (INVALID_SOCKET == _sock)
    	{
    		printf("错误,建立Socket失败...\n");
    	}
    	else {
    		printf("建立Socket成功...\n");
    	}
    	// 2 连接服务器 connect
    	sockaddr_in _sin = {};
    	_sin.sin_family = AF_INET;
    	_sin.sin_port = htons(4567);
    	_sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    	int ret  = connect(_sock, (sockaddr*)&_sin, sizeof(sockaddr_in));
    	if (SOCKET_ERROR == ret)
    	{
    		printf("错误,连接服务器失败...\n");
    	}
    	else {
    		printf("连接服务器成功...\n");
    	}
    
    	
    	while (true)
    	{
    		//3输入请求命令
    		char cmdBuf[128] = {};
    		scanf("%s",cmdBuf);
    		//4 处理请求命令
    		if (0 == strcmp(cmdBuf, "exit"))
    		{
    			printf("收到exit命令,任务结束。\n");
    			break;
    		}else if (0 == strcmp(cmdBuf, "login")) {
    			Login login = {"lyd","lydmm"};
    			DataHeader dh = { sizeof(login),CMD_LOGIN};
    			//5 向服务器发送请求命令
    			send(_sock, (const char *)&dh, sizeof(dh), 0);
    			send(_sock, (const char *)&login, sizeof(login), 0);
    			// 接收服务器返回的数据
    			DataHeader retHeader = {};
    			LoginResult loginRet = {};
    			recv(_sock, (char*)&retHeader, sizeof(retHeader), 0);
    			recv(_sock, (char*)&loginRet, sizeof(loginRet), 0);
    			printf("LoginResult: %d \n", loginRet.result);
    		}
    		else if (0 == strcmp(cmdBuf, "logout")) {
    			Logout logout = { "lyd" };
    			DataHeader dh = { sizeof(logout), CMD_LOGOUT };
    			//5 向服务器发送请求命令
    			send(_sock, (const char *)&dh, sizeof(dh), 0);
    			send(_sock, (const char *)&logout, sizeof(logout), 0);
    			// 接收服务器返回的数据
    			DataHeader retHeader = {};
    			LogoutResult logoutRet = {};
    			recv(_sock, (char*)&retHeader, sizeof(retHeader), 0);
    			recv(_sock, (char*)&logoutRet, sizeof(logoutRet), 0);
    			printf("LogoutResult: %d \n", logoutRet.result);
    		}
    		else {
    			printf("不支持的命令,请重新输入。\n");
    		}
    	}
    	// 7 关闭套节字closesocket
    	closesocket(_sock);
    	//清除Windows socket环境
    	WSACleanup();
    	printf("已退出。");
    	getchar();
    	return 0;
    }
    

    1.3 客户端实现

    client.cpp:

    #define WIN32_LEAN_AND_MEAN
    #define _WINSOCK_DEPRECATED_NO_WARNINGS
    
    #include<windows.h>
    #include<WinSock2.h>
    #include<stdio.h>
    
    #pragma comment(lib,"ws2_32.lib")
    
    enum CMD
    {
    	CMD_LOGIN,
    	CMD_LOGOUT,
    	CMD_ERROR
    };
    struct DataHeader
    {
    	short dataLength;
    	short cmd;
    };
    //DataPackage
    struct Login
    {
    	char userName[32];
    	char PassWord[32];
    };
    
    struct LoginResult
    {
    	int result;
    
    };
    
    struct Logout
    {
    	char userName[32];
    };
    
    struct LogoutResult
    {
    	int result;
    
    };
    
    int main()
    {
    	//启动Windows socket 2.x环境
    	WORD ver = MAKEWORD(2, 2);
    	WSADATA dat;
    	WSAStartup(ver, &dat);
    	//------------
    
    	//-- 用Socket API建立简易TCP服务端
    	// 1 建立一个socket 套接字
    	SOCKET _sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    	// 2 bind 绑定用于接受客户端连接的网络端口
    	sockaddr_in _sin = {};
    	_sin.sin_family = AF_INET;
    	_sin.sin_port = htons(4567);//host to net unsigned short
    	_sin.sin_addr.S_un.S_addr = INADDR_ANY;//inet_addr("127.0.0.1");
    	if (SOCKET_ERROR == bind(_sock, (sockaddr*)&_sin, sizeof(_sin)))
    	{
    		printf("错误,绑定网络端口失败...\n");
    	}
    	else {
    		printf("绑定网络端口成功...\n");
    	}
    	// 3 listen 监听网络端口
    	if (SOCKET_ERROR == listen(_sock, 5))
    	{
    		printf("错误,监听网络端口失败...\n");
    	}
    	else {
    		printf("监听网络端口成功...\n");
    	}
    	// 4 accept 等待接受客户端连接
    	sockaddr_in clientAddr = {};
    	int nAddrLen = sizeof(sockaddr_in);
    	SOCKET _cSock = INVALID_SOCKET;
    	
    
    	_cSock = accept(_sock, (sockaddr*)&clientAddr, &nAddrLen);
    	if (INVALID_SOCKET == _cSock)
    	{
    		printf("错误,接受到无效客户端SOCKET...\n");
    	}
    	printf("新客户端加入:socket = %d,IP = %s \n", (int)_cSock, inet_ntoa(clientAddr.sin_addr));
    
    
    	while (true)
    	{
    		DataHeader header = {};
    		// 5 接收客户端数据
    		int nLen = recv(_cSock, (char*)&header, sizeof(DataHeader), 0);
    		if (nLen <= 0)
    		{
    			printf("客户端已退出,任务结束。");
    			break;
    		}
    		printf("收到命令:%d 数据长度:%d\n", header.cmd, header.dataLength);
    		switch (header.cmd)
    		{
    			case CMD_LOGIN:
    				{
    					Login login = {};
    					recv(_cSock, (char*)&login, sizeof(Login), 0);
    					//忽略判断用户密码是否正确的过程
    					LoginResult ret = {1};
    					send(_cSock, (char*)&header, sizeof(DataHeader), 0);
    					send(_cSock, (char*)&ret, sizeof(LoginResult), 0);
    				}
    				break;
    			case CMD_LOGOUT:
    				{
    					Logout logout = {};
    					recv(_cSock, (char*)&logout, sizeof(logout), 0);
    					//忽略判断用户密码是否正确的过程
    					LogoutResult ret = { 1 };
    					send(_cSock, (char*)&header, sizeof(header), 0);
    					send(_cSock, (char*)&ret, sizeof(ret), 0);
    				}
    				break;
    			default:
    				header.cmd = CMD_ERROR;
    				header.dataLength = 0;
    				send(_cSock, (char*)&header, sizeof(header), 0);
    			break;
    		}
    	}
    	// 8 关闭套节字closesocket
    	closesocket(_sock);
    	//------------
    	//清除Windows socket环境
    	WSACleanup();
    	printf("已退出。");
    	getchar();
    	return 0;
    }
    

    参考资料:

    1. C++ 百万并发网络通信引擎架构与实现 (服务端、客户端、跨平台) Version 1.0
    展开全文
  • IP数据报文格式

    千次阅读 2017-09-07 15:33:02
    由于记性不好的原因, 一直对报文格式的字段记的不是很牢固, 故花了一天时间学习IP报文格式, 第二天来总结. 过两天再继续学习TCP和UDP. IP报文格式如下图所示(图片来源—百度百科):  版本(Version, 4bit):为4代表...
    【转载】http://blog.csdn.net/shinezhang86/article/details/47145907
    

    由于记性不好的原因, 一直对报文格式的字段记的不是很牢固, 故花了一天时间学习IP报文格式, 第二天来总结. 过两天再继续学习TCP和UDP.


    IP报文格式如下图所示(图片来源—百度百科):

     

    版本(Version, 4bit):为4代表ipv4, 为6代表ipv6

    报头长度(Header Length, 4bit):一般为5, 代表IP首部一共占用20个字节. (4*5)

    服务类别(Type Of Service, 8bit):

    报文长度(Length, 16bit):  IP首部+数据部分的总长度, 一般再加上以太头长度即为数据包的长度.

    标识(Identification, 16bit): 用于在IP层对数据包进行分段的时候,标识数据包.

    标志(IP Flags, 3bit): 0x80—保留字段, 0x40—不分段, 0x20—还有更多的分段

    分段偏移(Fragment Offset, 13bit): 本数据包的数据在分段中的偏移(需要再乘以8).

    生存时间(Time To Live, 8bit): 本数据包的TTL.

    用户协议(Protocol, 8bit): 1—icmp, 2—igmp, 6—tcp, 17—udp, 89—ospf.

    报头校验和(Header Checksum, 16bit): IP首部的校验和.

    源IP地址(Source IP, 32bit): 源IP地址.

    目的IP地址(Destination IP, 32bit): 目的IP地址.

     

     

    问题点:

    1.   IP层的分片和重组分别发生在什么时候?

    IP分片发生在IP层,不仅源端主机会进行分片,中间的路由器也有可能分片,因为不同的网络的MTU是不一样的,如果传输路径上的某个网络的MTU比源端网络的MTU要小,路由器就可能对IP数据报再次进行分片。而分片数据的重组只会发生在目的端的IP层。

     

    2.   IP分片和TCP分段有什么区别?

    IP分片的原因是MTU, TCP分段的原因是MSS.


    3.      IP协议对分片进行重组的时候, 是不是也要像TCP协议一样, 启动一个定时器, 等到3片都到齐?

    启用定时器.但只是一个针对分片重组的定时器。如果定时器超时还没有收到完整的数据包,则直接将数据包丢弃.

    注: 关于这个问题, 今天专门去分析了协议栈的源代码. lwIP中并没有在ip层启动定时器, 只是简单的回收最旧的ip分片组. linux内核(2.6.18)的协议栈中确实有在ip层对分片做了定时器处理. 注册了一个timer, 当过期的时候, 回调函数会调用从而收受内存. 在linux内核协议栈中, ip分片的默认超时时间为600秒. (ipfragment.c中有源代码ip4_frags.secret_interval = 10 * 60 * HZ;)

    最近刚好在关注TI5, secret站队很强大. 不知道内核源代码开发者为什么要用secret_interval 这样的名字~~


    4.   IP层会不会对错误的数据包进行重传?

    IP层不会对丢弃或者错误的数据包进行重传,但是上层协议可能会提供重传机制(tcp).

     

    5.    为什么要避免IP分片

    IP层是没有超时重传机制,一旦分片中有一个数据包丢失就只能由上层协议重传整个数据包,效率低下

    使用UDP开发的时候,我们需要在应用层去限制每个包的大小,一般不要超过1472字节(即以太网MTU—UDP首部—IP首部),来避免IP层的分片。TCP程序由于有MSS, TCP协议本身会避免IP分片,则不用考虑这些.

     

    6.   TOS的作用是什么?

    RFC 791中定义了TOS位的前三位为IP Precedence,划分成了8个优先级,即:IP优先级字段。可以应用于流分类,数值越大表示优先级越高。IP优先权与CoS相同,有8种服务(07)可以标记。在网络中实际部署的时候8个优先级是远远不够的,于是在RFC 2474中又对TOS进行了重新的定义。把前六位定义成DSCP差分服务代码点(Differentiated Services Code Point),后两位保留。(总结:该字段比较复杂,以后可以做为专题再研究).

     

    分片攻击

      这种攻击的原理是:在IP的分片包中,所有的分片包用一个分片偏移字段标志分片包的顺序,但是,只有第一个分片包含有TCP端口号的信息。当IP分片包通过分组过滤防火墙时,防火墙只根据第一个分片包的Tcp信息判断是否允许通过,而其他后续的分片不作防火墙检测,直接让它们通过。

    这样,攻击者就可以通过先发送第一个合法的IP分片,骗过防火墙的检测,接着封装了恶意数据的后续分片包就可以直接穿透防火墙,直接到达内部网络主机,从而威胁网络和主机的安全。

     

     

    下面这张图对IP报文格式描述的更加清晰:


    展开全文
  • 18-tcp数据报文封装格式

    千次阅读 2018-04-28 17:05:03
    图1-tcp数据报文在网络中封装格式 下图中就是我们刚才通过wireshark软件抓到的TCP数据报。 图3是259这个数据报的封装格式: 图3-tcp数据报文结构 tcp数据报中首部的各个字段分析: Transmission ...

    这里写图片描述

    图1-tcp数据报文在网络中封装格式



    下图中就是我们刚才通过wireshark软件抓到的TCP数据报。
    这里写图片描述



    图3是259这个数据报的封装格式:

    这里写图片描述
    图3-tcp数据报文结构



    tcp数据报中首部的各个字段分析:

    Transmission Control Protocol, Src Port: 51211, Dst Port: 80, Seq: 0, Len: 0
        Source Port: 51211     //源端口,是一个动态的端口
        Destination Port: 80    //访问的目的主机的80端口,说明是访问基于http协议的资源
    [Stream index: 4]   //流索引,如果访问的源IP和源端口,目的IP和目的端口如果始终不变的话,这个索引值一直都是0,只要有其中一个变,这个索引值就会变,但是TCP数据报格式中是没有这个字段的
    
        [TCP Segment Len: 0] //tcp报文段的长度为0,说明我们还没有开始传输数据,这是一个tcp连接请求报文,并没有携带数据
        Sequence number: 0    (relative sequence number)  //序号分为相对序号和绝对序号,relative是相对的意思,这里说的是相对序号
        Acknowledgment number: 0   //确认号为0
        1000 .... = Header Length: 32 bytes (8)   //首部长度字段为32字节,说明可选字段长度为12字节,首部长度为20字节
        Flags: 0x002 (SYN)   //说明这是一个tcp请求连接
        000. .... .... = Reserved: Not set   //保留位没有用到,以0填充
        ...0 .... .... = Nonce: Not set     //这个标志位是为了防止SYN洪泛攻击而设计的,未来可能会用到
        .... 0... .... = Congestion Window Reduced (CWR): Not set  
        .... .0.. .... = ECN-Echo: Not set
        .... ..0. .... = Urgent: Not set    //紧急指针
        .... ...0 .... = Acknowledgment: Not set  //确认号
        .... .... 0... = Push: Not set       //推送
        .... .... .0.. = Reset: Not set      //复位
        .... .... ..1. = Syn: Set           //同步,synbit位被置1,说明这是一个tcp请求连接
        .... .... ...0 = Fin: Not set       //终止
        [TCP Flags: ··········S·]               
        Window size value: 8192              //windows系统下的窗口大小为8k   ,告诉目的设备发送的数据在8192字节以内都是可以接收的
        [Calculated window size: 8192]         //windows系统下的计算窗口大小为8k,这个由抓包软件计算的,在tcp数据段报文中只有窗口字段
        Checksum: 0xfe5e [correct]           //校验和,用于校验首部和数据部分,correct说明校验没有问题
        [Checksum Status: Good]            //Good表示校验和正确,bad表示校验和错误
        [Calculated Checksum: 0xfe5e]       //计算的校验和
        Urgent pointer: 0                 //紧急指针
    Options: (12 bytes)               //可选字段
        TCP Option - Maximum segment size: 1440 bytes   //表示传输的数据最大是1440字节,需要注意,这里并不包括IP首部和tcp首部
        TCP Option - No-Operation (NOP)
        TCP Option - Window scale: 2 (multiply by 4)
        TCP Option - No-Operation (NOP)
        TCP Option - No-Operation (NOP)
        TCP Option - SACK permitted

    关于tcp首部中各个字段在前面两篇中已经说过,这里就不再赘述了。

    展开全文
  • BLE数据报文格式解析

    千次阅读 2019-02-12 19:51:53
    报文的基础是数据链路层的报文,其它报文都是从此展开的,BLE数据链路层数据格式如下: 2、 广播通道与数据通道 PDU 区别: (1) 广播通道的 PDU 格式: 字段解析: 报文类型(低 4 个 bit): ADV_IND(0000)...
  • 10-ICMP数据报文格式

    千次阅读 2018-04-26 23:00:46
    1. ICMP数据报文格式 icmp数据报文格式如图1所示: 图1-icmp数据报文格式 类型(type):占用了8 bit位,前面我们说,是ICMP报文类型,用于标识错误类型的差错报文或者查询类型的报告报文。 代码(code):占用...
  • CAN 与 CANFD数据报文格式解读

    万次阅读 2019-07-08 18:05:22
    本章将主要介绍CAN网络数据报文格式,CAN网络中数据报文共有4种类型,分别为传统标准帧、传统扩展帧、CANFD标准帧、CANFD扩展帧,其数据报文格式由如下字段域组成: SOF:为帧的开头,该字段由一个显...
  • 所有的报文格式都在描述:1)报文有哪些要素构成;2)报文的内容如何组织。 时序描述的是报文出现的先后顺序。 http://www.cnblogs.com/feng9exe/p/6825169.html 三要素 网络通信协议由三个要素组成。 ...
  • 请求报文: GET空格/index.html空格HTTP/1.1(第1行,发起请求信息) key:(空格)value(第2行) \r\n(第3行) 响应报文: ...key:空格value(第2行,状态) \r\n(第3行) <...注:格式要一模一样 ...
  • IP数据报、TCP报文、UDP报文格式

    千次阅读 2015-11-30 21:12:38
    IP数据报、TCP报文、UDP报文协议格式归纳图文总结
  • 【TCP/IP详解】ARP报文格式 【TCP/IP详解】RARP报文格式 【TCP/IP协议】PPP协议的帧格式 IP层 【TCP/IP详解】IP报文格式 【TCP/IP详解】ICMP报文格式 传输层 【TCP/IP详解】TCP报文格式 【TCP/IP详解】UDP...
  • 低功耗蓝牙规范中,有两类报文:广播报文数据报文。 设备利用广播报文发现、连接其它设备。一旦连接建立之后,则开始使用数据报文。 低功耗蓝牙规定了3个广播信道和37个数据信道。 链路层数据包格式: 注:...
  • HTTP报文格式

    2020-06-08 08:59:16
    一、HTTP请求报文格式 两个回车换行表示首部的结尾 注意:HTTP协议首部使用ASCII码作为编码方式 HTTP请求报文提交表单时会包含数据 二、HTTP响应报文格式
  • 网络数据报文格式定义 报文有两个部分,包头和包体,是网络消息的基本单元。 包头:描述本次消息包的大小,描述数据的的作用。 包体:数据 下面数据定义,服务端与客户端共用。 enum CMD //命令枚举 { CMD_...
  • 依据XML定义报文格式解析数据

    千次阅读 2017-07-20 09:25:30
    报文数据集)中含有多个字段,要解析为多个含有意义的字段。 设计: 1、将报文格式定义在xml中 2、通过格式xml来解析数据 当前体会到此设计的优势: (1)报文格式可在xml中配置。报文格式调整不涉及...
  • CAN网络报文格式,包含了传统CAN与CANFD帧格式。CAN网络的帧类型共有4种,分别...本章将主要介绍CAN网络数据报文格式,CAN网络中数据报文共有4种类型,分别为传统标准帧、传统扩展帧、CANFD标准帧、CANFD扩展帧
  • TCP报文格式+UDP报文格式+MAC帧格式

    千次阅读 2019-06-10 11:25:00
    TCP报文格式+UDP报文格式+MAC帧格式 TCP和UDP的区别: 1)TCP是面向连接的,而UDP是无连接的 2)TCP提供可靠服务,而UDP不提供可靠服务,只是尽最大努力交付报文 3)TCP面向字节流,TCP把数据...
  • 1、MAC帧格式 类型:2字节,指出数据域中携带的数据应交给哪些协议实体处理 校验码:校验数据段(采用32位CRC冗余校验方式进行校验) 2、IPV4数据报 版本:IP协议版本,这里为4 首部长度:占4位 总长度:...
  • IPv4数据报文格式

    2019-09-22 21:23:20
    格式: IP数据报是IP处理的基本单元,由两部分组成:IP数据报头,数据数据包头包含一个20B的固定长度,和一个可变长度的最多40B的部分,传输层的数据到达网络层时,IP要在前面加IP数据报头,因为无差错传输发送...
  • 具体数据如下: 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x02, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00...
  • IP(Internet Protocol 网际协议)连接两个节点。每个节点都由一个32位地址来标识。当发送消息时,IP协议从较高级的协议(TCP或UDP)接受消息,并添加包含有关目标主机信息的IP报头。
  • 目前接触到的报文格式有三种:xml 、定长报文、变长报文 。此处只做简单介绍,日后应该会深入学习到三者之间如何解析,再继续更新。——2016.9.23XMLXML 被设计用来传输和存储数据。HTML 被设计用来显示数据。XML ...
  • 报文组成格式

    2018-12-24 09:48:28
    消息整体构成 起始标记 传输数据头 ... 数据体 ... 校验数据 ... 不定长,数据体长度在传输数据头中确定 如果没有数据体,本部分长度为0 0/4字节 0xFF ...
  • 报文格式

    2018-04-04 16:05:42
    MAC帧格式: 字段 值 目的地址 6字节 源地址 ... 数据 ...IP报文格式: 字段 值 版本 4 位,IP协议版本 首部长度 4 位,单位是4字节,也最常用;最大长度为60字节 区分服...
  • 1. 网络数据报文格式定义: 报文由包头和包体组成,其中: - 包头:描述本次消息包的大小,描述数据的作用 - 包体:存放数据 enum CMD { CMD_LOGIN, CMD_LOGINOUT }; //包头 struct DataHeader { short ...
  • TCP报文首部格式

    2021-01-05 18:24:54
           TCP虽然是面向字节流的...一个TCP报文段分为首部和数据两部分,而TCP的全部功能体现在它首部中的各字段的作用。因此,我们需要详细了解一下TCP首部各字段的作用。     &nb

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,951
精华内容 1,980
关键字:

报文数据格式