linux网络编程之通信协议格式

好文参考:《网路传输的三张表:MAC地址表,ARP缓存表和路由表》http://www.cnblogs.com/clovn/p/4911212.html

(1)数据包封装

          传输层及其一下的机制由内核决定,主要负责通讯的具体细节;应用层由用户进程提供,主要负责对通讯数据的含义进行解释。应用层数据通过协议栈发送到网络上,为了保证数据能够被接收,需要在每层协议之前加一个数据首部作为标识,我们称之为封装,具体格式如下

                 

(2)以太网帧格式

            1) 在链路层中,传输的数据我们称为帧,具体的帧格式如下图所示:

   

         其中:图中的目的地址和原地址指的是网卡的硬件地址(MAC地址,即网卡编号,唯一),CRC为校验位

          2)ARP数据报格式:获取下一跳(下一个路由节点)的MAC,实现数据传递。

              1>在网路传输的过程中,只有知道目标的MAC地址(未知)和发送数据起点的MAC地址(已知),才能进行正常的数据传输。如果得知目标的MAC地址,通过ARP发送数据请求和数据应答即可得到目标的MAC地址,ARP数据报的格式如下:

              

              2> 具体的实现流程:

                 在数据过程中,首先需要获得目标的MAC地址,这就需要使用ARP协议了。在每台主机中都有一个ARP缓存表,其中记录了主机IP和MAC地址的对应关系。如果AB之间想要通信,A首先会检查自己的ARP缓存表中是否有B的IP地址和对应MAC地址的对应关系。如果有,则会将B的IP地址和对应的MAC地址填到ARP数据报中;如果没有,则A会发一个ARP请求给B,此时交换机接收到这个数据帧(广播帧),将数据以非接口的形式广播出去。此时B收到这个数据帧,会检查是否和自己的IP相同,如果不同,则忽略信息,如果相同,则会将A的IP和MAC地址的对应关系记录在自己的ARP缓存表中,同时将给A发送一个ARP应答数据(拆包和组包),其中包括B的MAC地址。A收到B的应答数据后,会将B的IP地址和MAC地址填入到自己的ARP缓存地址中。

                在网路传输中,交换机在收到数据帧之后,会将数据帧中的MAC地址和端口号记录在MAC表中,然后在表中寻找有没有数据帧目标的MAC地址信息。如果有,则直接将数据从表中的接口传递给下一个MAC地址(单播);如果没有,则将数据以非接口的形式发送出去(称为广播)(现在的路由器一般都包含了交换机在内)。 

               通过路由节点的不断拆包和组包,直到找到封装在网络层IP协议中的目的地址.数据包在不断传递的过程中,最长的生命周期,我们称之为TTL

            3>IP段格式:数据前面的那段我们称为IP首部(固定部分+可变部分)

          

         其中:4位版本号:IPV4/IPV6     4位首部长度:数据首部的最大字节数(最小为5,最大为15,以4字节为单位)

                      16位总长度:数据报的最大长度为2^16-1=65535字节(首部和数据之和长度)

                      13位片偏移:用于传输较大的数据,切片时记录片的编号(片偏移以8字节为偏移单位)

                      8位生存时间:为起始主机到目标主机之间最多可存在255个路由节点(最多有255跳)

                      32位源IP地址:发送数据端的IP              32位目的IP地址:接收数据端的IP

               4>UDP数据报格式

             

       由于在一个主机中,不同的应用对应于不用的进程,也就是所谓的端口号。因此通过指定两个端口号,就可以指定两个应用进行通信,从而不会导致数据传输错乱。

          5>TCP数据报格式

               

          和UDP相比,TCP数据报格式相对来说比较复杂,除了相对的端口号,还有序号和确认序号,用来重构数据使用。

 

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

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

相关文章

88. 合并两个有序数组 golang

88. 合并两个有序数组 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。 你可以假设 nums1 有足够的空间(空间大小大于或等于 m …

linux网络编程之Socket编程

(1)socket套接字 1)在linux环境下,socket用于表示进程间网络通信的特殊文件类型,其本质是内核借助缓冲区形成的伪文件(不占磁盘空间,除此之外还有二进制文件,管道,字符文…

Linux操作系统之简易实现server/client

1.首先将出错处理封装成函数,具体封装思想:是在底层函数的基础上将首字母大写(方便在编程中查找函数文件的manpage,而不需要使用命令,直接用shiftk),然后调用底层库函数并考虑出错处理,具体函数如下&#x…

75. 颜色分类 golang

https://leetcode-cn.com/problems/sort-colors/solution/75-yan-se-fen-lei-golang-by-hodgekou/ Me func sortColors(nums []int) {sort.Ints(nums) }tips package mainimport ("fmt""sort" )//定义interface{},并实现sort.Interface接口的三个方法 ty…

linux网络编程之TCP三次握手和四次挥手

1.在TCP连接的过程中,有三个阶段,分别是建立连接,传递数据和断开连接,通讯时序图如下所示: 2.结合TCP数据报格式分析建立连接的三次握手 1)首先客户端发送一个带有SYN标志的TCP报文给服务器端,询问服务器端…

