Linux 系统应用编程——网络编程(TCP/IP 数据包格式解析)



图中括号中的数字代表的是当前域所占的空间大小,单位是bit位。

黄色的是数据链路层的头部,一共14字节

绿色的部分是IP头部,一般是20字节

紫色部分是TCP头部,一般是20字节

最内部的是数据包内容


黄色部分:链路层

目的MAC当前step目的主机的mac地址

MAC当前step的源主机的mac地址

类型指定网络层所用的协议类型,通常是IP协议,0x0800


绿色部分:网络层,这里用的是IP包头格式

版本:记录数据报属于哪一个版本的协议,如IPv4IPv6

首部长度:指明IP头部长度,单位是字,也就是两个字节。该域的值最小为5,就是标准的头部长度;最大为15,表明有扩展部分。

服务类型:用来区分不同服务的需要

数据报总长:包含IP头部的数据报的总长度。注意,这里不包括链路层的头部,目前最大值是65535字节。

分组ID这个域的作用是当一个大的数据报被拆分时,拆分成的小的数据段的这个域都是一样的。

标记:共三个bit,第一个未使用;第二个DF(Don’t Fragment),设置成1表示这个数据包不能被分割,这个是针对路由器的一条指令;第三个MF(MoreFragment),如果一个数据包被分割了,那么除了最后一个分段以外的所有分段都必须设置为1,用来表示后面还有更多的分段没有到达,最后一个设置为0,用来表示分割的段全部到达。

段偏移量:这个域有13bit,也就是每一个数据报最多有8192个分段。每一个分段的长度必须是8字节的倍数,也就是说8字节是分段的基本单位,当然分组的最后一个段不做限制。这样最大的数据报长度为8*8192=65536字节,比目前限制的最大数据报长度还多1,能够满足对网络中所有数据报传送的需求。

生存时间这是一个生存期计数器,最大为255s,但是实际上使用的时候用作跳数计数器,当值为0时数据报被丢弃,用来避免一个数据报过久的逗留在网络中。

高层协议这里和链路层的类型作用相同,用来表示更高层的协议,这个数据报里是TCP

首部校验和:IP头部的校验和

IP地址:数据报来源主机的IP地址

目的IP地址:数据报目的主机的IP地址


紫色部分:传输层,这里用的是TCP协议

源端口号:数据报来源主机的端口号

目的端口号:数据报目的主机的端口号

注意:IP地址,目的IP地址,源端口号,目的端口号这四个字段唯一的确定了一个TCP链接。

TCP序号(sq)发送的TCP的序号,从0开始,实际中这个值就是发送的数据报中内容的字节数,比如我发送的第一个报中sq=0,数据报内容20字节,那么下一个数据报的sq就应该是21

捎带的确认(ack)确认收到上一个数据报,然后act的值是指定自己想要收到的下一个数据报的sq,比如我收到一个数据报的sq=0,数据报内容20字节,那么我的ack就应该是21,用来标明我sq=0,内容为20字节的数据报已经收到,我接下来期望收到的是sq=21的数据报。

首部长度:IP头部的长度域类似,这个域用来标明TCP头部的长度,单位也是字。

保留:6bit未使用的域

Flag从左到右,[URG|ACK|PSH|RST|SYN|FIN]

ACK 设置为1表示前面的确认(ack)是有效的,否则前面的确认应被忽略。

PSH 表示要求对方在接到数据后立即请求递交给应用程序,而不是缓冲起来直到缓冲区收满为止。

RST 用于重置一个已经混乱的连接。

SYN 用于建立连接的过程。在链接请求中,SYN=1ACK=0表示该数据段没有使用捎带的确认域。链接应答则捎带了一个确认,即SYN=1ACK=1.本质上SYN位是用来表示CONNECTION REQUESTCONNECTION ACCEPTED,然后进一步用ACK来区分是请求还是应答,的确很高明。

FIN 用来释放一个连接。它表示发送方已经没有数据要传输了。然后,在关闭一个连接后,关闭进程可能会在一段不确定的时间内继续接收到数据。SYNFIN数据段都有TCP序号,从而保证了这两种数据段被按照正确的顺序来进行处理。

窗口大小:指定了从被确认的字节算起可以发送多少个字节。要深入理解这个域的含义,可以参看TCP用色控制和慢启动算法

http://blog.csdn.net/alexander_xfl/article/details/13170371

校验和校验范围包括TCP头、数据报内容和概念性伪头部。概念性伪头部又包括源IP,目的IPTCP协议号。

紧急指针指向数据报中紧急数据最后一个字节的下一个字节。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402339.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 系统应用编程——网络编程(TCP 协议三次握手过程)

TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标示: SYN ( synchronous 建立联机 ) ACK ( acknowledgement 确认 ) PSH ( push 传送…

基于ELK的简单数据分析

原文链接: http://www.open-open.com/lib/view/open1455673846058.html 环境 CentOS 6.5 64位JDK 1.8.0_20Elasticsearch 1.7.3LogStash 1.5.6Kibana 4.1.4介绍 ElasticSearch是有名的开源搜索引擎,现在很多公司使用ELK技术栈做日志分析,比如…

[win10] 在桌面上显示计算机、控制面板、网络

1. 右击桌面,选择个性化 2. 选择”主题", 点击“桌面图标设置” 3. 把想要放桌面的图标给钩上

linux下共享文件夹(windows可访问,linux也可访问)

2019独角兽企业重金招聘Python工程师标准>>> 本文是转字网上的两段,如果是菜鸟,想懂有点难度,我这里给点注释 在linux上共享文件夹windows下看 ******************************************* 首先给linux设一个ip,要和…

Linux---进程调度相关命令解析

进程相关命令 1、ps 查看系统中的进程 使用方式:ps [options] [--help] 说明:显示瞬间进程 (process) 的动态 参数:ps的参数非常多, 在此仅列出几个常用的参数并大略介绍含义 ps命令常用用法(方便查看系统进程) 1&a…

Linux 系统应用编程——多线程经典问题(生产者-消费者)

“生产者——消费者”问题是Linux多线程编程中的经典问题,主要是利用信号量处理线程间的同步和互斥问题。 “生产者——消费者”问题描述如下: 有一个有限缓冲区(这里用有名管道实现 FIFO 式缓冲区)和两个线程:生产者和…

Linux 系统应用编程——进程间通信(下)

在前面,我们学习了传统的进程间通信方式——无名管道(pipe)、有名管道(fifo)和信号(signal)。 下面我们来学习 System V IPC 对象: 1、共享内存(share memory&#xff0…

.balignl 16,0xdeadbeef浅析

http://zqwt.012.blog.163.com/blog/static/12044684201031102956976/ 最近在分析u-boot的源代码,看到这一行: .balignl 16, 0xdeadbeef不知道为什么要这样写,0xdeadbeef,明显是个单词组,写在这里有何意义呢&am…

使用maven导入任意jar包

http://mvnrepository.com/ 我这里,因为是spark1.5.2版本。 保存,maven会自动下载jar包到本地仓库。 转载于:https://www.cnblogs.com/lchzls/p/6281764.html

Linux下静态IP地址的设置及TFTP服务的搭建

TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。TFTP承载在UDP上,提供不可靠的数据流传输服务,…

bzoj 3924 幻想乡战略游戏

题目大意: 有边权点权的树,动态修改点权 每次修改后求带权重心x (\(minimize\) \(S\sum_i val[i]*dist[x][i]\)) 分析: 从暴力找突破口: 对于边x,y,设长度为len,切断后x半边树权值和为\(w_1\),y…

Linux 系统应用编程——网络编程(基础篇)

一、网络体系结构 1、OSI模型和TCP/IP 模型 网络体系结构指的是网络的分层结构以及每层使用的协议的集合。其中最著名的就是OSI协议参考模型,他是基于国际标准化组织(OSI)的建议发展起来的。它分为7个层次:应用层、表示层、会话层…

C++中函数的默认参数

使用方法: (1)在函数声明或定义时,直接对参数赋值,该参数就是默认参数。(2)在函数调用时,省略部分或全部参数,这时就会使用默认参数进行代替。注意事项: &…

Linux 系统应用编程——网络编程(socket编程)

二、网络编程基础 1、套接字概述 套接字就是网络编程的ID。网络通信,归根到底还是进程间的通信(不同计算机上的进程间的通信)。在网络中,每一个节点(计算机或路由器)都有一个网络地址,也就是IP地…

php curl拉取远程图片

<?php $url "图片绝对地址/thumbnail.jpg"; $filename curl.jpg; getImg($url, $filename); /**通过curl方式获取制定的图片到本地* 完整的图片地址* 要存储的文件名*/ function getImg($url "", $filename "") {if(is_dir(basename($fi…

利用indent格式化源文件的脚本

脚本一&#xff1a;格式化指定目录下的源文件(*.h, *.cpp...) #!/bin/sh# 格式化某目录下所有*.h, *.c, *.cpp, *.hh文件, 并将文件换行符转换成Linux下的格式if [ $# -lt 1 ]; thenecho "Usage: $0 <dir>"exit 1elsedir$1fi# format a source file(*.c, *.h,…

Struts入门(三)深入Struts用法讲解

访问Servlet APIAction搜索顺序动态方法调用指定多个配置文件默认ActionStruts 后缀接收参数处理结果类型1.访问Servlet API 首先我们了解什么是Servlet API httpRequest、httpResponse、servletContext  3个api对应jsp面向对象&#xff1a;request、response、application …

Linux ALSA声卡驱动之四:Control设备的创建

声明&#xff1a;本博内容均由http://blog.csdn.net/droidphone原创&#xff0c;转载请注明出处&#xff0c;谢谢&#xff01; Control接口 Control接口主要让用户空间的应用程序&#xff08;alsa-lib&#xff09;可以访问和控制音频codec芯片中的多路开关&#xff0c;滑动控件…

jQuery 入门教程(5): 显示/隐藏内容

2019独角兽企业重金招聘Python工程师标准>>> jQuery的hide()和show()可以用来显示和隐藏内容。比如下面的例子&#xff1a;jQuery的hide()和show() 可以用来显示和隐藏内容。比如下面的例子&#xff1a; [html] view plain copy print ? <!doctype html> …

键盘键值表

键盘键值表 值 描述 0x1 鼠标左键 0x2 鼠标右键 0x3 CANCEL 键 0x4 鼠标中键 0x8 BACKSPACE 键 0x9 TAB 键 0xC CLEAR 键 0xD ENTER 键 0x10 SHIFT 键 0x11 CTRL 键 0x12 MENU 键 0x13 PAUSE 键 0x14 CAPS LOCK 键 0x1B ESC 键 0x20 SPACEBAR 键 0x21 PAGE UP 键 0x22 PAGE DOW…