当前位置: 首页 > news >正文

网站主题怎么介绍网页游戏网站大全突袭

网站主题怎么介绍,网页游戏网站大全突袭,国际顶尖设计公司,网站设计背景怎么写一、__tcp_transmit_skb讲解 这个函数 __tcp_transmit_skb() 是 Linux 内核中 TCP/IP 协议栈的一部分#xff0c;负责处理传输控制协议#xff08;TCP#xff09;数据包的发送。具体来说#xff0c;这个函数将 TCP 头部添加到一个没有任何头部信息的 socket buffer (sk_bu…一、__tcp_transmit_skb讲解 这个函数 __tcp_transmit_skb() 是 Linux 内核中 TCP/IP 协议栈的一部分负责处理传输控制协议TCP数据包的发送。具体来说这个函数将 TCP 头部添加到一个没有任何头部信息的 socket buffer (sk_buff) 数据包上然后使用 IP 层进行进一步处理并将数据包发送到网络设备。接下来用中文逐段说明函数的工作过程 1. 函数接收一些参数sk是指向socket结构的指针skb是待发送的数据包clone_it指示是否需要克隆skbgfp_mask定义了内存分配标志rcv_nxt是接收方期望收到的下一个序列号。 2. 它初始化了一些 TCP 和 IP 的相关结构并检查传入的skb必须有有效的数据。 3. 如果clone_it为真非0函数将复制原始的skb。复制可能通过克隆仅复制数据包头部或完整复制来实现具体取决于原始skb是否已被其他代码克隆。复制失败函数返回错误-ENOBUFS表示没有足够的缓冲区。 4. 函数计算了 TCP 头部大小这包括 TCP 选项如最大段大小、时间戳等的选项。 5. 函数设置了一些标记来指示数据包是否可以被重排ooo_okay和是否因为使用了保留内存而可能会被丢弃pfmemalloc。 6. 通过skb_push向数据包添加 TCP 头部并重置传输层头部指针。 7. 设置数据包的一些属性如所有权、销毁函数和哈希值。 8. 把 TCP 头部中的字段source port、destination port、sequence number、acknowledgement number 等填充到skb-data指向的内存中。 9. 如果启用了 TCP MD5 签名选项并且是必要的话计算 MD5 哈希。 10. 通过icsk-icsk_af_ops-send_check 计算发送校验和。 11. 如果数据包是一个确认 ACK那么通过tcp_event_ack_sent()更新相关统计信息。 12. 如果skb包含数据不只是一个 TCP 头部那么函数将更新发送的数据统计信息并可能进行 TCP 内部流控。 13. 更新 TCP 状态统计并且如果数据包是 GSOGeneric Segmentation Offload类型的话设置 GSO 相关字段。 14. 清除skb-cb控制缓冲区中可能由底层 IP 代码使用过的任何信息。 15. 最后函数通过icsk-icsk_af_ops-queue_xmit函数将数据包发送到网络队列等待网络设备处理。 16. 如果queue_xmit返回错误那么更新 TCP 状态以响应网络拥塞并找出实际的错误代码。 17. 如果已经成功地发送了数据包并且有一个原始数据包 oskb那么更新它的状态并记录发送速率。 整体来说__tcp_transmit_skb() 是一个在内核中发送 TCP 数据包的核心函数涉及到从 TCP 头部创建选项处理到最终数据包发送到网络设备的很多步骤。 二、__tcp_transmit_skb中文注释 /* 这个例程实际上是发送由tcp_do_sendmsg()排队的TCP数据包。* 它被用于初始传输和可能的后续重传。* 这里看到的所有SKBsocket缓冲区都是完全无头的。我们的任务是构建TCP头* 然后把数据包传递给IP层以便它也能做相同的操作并且将数据包交给* 物理设备。** 我们在这里工作的是原始SKB的一个克隆或者是由重传引擎制作的* 一个全新的独立副本。*/ static int __tcp_transmit_skb(struct sock *sk, struct sk_buff *skb,int clone_it, gfp_t gfp_mask, u32 rcv_nxt) {// 与此套接字相关的TCP连接的inet结构体。const struct inet_connection_sock *icsk inet_csk(sk);struct inet_sock *inet;struct tcp_sock *tp;struct tcp_skb_cb *tcb;// 定义TCP头部选项。struct tcp_out_options opts;unsigned int tcp_options_size, tcp_header_size;struct sk_buff *oskb NULL;struct tcp_md5sig_key *md5;struct tcphdr *th;int err;// 如果没有skb或者skb中没有计数的TCP段则抛出bug。BUG_ON(!skb || !tcp_skb_pcount(skb));tp tcp_sk(sk);// 如果需要克隆skb。if (clone_it) {// 记录在飞数据量。TCP_SKB_CB(skb)-tx.in_flight TCP_SKB_CB(skb)-end_seq- tp-snd_una;oskb skb;// 尝试保存TCP段排序状态克隆或者复制skb然后恢复排序状态。tcp_skb_tsorted_save(oskb) {if (unlikely(skb_cloned(oskb)))skb pskb_copy(oskb, gfp_mask);elseskb skb_clone(oskb, gfp_mask);} tcp_skb_tsorted_restore(oskb);// 如果skb克隆/复制失败则返回内存不足。if (unlikely(!skb))return -ENOBUFS;}// 记录skb的时间戳。skb-skb_mstamp tp-tcp_mstamp;inet inet_sk(sk);tcb TCP_SKB_CB(skb);// 清除opts内存区域。memset(opts, 0, sizeof(opts));// 如果skb是SYN包则根据SYN包设置TCP选项否则根据已建立连接设置TCP选项。if (unlikely(tcb-tcp_flags TCPHDR_SYN))tcp_options_size tcp_syn_options(sk, skb, opts, md5);elsetcp_options_size tcp_established_options(sk, skb, opts,md5);// 计算TCP头部大小。tcp_header_size tcp_options_size sizeof(struct tcphdr);// 如果qdisc/设备队列中没有数据包则XPS可以选择另一个队列。// 我们可能从持有对sk的引用的tcp_tsq_handler()调用它。skb-ooo_okay sk_wmem_alloc_get(sk) SKB_TRUESIZE(1);// 如果我们使用了内存保留区来分配这个skb如果数据包被回环了可能会造成丢包// 其他的套接字可能没有设置SOCK_MEMALLOC。非回环的数据包则不论pfmemalloc。skb-pfmemalloc 0;// 在skb头部加上TCP头部大小的数据并重新设置传输层头部。skb_push(skb, tcp_header_size);skb_reset_transport_header(skb);// 将skb设为孤立状态。skb_orphan(skb);// 将skb和sock关联起来并设置skb的析构函数。skb-sk sk;skb-destructor skb_is_tcp_pure_ack(skb) ? __sock_wfree : tcp_wfree;// 从sock中设定skb的哈希值。skb_set_hash_from_sk(skb, sk);// 增加skb占用的内存大小计数。refcount_add(skb-truesize, sk-sk_wmem_alloc);// 设置skb等待确认的状态。skb_set_dst_pending_confirm(skb, sk-sk_dst_pending_confirm);// 构建TCP头并校验它。th (struct tcphdr *)skb-data;// 设置源端口和目的端口。th-source inet-inet_sport;th-dest inet-inet_dport;// 设置序列号和确认号。th-seq htonl(tcb-seq);th-ack_seq htonl(rcv_nxt);// 设置TCP头部中除了前面两个字节之外的字段。(((__be16 )th) 6) htons(((tcp_header_size 2) 12) |tcb-tcp_flags);th-check 0;th-urg_ptr 0;// 如果当前包含紧急指针的包在snd_una探测窗口之下// 则需要设置紧急指针。if (unlikely(tcp_urg_mode(tp) before(tcb-seq, tp-snd_up))) {if (before(tp-snd_up, tcb-seq 0x10000)) {th-urg_ptr htons(tp-snd_up - tcb-seq);th-urg 1;} else if (after(tcb-seq 0xFFFF, tp-snd_nxt)) {th-urg_ptr htons(0xFFFF);th-urg 1;}}// 将TCP选项复制到TCP头之后的空间。tcp_options_write((__be32 *)(th 1), tp, opts);// 设置skb的GSO类型。skb_shinfo(skb)-gso_type sk-sk_gso_type;// 如果不是SYN包设置TCP窗口大小并在需要时标记ECN标志如果是SYN包设置初始窗口大小。if (likely(!(tcb-tcp_flags TCPHDR_SYN))) {th-window htons(tcp_select_window(sk));// 如果可能发送ECN通告。tcp_ecn_send(sk, skb, th, tcp_header_size);} else {/* RFC1323: 在SYN和SYN/ACK段中的窗口大小* 是不会被扩大的。*/th-window htons(min(tp-rcv_wnd, 65535U));} #ifdef CONFIG_TCP_MD5SIG// 如果启用了MD5签名计算MD5哈希因为我们现在有了所需的全部数据。if (md5) {sk_nocaps_add(sk, NETIF_F_GSO_MASK);tp-af_specific-calc_md5_hash(opts.hash_location,md5, sk, skb);} #endif// 由底层网络函数完成skb的校验和。icsk-icsk_af_ops-send_check(sk, skb);// 如果skb中设置了TCPHDR_ACK标志则记录ACK已发送的事件。if (likely(tcb-tcp_flags TCPHDR_ACK))tcp_event_ack_sent(sk, tcp_skb_pcount(skb), rcv_nxt);// 如果skb的长度不只是TCP头部的长度表示有数据被发送// 更新统计信息。if (skb-len ! tcp_header_size) {tcp_event_data_sent(tp, sk);tp-data_segs_out tcp_skb_pcount(skb);tp-bytes_sent skb-len - tcp_header_size;// 基于内部节流算法对发送的数据包进行速度控制。tcp_internal_pacing(sk, skb);}// 如果当前数据段的结束序列号在snd_nxt之后或与之相等// 或者如果是一个单独的序列号更新发送的数据包统计。if (after(tcb-end_seq, tp-snd_nxt) || tcb-seq tcb-end_seq)TCP_ADD_STATS(sock_net(sk), TCP_MIB_OUTSEGS,tcp_skb_pcount(skb));tp-segs_out tcp_skb_pcount(skb);// 设置skb中GSO分段卸载相关的字段。skb_shinfo(skb)-gso_segs tcp_skb_pcount(skb);skb_shinfo(skb)-gso_size tcp_skb_mss(skb);// 我们使用的时间戳应保持私有。skb-tstamp 0;// 清理我们对IP栈的痕迹重置skb的控制块。memset(skb-cb, 0, max(sizeof(struct inet_skb_parm),sizeof(struct inet6_skb_parm)));// 通过网络函数将skb发送出去。err icsk-icsk_af_ops-queue_xmit(sk, skb, inet-cork.fl);// 如果出现错误调用tcp_enter_cwr函数进入拥塞窗口减少状态并评估错误。if (unlikely(err 0)) {tcp_enter_cwr(sk);err net_xmit_eval(err);}// 如果发送成功并且有原始的skb更新相关统计数据。if (!err oskb) {tcp_update_skb_after_send(tp, oskb);tcp_rate_skb_sent(sk, oskb);}// 返回错误码。return err; } 这段代码是Linux内核中处理TCP数据包发送的例程其中使用了网络编程和内核编程的深层次的知识包括对socket缓冲区SKB的操作网络协议栈如TCP/IP的详细处理以及用于数据包发送的内核API。 三、tcp_transmit_skb 这个函数 tcp_transmit_skb 是用于发送一个TCP数据包的函数它是一个简单的包装函数调用了内部实现 __tcp_transmit_skb。 参数解释 - struct sock *sk: 这代表一个TCP套接字包含了TCP连接的状态信息。 - struct sk_buff *skb: 这是要发送的数据包缓冲区它不包含TCP头部由 __tcp_transmit_skb 函数负责构建。 - int clone_it: 这是一个标志用来决定是否需要复制或者说克隆给定的SKB数据包。 - gfp_t gfp_mask: 这是内存分配标志决定了函数在需要内存时的行为。 函数的主体调用 __tcp_transmit_skb传递了给定的参数并在调用时获取了当前的TCP套接字状态尤其是 tcp_sk(sk)-rcv_nxt。rcv_nxt 代表了下一个期望接收的序列号这通常要作为ACK在TCP头部中回复给发送方。 在函数调用 __tcp_transmit_skb 后任何实际的数据包传输、重传和解包处理都是在 __tcp_transmit_skb 函数中完成的而 tcp_transmit_skb 本身的作用主要是一个中间调用层。 这个函数是Linux内核网络协议栈中的一部分特定于TCP协议的传输控制块Transmission Control Block的处理程序。它的作用是发送一个TCP段。以下是该函数的中文注释 // tcp_transmit_skb 是一个静态函数其目的是发送一个 TCP 段segment。 // 参数 // sk: 指向相关TCP套接字的指针。 // skb: 要发送的套接字缓冲区sk_buff的指针。 // clone_it: 一个整数标志指示是否需要克隆skb非0表示需要克隆。 // gfp_mask: 内存分配时使用的标志确定GFPGet Free Page的行为。static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it,gfp_t gfp_mask) {// 调用具体的发送函数 __tcp_transmit_skb 来处理实际的发送逻辑。// 传入参数sk (套接字结构体指针)和skb (套接字缓冲区指针)。// 参数clone_it用于控制是否克隆skb。// 参数gfp_mask用于内存分配的GFP控制。// 函数内部使用tcp_sk(sk)-rcv_nxt来获取当前TCP连接的下一个期望接收的序列号// 作为发送时序列号的参数。return __tcp_transmit_skb(sk, skb, clone_it, gfp_mask, tcp_sk(sk)-rcv_nxt); } 此函数实质上是个包装函数它只是简单地把参数传递给实际的发送函数 __tcp_transmit_skb同时取出TCP socket中的 rcv_nxt 字段即下一个期望接收的TCP序列号作为参数之一。在TCP通信中发送方和接收方都需要维护对方的序列号这对确保数据包的顺序和完整性至关重要。此函数的返回值是由 __tcp_transmit_skb 决定的通常表示发送操作的成功与否。
http://www.pierceye.com/news/542498/

