浅析TCP协议报文生成过程

2 篇文章 0 订阅
订阅专栏
2 篇文章 0 订阅
订阅专栏

背景

继上篇 : 图解Java服务端Socket建立原理 后,我们继续介绍 TCP协议报文的生成过程

报文与协议关系

在这里插入图片描述
上图展示了osi七层与tcp/ip四层的对应关系,以及展示协议报文封装过程以及与tcp/ip四层的对应关系

报文内容

tcp协议包
报文格式与其tcp各层关系如上所示

主要的数据结构

sk_bufff结构是Linux网络模块中最重要的数据结构之一,用以描述已接收或待发送的数据报文信息.
sk_buff负责描述数据报文,tcp/ip各层都是针对sk_buff结构进行处理,并传递给下一层的.下图描述了发送报文的sk_buff与其它相关数据结构的关系
在这里插入图片描述
struct sock是套接字在传输层的结构.
报文的真正内容是在sk_buff数据区
sk_buff是用来描述管理报文sk_buff数据区

TCP报文包的生成

报文生成流程

TCP报文生成代码

传输层(tcp层)

网络数据包的发送过程起始于应用层的函数调用(如上图的send函数),随后会调用tcp_sendmsg函数,如上图所示,层层调用到tcp_transmit_skb函数完成TCP协议处理,封闭tcp包头,最后调用这里最终调用的ip层的ip_queue_xmit方法

  //tcp_sendmsg函数的主要逻辑是在tcp_sendmsg_locked函数
  int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size)
{
    ...
    //得到当前mss长度和数据包最大长度
    mss_now = tcp_send_mss(sk, &size_goal, flags);
    ...
	while (msg_data_left(msg)) {
    	...
    	//从tcp写入队列sk_write_queue中拿出最后一个struct sk_buff
    	skb = tcp_write_queue_tail(sk);
    	//copy<=0表示不能合并到之前skb做GSO,或者被设置了eor标记不能合并
    	if (copy <= 0 || !tcp_skb_can_collapse_to(skb)) {
    	    //在TCP的重传队列和发送队列都为空的情况下
    	    first_skb = tcp_rtx_and_write_queues_empty(sk);
    	    //重新分配skb结构
		    skb = sk_stream_alloc_skb(sk,
						  select_size(sk, sg, first_skb),
						  sk->sk_allocation,
						  first_skb);
			// 加入发送队列
			skb_entail(sk, skb);	
    	}
    }
    ...
    //发送,会调用__tcp_push_pending_frames方法,再调用tcp_write_xmit方法,再调tcp_transmit_skb
    tcp_push(sk, flags, mss_now, tp->nonagle, size_goal);
    ...
}
static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it,
			    gfp_t gfp_mask)
{
   ...
   	th = (struct tcphdr *)skb->data;
   	//本例子中source端口内存值为0xd204,因为tcp是大端模式,实际值应该是0x04d2,即是10进制的1234,即为本服务器的端口
	th->source		= inet->inet_sport;
	//本例子desc为0x1c90,实际就是0x901c,即10进制的36892,刚好是客户端的端口
	th->dest		= inet->inet_dport;
	th->seq			= htonl(tcb->seq);
	th->ack_seq		= htonl(tp->rcv_nxt);
	*(((__be16 *)th) + 6)	= htons(((tcp_header_size >> 2) << 12) |
					tcb->tcp_flags);
	th->check		= 0;
	th->urg_ptr		= 0;
   ...
   //这里最终调用的是ip_queue_xmit
    err = icsk->icsk_af_ops->queue_xmit(sk, skb, &inet->cork.fl);
}

网络层(ip层)

tcp层最后会调用ip层的ip_queue_xmit方法,在这方法会,会对报文的ip包头进行设置,随后经层层调用经过邻居子系统后,再调用dev_queue_xmit函数,进入网络介质层

