raw socket发送原始tcp报文之后,接受数据包的问题?

Nina_Nina_Nina 2012-01-11 09:54:44
流程描述:
1、客户端发利用raw socket 发送原始tcp报文;
2、服务器响应此报文,返回正常的tcp数据流;
3、客户端接受到服务器的应答,也就是tcp数据流,之后的流程是什么??

问题:
1、针对流程描述中的第3个问题,当客户端接受到tcp数据流之后,客户端底层的OS 应该会自动触发tcp/ip协议栈吧??会把这 个收到的tcp流交给传输层,传输层查到没有此端口,向服务器发送端口不可断??请问是这样子的吗?
2、如果是这样子的话,为什么好多客户端程序都是利用raw socket 发送原始tcp报文,但是对接受数据没有做处理呢?
...全文
605 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangyaosuper 2013-06-07
  • 打赏
  • 举报
回复
即会发给系统的TCP协议栈,也会发给你的rawsocket 一般用rawsocket自己发包,要使用一个和网卡mac不同的mac,这样服务器回来的报文在上送给系统协议栈的时候会被丢掉,送给你的rawsocket那一份当然救你自己处理了。
Nina_Nina_Nina 2012-01-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zzz3265 的回复:]

问题说的不是很清楚, 你的socket创建的是否是tcp的

1. 需要根据你建立的soket类型, 如果用tcp的socket , OS 应该会自动触发tcp/ip协议栈, 否则不会
如果传输层查到没有此端口,向服务器发送端口不可到达(ICMP),
2. raw socket 发送tcp 要看你是为什么怎么做, 对接受数据做处理是想做什么处理? 自己实现组包?
如果用t……
[/Quote]
1、客户端用原始套接口发送tcp报文,
2、服务器响应tcp流,
3、客户端接收到服务器的响应,响应时tcp流,是会把这个数据发送raw socket 还是发送给tcp层??如果是发送给 raw socket的话,一切都好办!但是如果发送给tcp的话,,按照你说的,应该会检查tcp层是否存在接受数据包中的端口号吧?、

我觉得我说的很清楚啦呀!
Yofoo 2012-01-11
  • 打赏
  • 举报
回复
问题说的不是很清楚, 你的socket创建的是否是tcp的

1. 需要根据你建立的soket类型, 如果用tcp的socket , OS 应该会自动触发tcp/ip协议栈, 否则不会
如果传输层查到没有此端口,向服务器发送端口不可到达(ICMP),
2. raw socket 发送tcp 要看你是为什么怎么做, 对接受数据做处理是想做什么处理? 自己实现组包?
如果用tcp的socket, 系统会给你组包, 但是需要你发的raw不能有问题
buyong 2012-01-11
  • 打赏
  • 举报
回复
raw socket属于应用层,位于TCP/IP层之上。我觉得你的问题就是伪问题,发给raw socket的必然会发给TCP.就像发给tcp的必然发给ip层一样。
Yofoo 2012-01-11
  • 打赏
  • 举报