451. 根据字符出现频率排序golang

官解 func frequencySort(s string) string {charMap : make(map[rune]int)arr : make([]string, len(s))for _,c : range s {charMap[c]}for k,v : range charMap {arr[v - 1] strings.Repeat(string(k), v)}r : ""for _,c : range arr {r c r}return r }自定义排…

linux网路编程之多进程并发服务器

1)使用多进程并发服务器考虑的因素: (1)父进程描述最大文件描述符的个数(父进程需要关闭accept返回的新文件描述符) (2)系统内可创建进程的个数(与内存大小相关&#xff…

69. x 的平方根 golang

Me https://leetcode-cn.com/problems/sqrtx/submissions/ func mySqrt(x int) int {return int(math.Sqrt(float64(x))) }

linux网路编程之多线程并发服务器

1)在使用进程模型开发服务器过程中考虑以下问题 (1)调整进程内最大文件描述符上限 (2)线程如有共享,考虑线程同步 (3)客户端线程退出时,做退出处理(线程分离&…

744. 寻找比目标字母大的最小字母 golang

官解 func nextGreatestLetter(letters []byte, target byte) byte {idx : 0for i : 0; i < len(letters); i {if letters[i] > target {idx ibreak}}return letters[idx] }Me 这个题答得很差劲&#xff0c;可能有点累 func nextGreatestLetter(letters []byte, target…

linux网路编程之TCP状态转换及端口复用

&#xff08;1&#xff09;TCP状态转换图 其中图中分为三种状态&#xff1a;实线代表的主动发起连接&#xff0c;虚线代表的被动发起连接&#xff0c;细实线代表的可以双向发起连接的状态。 主动发起连接方状态变化&#xff1a;1&#xff09;主动发起连接的一方发送SYN标志位&…

153. 寻找旋转排序数组中的最小值 golang

153. 寻找旋转排序数组中的最小值 golang Me func findMin(nums []int) int {if len(nums) < 2 {return nums[0]}i, j : 0, 1for j < len(nums) {if nums[i] < nums[j] {ij} else {return nums[j]}}return nums[0] }

linux网络编程之多路I/o转接服务器select

(1)多路IO转接服务器也叫做多任务IO服务器&#xff0c;其主要思想是不再由程序自己监听客户端连接&#xff0c;取而代之的是由内核替应用程序监视文件&#xff0c;具体实现模型如图所示&#xff1a; 当客户端请求和服务器连接时&#xff0c;内核接收到连接指令&#xff0c;告诉…

linux网络编程之多路I/O转接服务器poll函数

&#xff08;1&#xff09;poll函数 头文件&#xff1a;#include<poll.h> int poll(struct pollfd*fds, nfds_t nfds,int timeout); struct pollffd{ int fd;//文件描述符 short events;//监控的事件 short revents;//监控事件中满足条件返回的事情 }&#xff1…

540. 有序数组中的单一元素 golang

540. 有序数组中的单一元素 golang func singleNonDuplicate(nums []int) int {if len(nums) < 1 {return nums[0]}i : 0for i < len(nums) - 1 {if nums[i] ! nums[i1] {return nums[i]} else {i2}}return nums[i] }

C/C++构造及析构顺序及变量的生命周期

&#xff08;1&#xff09;变量的构造及析构顺序 1&#xff09;在全局范围内定义的对象&#xff08;即在所有函数之外定义的对象&#xff09;&#xff0c;它的构造函数在文件中的所有函数&#xff08;包括main函数&#xff09;执行之前调用。如果一个程序中有多个文件&#xff…

34. 在排序数组中查找元素的第一个和最后一个位置 golang

34. 在排序数组中查找元素的第一个和最后一个位置 https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/submissions/ Me func searchRange(nums []int, target int) []int {result : make([]int, 2)result[0] -1result[1] -1for …

C/C++继承与派生

&#xff08;1&#xff09;派生类的访问属性 1&#xff09;public继承&#xff1a;派生类中&#xff1a;可以访问基类的public和protect变量&#xff0c;不可以访问基类的private变量 派生类外&#xff1a;可以访问基类的public变量&#xff0c;不能访问基类的private变量 2&am…

C/C++之string类小结

&#xff08;1&#xff09;C字符串和C字符串的转换 C提供了三种方法可以将C字符串转化为C字符串&#xff0c;分别是data(),c_str(),copy()成员函数来实现。 1&#xff09;data()是以字符数组的形式返回字符串内容&#xff0c;但并不添加‘\0’&#xff1b; 2&#xff09;c_str(…

2.两数相加 golang

测试用例1500多个&#xff0c;考虑的情况非常多 测试用例 [0] [1] [2] [3,4,2] [5,0] [2] [1] [0] [9,8] [0] [4,6,5] [5,0] [1] [9] [0] [0,9] [2] [8,0,7] [0,1] [3] [0,1]func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {result : &List…