int ip_queue_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl)
{
    ...
    //设置ip包头
    iph = ip_hdr(skb);
	*((__be16 *)iph) = htons((4 << 12) | (5 << 8) | (inet->tos & 0xff));
	if (ip_dont_fragment(sk, &rt->dst) && !skb->ignore_df)
		iph->frag_off = htons(IP_DF);
	else
		iph->frag_off = 0;
	iph->ttl      = ip_select_ttl(inet, &rt->dst);
	iph->protocol = sk->sk_protocol;
	ip_copy_addrs(iph, fl4);

	/* Transport layer set skb->h.foo itself. */

	if (inet_opt && inet_opt->opt.optlen) {
		iph->ihl += inet_opt->opt.optlen >> 2;
		ip_options_build(skb, &inet_opt->opt, inet->inet_daddr, rt, 0);
	}
    ...
    //会调用:__ip_local_out
    res = ip_local_out(net, sk, skb);
    ...
}
int __ip_local_out(struct net *net, struct sock *sk, struct sk_buff *skb)
{
    ...
    //截取数据包,对数据包干预
	return nf_hook(NFPROTO_IPV4, NF_INET_LOCAL_OUT,
		       net, sk, skb, NULL, skb_dst(skb)->dev,
		       dst_output);
}
static int ip_finish_output2(struct net *net, struct sock *sk, struct sk_buff *skb)
{
    ...
    //获取下一跳
    nexthop = (__force u32) rt_nexthop(rt, ip_hdr(skb)->daddr);
    //获取邻居子系统
	neigh = __ipv4_neigh_lookup_noref(dev, nexthop);
	...
    //通过邻居子系统输出,neigh_output调用了neigh_hh_output
    res = neigh_output(neigh, skb);
    ...
}

作者: 吴炼钿

