跳至主要内容

网络编程之常用协议格式

http://ift.tt/2vLmhug

协议格式

 
 

TCP/IP模型

  • 应用层
    • 是最高的一层,直接面向用户
    • 作用:
      • 用来处理传输层提交的信息,并与用户交互
      • 把用户输入的信息再发送给传输层来处理
    • 主要用到的协议:
      • http协议
      • http请求报文格式
请求方法

空格

URL

空格

协议版本

回车符

换行符

请求行

头部字段名

回车符

换行符

  

  

  

。。。

  

  

  

  

  

  

请求头部

头部字段名

回车符

换行符

  

 
 

  

  

回车符

换行符

  

  

  

  

  

  

  

  

  

  

  

  

  

请求数据

 
 

  1. 请求行
    1. 由请求方法字段,url字段和协议版本字段组成,他们用空格分隔
    2. 例如:GET /index.html HTTP/1.1
  2. 请求头
    1. 请求头由关键字/值对组成。请求头部通知服务器有关客户端请求的信息
Host

接受请求的服务器地址,可以是ip:端口号,也可以是域名

User-Agent

发送请求的应用程序名称

Connection

指定与链接相关的属性,如connetion:keep-alive

  

 
 


  • 响应报文
协议方法

空格

状态码

空格

 
 

协议描述

回车符

换行符

状态行

头部字段名

回车符

换行符

  

  

  

。。。

  

  

  

  

  

  

请求头部

头部字段名

回车符

换行符

  

 
 

  

  

回车符

换行符

  

  

  

  

  

  

  

  

  

  

  

  

  

请求数据

 
 


  1. 传输层
    1. 主要作用是对数据包的分割,重组,排序 ,重传和连接,以确保数据通过网络层准确无误的到达了网络的另一方
    2. 常用的协议为TCP和UDP
      1. TCP格式
偏移位

0-3

4-7

8-15

16-31

0

源端口

  

  

目的端口

32

序号

  

  

  

64

确认号

  

  

  

96

数据偏移

保留

标记

窗口大小

128

校验和

  

  

紧急指针

160

选项

  

  

  

 
 

  1.  
     

源端口

发送方主机使用的端口

目的端口

数据包将要被发送到的端口

序号

这个数字用来标示一个tcp片段,保证没有确实数据包

确认号

这个数据是通信中希望从另一个设备得到的下一个数据包序号

数据偏移

也就是tcp头部大小

标记

所传输的tcp数据包的类型

窗口大小

tcp接受者缓冲区字节大小

校验和

用来保证tcp数据包的完整性

紧急指针

如果字段标志设置为URG,改字段告诉CPU从数据包哪里开始读数据

选项

各种可选的域

 
 

  1. UDP格式
偏移位

0-15

16-31

0

源端口

目的端口

32

数据包长度

校验和

 
 


源端口

发送方主机使用的端口

目的端口

数据包将要被发送到的端口

数据包长度

数据包的字节长度

标记

所传输的数据包的类型

校验和

用来保证UDP数据包的完整性

 
 

  1. 网络层
    1. 主要作用:实现与远程设备的连接
    2. 这一层常用的的协议为IP协议
    3. 目前有2个版本,IPV4和IPV6
      1. ipv4 协议中ip地址是一个32位的数值,采用点分四组表示法
      2. 每个ip地址包含两个部分
        1. 网络地址
          1. 用来标示所连接到的局域网
        2. 主机地址
          1. 用来标示设备本身
        3. 网络地址和主机地址的划分由子网掩码来决定
    4. IP协议
偏移位

0-3

4-7

8-15

16-18

19-31

0

版本

首部长度

服务类型

总长度

  

32

标识符

  

  

标记

分片偏移

64

存活时间

  

协议

首部校验和

  

96

源ip地址

  

  

  

  

128

目的ip地址

  

  

  

  

160

选项

  

  

  

  

160

or

192+