回复
非tcp的socket, 不会进入tcp层
《计算机网络》课程设计 题 目 数据包发送接受程序的实现 学 院 计算机学院 2012年12月21日 数据包发送接受程序的实现 一、设计题目与要求 1.设计题目 发送TCP数据包 2.设计要求 本设计的功能是填充一个TCP数据包,并发送给目的主机。 1)以命令行形式运行:SendTCP source_ip source_port dest_ip dest_port,其中SendTCP是程序名,source_ip为源端IP地址,source_port为源端口号 ,dest_ip为目的地址,dest_port为目的端口号。 2)其他的TCP头部参数请自行设定。 3)数据字段为"This is my homework of network,I am happy!"。 4)成功发送后在屏幕上输出"send OK"。 三、详细设计 本课程设计的目标是发送一个TCP数据包,可以利用原始套接字来完成这个工作。整 个程序由初始化原始套接字和发送TCP数据包两个部分组成。 当应用进程需要通过TCP发送时,它就将此应用层报文传送给执行TCP协议的传输实体 。TCP传输实体将用户数据加上TCP报头,形成TCP数据包,在TCP数据包上增加IP头部, 形成IP包。如图- 1显示的是TCP数据包和IP包得关系。TCP协议的数据传输单位称为报文段,其格式如图- 2所示。报文段报头的长度是20B~60B,选项部分长度最多为40B。TCP报文段主要包括以下 字段。 端口号:端口号字段包括源端口号和目的端口号。每个端口号的长度是16位,分别表 示发送TCP包的应用进程的端口号和接收该TCP包的应用进程的端口号。 图-1 TCP数据包加上IP报头形成IP包 序号:长度为32位。由于TCP协议是面向数据流的,它所传送的报文段可以视为连续 的数据流,因此需要给每一字节编号。序号字段的"序号"指的是本报文段数据的第一个 字节的序号。 确认号:该字段的长度为32位,它表示接收端希望接收下一个TCP包的第一个字节的 序号。 报文长度:该字段长度为4位。TCP报文长度是以4B为一个单元来计算的,实际上报文 长度在20B~60B之间。因此这个字段的值在5~15之间。 图-2 TCP数据包头部的格式 保留:长度为6位,留做今后使用,目前全部置0. 控制:这个字段定义了6种不同的标志,每一个标志占一位,在同一时间可以设置一 位或多位。URG位为1时,表明应尽快把数据传送给应用程序,否则表明允许数据在缓存 中存放一段时间。RST位为1时,表明要强制切断连接。SYN位为1时,表明有确立连接的 请求,这时,把序号字段的初始值作为序号字段的值,以便开始通信。FIN位为1时,表 明发送放已经没有数据发送了。 窗口大小:长度为16位,指向必须紧急处理的数据的位置,因此最多能够传送的数据 为65535B。 紧急指针:该字段长度为16,指向必需紧急处理的位置,只有当标志URG=1时紧急指 针才生效。从TCP报头后面的报文数据开始,到紧急指针所指出长度的数据,就是必须紧 急处理的数据。 选项: 该字段可以多达40B,包括单字节选项和多字节选项。 校验和:该字段长度为16位,校验和的校验范围包括伪头部,TCP报头以及应用层来 的数据。其计算方法与IP协议头部校验和的计算方法一样。伪头部为12B,它本身并不是 TCP数据包的真头部,只是在计算校验和时,临时和TCP数据包连接在一起。伪头部的格 式如图-3所示 0 8 16 24 31 "源IP地址 " "目的IP地址 " "00000000 "协议号(6) "TCP长度 " 创建一个原始套接字,并设置IP头选项 SOCKET sock; sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP); 或者: sock=WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED); 这里,设置了SOCK_RAW标志,表示我们声明的是一个原始套接字类型。 为使用发送接收超时设置,必须将标志位置位置为WSA_FLAG_OVERLAPPED。在本课程设计 中,发送TCP包时隐藏了自己的IP地址,因此我们要自己填充IP头,设置IP头操作选项。 其中flag设置为ture,并设定 IP_HDRINCL 选项,表明自己来构造IP头。 setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char *)&Flag, sizeof(Flag)); int timeout=1000; setsockopt(sock, SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout, sizeof(timeout)); 在这里我们
Android Camera开发入门:目录 第一篇: 前景  一、Android Camera开发前景;      1)camera相关应用的领域      2)相关岗位介绍;      3)市场招聘介绍;      4)发展前景介绍;  二、学习这门课的重要性;      1)适合的人群;      2)熟悉和了解Android Camera 应用开发流程的重要性 第二篇: 开发环境安装  一、jdk、sdk的配置;  二、android studio的安装介绍;  三、adb命令的使用; 第三篇: Camera 常用api和最新框架介绍  一、android camera api介绍      1)camera1、camera2 区别;      2)camera 1、camera2 常用api介绍;      3)android camerax;  二、android camera最新框架介绍 第四篇:Camera api1实现预览、拍照、录像功能  一、预览  二、拍照  三、录像  四、获取实时预览流 第五篇: Camera2相机 打开功能实现第六篇: Camera2相机 预览功能实现  1)surfaceview、textureview 第七篇: Camera2相机 拍照功能实现 1)单拍; 第八篇:Camera2相机 录像功能实现1)正常录像 第九篇:Camera2预览方向、拍照方向设置     1) 预览变形问题如何处理? 第十篇:YUV流处理  1)如何获取实时预览流?  2)  思考:双码流方案如何实现?一边本地录像,一边后台推流 第十一篇:dumpsys media.camera 第十二篇:Camera2 Zoom变焦第十三篇:人脸识别(android 原生 & 三方人脸识别算法)第十四篇:Uvc UsbCamera第十五篇:Android Camera2拍摄RAW图第十六篇: Android Camera2同时打开前后摄 并 录像第十七篇: Android Camera2 视频慢动作  附:1)提供android开发相关资源      软件工具、Android相关学习书籍、学习相关网站博客等链接2)提供课程讲解中设计到的App 源码    * Camera API1使用源码    * Camera API2使用源码    * 调用三方算法人脸识别源码    *  录像慢动作源码    * Uvc UsbCamera相关源码3)课件
网络编程-PING程序设计实验指导书 一.实验目的 (1)熟悉原始套接字编程。 (2)了解网络的结构。 (3)了解网络传输底层协议。 二.实验要求 PING程序是用于测试网络连通性的程序。要求在WINDOWS环境下实现基本的PING程序 功能. 在命令提示符下输入: PING ***.***.***.*** 其中***为目的主机的IP地址,不要求支持域名,对是否带有开关变量也不做要求。 不带开关变量时,要求返回4次响应。 返回信息的格式: REPLY FROM ***.***.***.*** 或 REQUEST TimeOut (无法PING通的情况) 三.实验原理 1、PING的工作原理 ping 程序是用来探测主机到主机之间是否可通信,如果不能ping到某台主机,表明不能和这 台主机建立连接。ping 使用的是ICMP协议,它发送ICMP回送请求消息给目的主机。ICMP协议规定:目的主机必 须返回ICMP回送应答消息给源主机。如果源主机在一定时间内收到应答,则认为主机可 达。 ICMP协议通过IP协议发送的,IP协议是一种无连接的,不可靠的数据包协议。因此, 保证数据送达的工作应该由其他的模块来完成。其中一个重要的模块就是ICMP(网络控制 报文)协议。 当传送IP数据包发生错误--比如主机不可达,路由不可达等等,ICMP协议将会把错 误信息封包,然后传送回给主机。给主机一个处理错误的机会,这也就是为什么说建立 在IP层以上的协议是可能做到安全的原因。ICMP数据包由8bit的错误类型和8bit的代码 和16bit的校验和组成。而前 16bit就组成了ICMP所要传递的信息。 PING利用ICMP协议包来侦测另一个主机是否可达。原理是用类型码为0的ICMP发请求 ,受到请求的主机则用类型码为8的ICMP回应。ping程序来计算间隔时间,并计算有多少 个包被送达。用户就可以判断网络大致的情况。 IP数据报 TCP/IP协议定义了一个在因特网上传输的包, 称为IP数据报(IP datagram). 这是一个与硬件无关的虚拟包, 由包头和数据两部分组成, 包头中的源地址和目的地址都是IP协议地址. ICMP TCP/IP组件包括一个ICMP(Internet Control Message Protocol)协议, 该协议定义了的报文类型: Echo,Echo Reply,用于ping程序的基本实现 下图是ICMP报文的传送: 2、RAW模式的SOCKET编程 PING程序是面向用户的应用程序,该程序使用ICMP的封装机制,通过IP协议来工作。为 了实现直接对IP和ICMP包进行操作,实验中使用RAW模式的SOCKET编程。 熟悉SOCKET的编程,包括基本的系统调用如SOCKET、BIND等. 3、具体内容 (1) 定义数据结构 需要定义好IP数据报、ICMP包等相关的数据结构 (2) 程序实现 在WINDOWS环境下实现PING程序 四. 实验步骤和注意事项 1、 熟悉IP以及ICMP协议的工作机制 2、 熟悉RAW模式的SOCKET编程 3、编写PING的实现程序 4、编译环境中需要包括SOCKET库 WS2_32.lib 5、 在模拟实现环境下调试并运行自己编写的PING程序 6、最后提交源程序,撰写实验报告 初步流程图 具体步骤 1、定义IP头和ICMP头 该程序定义自己的IP头和ICMP头数据结构,代码如下: //IP首部数据结构 typedef struct iphdr { unsigned int h_len : 4 ; //首部长度 unsigned int version : 4 ; //版本 unsigned char tos ; //服务类型 unsigned short total_len ; //报文总长度 unsigned short ident ; //标识 unsigned short frag_and_flags ; //偏移量 unsigned char ttl ; //寿命 unsigned char proto ; //协议 unsigned short checksum ;// 首部校验和 unsigned int sourceIP ;// 源站IP unsigned int destIP ;// 目的站IP }; //ICMP首部数据结构 typedef struct icmphdr { BYTE i_type ; //类型 BYTE i_code ; //代码 USHORT i_cksum ; //首部校验和 USHORT i_id ; //标识 USHORT i_seq ; //序列号 ULONG timestamp ; //时间戳 }; 2.定义变量 WSADATA wsaDa

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