相关文章:

  • 做数据收集网站租一个服务器多少钱
  • 苏州网站制作推广网站改版 删除栏目
  • 电子商务网站开发需求文档怎样建自己的网站
  • 通过关键词优化提升企业网站个人 可以做网站备案吗
  • 山西百度公司做网站的网站监控的软件怎么做
  • 如何做一份企业网站网站调用微博
  • 电子商务网站的设计工具wordpress中文用户名
  • 网站免费下载软件软件著作权申请多少钱一个
  • 东莞网站视频网站建设和管理规则
  • 内网网站建设方案wordpress 开发主题
  • 咸阳网站建设联系电话星悦做任务网站是
  • 家居网站建设的背景及意义免费域名注册官网
  • 桂林网站制作多少钱排名优化seo
  • 将网站保存怎么做wordpress 后台菜单
  • 2.0网站线上建设什么意思做外贸网站哪家的好
  • 网站域名可以更改吗安装wordpress插件目录下
  • 海南省澄迈住房和城乡建设厅网站ui设计师创意平台
  • 青岛网站设计公司排名wordpress 下载主题
  • 外包做网站不满意中级经济师考试成绩查询
  • 苏州企业网站建站系统网页制作基础步骤
  • 新河网站规划电子商务网站流程
  • 免费网站建设免代码杭州建设工程交易平台
  • 网页网站导读怎么做百度问答兼职怎么做
  • wordpress建站环境报喜鸟集团有限公司网页制作
  • 怎么利用网站赚广告费网站开发服务费入什么科目
  • 求网站2021在线观看设计app的软件
  • 百度文库登录入口昆明网站建设优化技术
  • 江苏建设教育协会网站网络营销专员岗位职责
  • 遂宁门户网站建设先进工作单位帮别人做违法网站会判刑吗
  • 设计公司网站套餐怎么样做短视频