数据

  

  

  

  

    版本

    ip所使用的版本

    首部长度

    ip头的长度(4字节的整数倍

    服务类型

    路由器使用改字段做流量有限排序

    总长度

    ip+数据包长度

    标示符

    一个唯一标示,用来区分数据包或数据分片的顺序

    标记

    标示数据包是否分片数据

    分片偏移

    分片数据时改字段有效,用于将数据包按顺序组合

    存活时间

    定义数据包的生存周期,路由器中转一次减一

    协议

    用来识别数据包上层协议类型

    首部校验和

    错误检测机制,确认内容是否损坏或篡改

    源ip地址

    发送方主机的ip地址

    目的ip地址

    接收方主机的ip地址

    选项

    可选

    数据

    使用ip传递的实际数据

     
     

      1. 网络链路层
        1. ARP协议:地址解析协议
          1. 主要作用:通过ip找主机设备(mac地址)
          2. ARP查看指令
            1. ARP -a 显示所有接口当前的ARP缓存表
            2. -d 删除指定的ip地址项
            3. -s 添加静态的ip-mac映射记录
          3. 协议格式
      偏移位

      0-7

      8-15

      0

      硬件类型

        

      16

      协议类型

        

      32

      硬件地址长度

      协议地址长度

      48

      操作

        

      64-111

      发送方硬件地址

        

      112-143

      发送方协议地址

        

      144-191

      目标硬件地址

        

      192-215

      目标协议地址

        

        硬件类型

        数据链路层使用的数据类型,大多数情况下,这个类型是以太网

        协议类型

        APR请求站在使用的高层协议

        硬件地址长度

        正在使用的物理地址长度

        协议地址长度

        正在使用的逻辑地址长度

        操作:

        ARP数据包功能,1表示请求,2表示响应

        发送方硬件地址

        发送者的物理地址

        发送方协议地址

        发送者的协议地址

        目标方硬件地址

        接收者的物理地址(广播arp请求中接受者的物理地址常为0)

        目标方协议地址

          

        接收者的协议地址

         
         

          The post 网络编程之常用协议格式 appeared first on cole.

          http://ift.tt/eA8V8J internet September 06, 2017 at 07:51PM

          评论

          此博客中的热门博文

          反Hook 之自己实现GetProcAddress和LoadLibraryA(c++ version)

          http://ift.tt/2AocAD0 // 课上练习.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <windows.h> //要实现的功能: /* 自己实现GerProcAddress LoadLibraryA */ //思路: /* GerProcAddress和LoadLibraryA都是在Kernel32.dll中的 首要的任务就是找到Kernel32.dll,然后遍历IAT就能找到这两个函数 现在首要的难点就是如何找到kernel32.dll() 通过dll的加载顺序可以找到,而且虽然需要使用未文档化的API,但是好在windgb可以直接看,而且用到的也并不是很多 懒得去晚上搜了,直接自己实现一个得了,作为演示,能用就行(最好还是搜一个正规的结构体) */ /* 0: kd> dt _TEB /a nt!_TEB +0x000 NtTib : _NT_TIB +0x01c EnvironmentPointer : Ptr32 Void +0x020 ClientId : _CLIENT_ID +0x028 ActiveRpcHandle : Ptr32 Void +0x02c ThreadLocalStoragePointer : Ptr32 Void +0x030 ProcessEnvironmentBlock : Ptr32 _PEB //首先实现部分TEB结构体,因为只需要用的PEB的部分,所以实现到这就ok了 */ //构建 TEB typedef struct _TEB { //保证0x30是peb的结构体就ok了 struct _tem { DWORD a1; DWORD a2; DWORD a3; DWORD a4; DWORD a5; DWORD a6; DWORD a7; DWORD a8; DWORD a9; DWORD a10; ...

          IDA动态调试ELF中遇到的问题(1)

          https://ift.tt/2Gxnf2F 遇到 got SIGCHLD singal(child status has changed)...这种提示 singal fork了子进程 直接点yes,然后继续单步执行,出来提示 pass to application就行了 内存查看 用od习惯了之后,凡事都想右键看一下内存,但是IDA中好像没有那么如意, 目前只是在栈中右键发现有查看hex的选项 动态调试的时候的nop ida保存动态调试的时候修改的数据 方法一:在程序运行的时候保存 The post IDA动态调试ELF中遇到的问题(1) appeared first on cole . https://ift.tt/2q9Qf5g WHATEVER April 05, 2018 at 09:44AM

          python3语法基础之函数和类

          http://ift.tt/2xXd9ze 函数 什么是函数? 函数就是一些封装在一起,能够实现某种功能的代码段 函数的定义 在python中,函数通过def关键字定义 定义的格式如下: def 函数名 ( 参数 ) : 函数体 实参和形参 形参 函数定义的时候 , 写在参数列表中的变量名 实参 调用函数的时候,往函数里传递的数据 关于return 执行return语句的时候,肯定会从当前函数退出 return 可以返回值 如果没有写return ,python中默认 return None 局部变量和全局变量 在函数内或者类内定义的变量叫做局部变量,作用域只在函数或类内 定义在文件中,任何敌方都能访问到的叫全局变量 可以使用global 关键字把局部变量声明为全局变量 默认参数 python支持默认参数,也是从右向左赋值     def TestFun ( nNumA = 10 , nNumB = 20 ) : print ( nNumA , nNumB )     if __name__ == "__main__" : TestFun(); TestFun( 5 , 1 )     关键字参数 就是可以不按照顺序参数 def TestFun ( nNumA , nNumB ) : print ( nNumA , nNumB )     if __name__ == "__main__" : TestFun( nNumB = 5 , nNumA = 6 ) 变参 python中是通过* 来实现边长参数的 def TestFun ( nNumA , *args ) : print ( nNumA ) print ( args )     if __name__ == "__main__" : TestFun( 1 , 2 , 3 , 4 , 5 , 6 ) 边长的参数默认是一个元组     类 为什么会有面向对象理念? 因为所有的...