浅析IM即时通讯开发中TCP协议层KeepAlive保活机制
蔚可云的博客
07-15 798
为什么要这么做,相信大家已经猜到了公网上的目标主机在收到这个IP报文后,需要知道这个IP报文的来源地址,并向该来源地址发送响应报文,但如果不经过NAT,目标主机拿到的来源地址是192.168.1.100,这显然是一个公网上不可访问到的私有地址,目标主机无法将响应报文发送到正确的来源主机上。发送心跳包,从通信层面来说就是为了保持长连接,至于这个包的内容,是没有什么特别规定的,但在移动端IM中为了省流量,一般都是很小的包(比如某些第3方的IM云为了说明心跳不费流量,号称1字节的心跳包)。...
TCP浅析
Jack
03-13 1847
TCP 简介 第一部分先为大家介绍一下 TCP 的主要概念,并讲解一下 TCP 的三个重要特性——1. 面向连接;2. 基于字节流;3. 可靠性。 下图就是两种经典的分层模型,可以看到 TCP 在网络分层中的位置。 网络分层模型 本文重点对 TCP 进行介绍,从图中可以看到 TCP 位于传输层,而且构建于网络层的 IP 协议之上,TCP 是一种面向连接的、可靠的、基于字节流的传输层通信协议。 seq与ack seq和ack号存在于TCP报文段的首部中,seq是序号,ack是确认号,大小均为4字节。 seq
VC++编写的报文生成器 导入EXCEL即可生成
11-27
使用方法如下: 1、新建一个Excel文档。 2、在Excel的第一列输入报文字段名称,可以为空。目前本列只是预留以后使用。 3、第二列中输入报文长度,必须是数值,例如长度为20,可以在本列中输入20,或者-20都一样。 4、第三列中输入报文值。 暂时可能不支持Excel2010版本(或以上版本)的Excel文件,如果是2010版本,需要将其另存为2007或以前的版本。
构造协议报文、自定制协议方法
星愿心愿的专栏
04-30 1402
<br />最近在做嵌入式产品开发,需要构造报文、定制协议,以满足通信的需求,下面转发来自互联网上的“构造ip和icmp报文”文章,<br /> <br />以使通过该文章,可以总结出构造协议的一般方法!<br /><br />出处:《Linux 编程技术详解》<br />//在<netinet/ip.h>中可以查看IP包头结构struct iphdr<br />//在<netinet/ip_icmp.h>中可以查看ICMP包头结构struct icmphdr<br />struct iphdr * ip_
生成HTTP响应报文
weixin_50437588的博客
01-12 914
提取path的后缀,然后利用哈希表SUFFIX_TYPE,得到对应值(例如:文件后缀为html,则对应值应为text/html )根据请求写出相应的HTTP响应头,然后再将path上的文件置于响应体,通过socket发往客户端。本文实现的响应头,包含200、400、403、404四种状态码及其对应的原因短语,响应头部分有。其余是响应头,由头部字段名称(Connection) :值(keep-alive) 构成。响应体内应为path对应的文件,为了提高服务器从磁盘中读取响应文件的速度,采用。
签名验证生成报文
12-05
java 签名 加密验证签名 生成加密报文提交给服务器采用SHA1withRSAUtil 证书签名算法
tcp报文发送工具SocketTool.rar
09-02
软件介绍: 一款小巧但功能强大的tcp报文发送工具,可创建TCP服务端和客户端,UDP服务端和客户端,UDP工作组,发送指定报文数据,并显示数据接收及提示窗口。
ssh协议浅析
12-24
SSH协议的启动过程始于客户端发起一个TCP连接请求到服务器。一旦TCP连接建立,服务器会发送一个包含其协议版本号(主版本号和次版本号)和软件版本号的报文。客户端回应同样的报文,但可能会选择与服务器支持的最低...
计算机网络(三) --- 浅析TCP/IP分层模型与通信示例
dela_的博客
09-26 1329
一. TCP/IP四层模型前面我们提到过OSI七层模型, 首先来看一下TCP/IP四层模型与OSI七层模型之间的大致对应关系以及各层对应的部分网络协议.下面我们就TCP/IP每层的功能以及每层的重要协议做一个简单了解.1. 数据链路层根据TCP/IP模型与OSI模型的对应关系我们可以看出, TCP/IP里面的数据链路层包含了OSI里面的数据链路层与物理层. OSI的物理层是负责数据传输的硬件,
HTTP协议浅析-Request&Response.doc
07-29
1. **建立TCP套接字连接**:客户端(浏览器)通过TCP/IP协议与服务器建立连接。 2. **发送HTTP请求报文**:客户端构造请求报文,并通过已建立的TCP连接发送给服务器。 3. **接收HTTP应答报文**:服务器处理请求后,...
报文模拟工具
10-18
作为客户端模拟报文发送及接收报文,目前支持xml及定长xml,可以设置报文编码,亲测过utf-8和gbk。
TCP发送报文TCP接收报文工具-江朝技术
07-25
1,tcp发送报文工具,可以向服务端发送报文,可以指定服务器的IP和端口号。 2,TCP接收报文工具,可以在服务器开启一个端口,接收客户端发送的报文
【基础中心】笔记十一--序列及报文生成
平凡之路
10-20 481
mysql模拟oracle的序列生成器主要思路: 将表名和表中主键字段组成枚举作为数据源,每次获取该字段在表中的最大数值,加1即是下个主键值.枚举类public enum SeqTable { SYS_ROLE_ID("SYS_ROLE_ID", "system_roles"), STAFF_ID("STAFF_ID", "staff"), STAFF_ATTR_ID("STA
【webserver】 第8节 响应报文生成
qq_53157334的博客
10-29 638
生成响应报文
基于表具协议报文生成工具——插件
weixin_30793643的博客
04-25 297
cmdcreater cmdcreater.pro 1 SOURCES += \ 2 cmdcreator.cpp \ 3 main.cpp 4 5 HEADERS += \ 6 cmdcreator.h \ 7 myplugininterface.h cmdcreater.h 1 #ifndef CMDCREATOR_H 2...
Python助力性能测试——报文批量生成
人生不怕起点低,就怕没追求
11-13 860
当前,我国金融体系内交易量持续增长,业务场景日趋复杂。系统交易量的增加,临时产生的集中业务需求,都会使服务器面临考验,因此,需要对系统进行性能测试。 在金融系统中,报文处理是必不可少的。各大金融机构间通过报文的交换进行信息流的传递,从而最终实现资金的跨机构流转。在对金融系统的性能测试中,自然也少不了与报文打交道,而性能测试往往伴随着大量数据准备。 那么,如何高效地生成大量报文呢? 试想这样一种场景:某金融机构需在特定时间内进行一波资金划转,该业务是新增交易,且交易数量较大,需要准备大量报文对服务器进行性能.
HEX报文协议打包生成工具
最新发布
qqk808的博客
12-30 599
HEX报文协议打包工具
linux编写shell脚本程序实例1-生成TCP活动状况报告
Mr_Ohahah的博客
12-14 1811
题目介绍 生成TCP活动状况报告:编写shell脚本程序,每隔一分钟生成一行信息,包括当前时间,这一分钟内TCP发送了多少报文,接收了多少报文,收发报文总数(行尾给出+或-或空格,+表示这分钟收发报文数比上分钟多10包以上,差别在10包或以内的用空格,其余用-) 运行结果如下(tracetcp.sh是自己写的脚本程序): 具体操作步骤 1、根据输出的格式,我们需要当前日期时间等信息,用date命令实现 2、接下来每行加行号查看当前网络信息 发现tcp在22到32这段: 3、把数据存放到201008.
进击的小白Day019——报文生成与组包拆包(一)
刚学编程的小小白
01-11 2013
设计一个场景 如图,报文分为传输头和应用报文两部分。 传输头:①长度:应用报文的长度;②大包序号:1-250,按顺序生成;③小包序号,1-4,由程序生成;④小包数量:1-4,由程序生成。 应用报文:①正常报文和计时报文两种,随机生成,正常报文可以为大包也可以为小包,计时报文只有小包;②长度:报文正文长度;③报文正文:1-40字节,随机生成长度,1-10为a,11-20为b,21-30为c,31-...
写文章

热门文章

  • 数据质量监控工具-Apache Griffin 38955
  • ALL IN ONE最佳实践方案分享(从硬件到软件全覆盖) 38243
  • rabbitmq消息队列原理 36833
  • MySQL慢查询及解决方案 17499
  • 从Mysql源代码角度分析一句简单sql的查询过程 17071

分类专栏

  • 感悟 25篇
  • 软件开发 70篇
  • 读后感 10篇
  • 笔记 63篇
  • 前端 5篇
  • Linux 2篇
  • 运维 1篇
  • 服务器 1篇
  • 子分类账 1篇
  • EasyExcel 1篇
  • POI 1篇
  • Redis 3篇
  • 缓存 3篇
  • git 2篇
  • 领域思考 5篇
  • 领域驱动开发 2篇
  • vscode 2篇
  • GIS 2篇
  • 哲学 2篇
  • TCP 2篇
  • 计算机网络 1篇
  • http 2篇
  • 自动驾驶 1篇
  • jenkins 1篇
  • 滑动窗口 1篇
  • C 2篇
  • I/O 2篇
  • 创业公司 1篇
  • bloom filter 1篇
  • 跑步 1篇
  • java 85篇
  • js 14篇
  • 存储 7篇
  • 规则引擎 1篇
  • mysql 23篇
  • spark 5篇
  • Apache Kylin 1篇
  • 消息组件 5篇
  • Disruptor 1篇
  • 密码技术 4篇
  • 并发 9篇
  • spring cloud 3篇
  • 序列化 1篇
  • 分库分表 9篇
  • 分布式 9篇
  • 算法 5篇
  • Hive 1篇
  • 大数据 8篇
  • 数据质量 3篇
  • 运动 1篇

最新评论

  • 电子发票二维码解析

    winding1993: 增值税专用发票(电子)应该是20

  • 使用Guava-retrying优雅地解决异常重试场景

    Ewann: 遇到好评论,我就是要评论,嘿,就是玩

  • 用java编写基于selenium的方式抓取豆瓣读书书籍内容

    2201_75413102: 点哪个文件运行啊,太多了实在不知道是哪个

  • 电子发票中数字签名的提取解析教程

    luoyaorenjson: 怎么说都是都是ofd格式啊 PDF、XML、OFD三类都属于源文件吗?

  • 《从零开始学架构》读书笔记(一)

    普通网友: 写的很好,细节很到位!【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

最新文章

  • 浅谈架构实战
  • 浅谈SPI
  • 《小宅门》新书分享会观后感
2024年26篇
2023年30篇
2022年41篇
2021年71篇
2020年67篇
2019年26篇
2018年61篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司无锡网站优化seo贵州网站建设优化靖歌阁网站优化佛山首页网站关键词优化费用赤壁网站seo优化哪家好新郑市网站seo优化排名兰州快速网站优化多少钱网站快速优化就连火1星惠孝感本地网站优化私人网站排名优化荔湾企业网站推广优化公司行唐网站优化黄山网络推广网站优化建设网站做优化询问x火27星舒心侯马网站关键词优化前端图片网站优化铁岭优化网站关键词好的优化网站的网站内存优化网站优化做哪些智能网站优化的原因上饶网站运营优化平台网站主页优化问题贵州标准网站优化价格表深圳外贸仿牌网站优化有用吗东莞网站优化公司外贸网站优化步骤网站关键词优化效果图鼓楼区自考网站优化济南知名网站优化哪家好歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化