怎么理解我们是如何和服务器交互数据的 ( 网络 )

我们做的网页里面,发送数据这个过程解释我发现网上写的都太杂了,这里我大概讲一下数据从打包到传输的一个过程。希望看完这篇文章对大家有所帮助。

了解“报文”

先了解报文,我们就能更好的理解TCP协议中的三次握手,四次挥手,和整个传输过程。

报文是什么,报文是我们客户机 和 服务器“交流的信件”,里面写了我们需要传达的各种信息。而报文其实就是一种结构体

例如 struct tcphdr { (C语言)

int source_port:16;//源端口

}这里我们用最主要的TCP报文图看一下

接下来我们只讲我们需要懂的地方(重点一)

第一列 端口号

是 16位的源端口号是用来存放客户机端口号 也就是发起的,16位的目的地端口号是服务器的端口号 接收方。

在底层代码里面它们俩个其实是一个int内存里面的,在定义的时候是这样的 (源端口) int source_port:16 ;(目的地端口) int destination_port:16 这样子写它们其实会在代码里面合并,我们平常定义int的时候应该是占32位的,而这样子虽然定义了俩次int 但实际上它们每个人只要16位。ps:因为那群写系统的会把每个空间都榨干。

第二,三列 序号,确认号

用于对发送的字节流进行编号。对于TCP连接上的每一个字节,都有一个唯一的序列号,和确认号一起使用。作用 序号用来对发送的字节流进行编号;确认号用来确认已成功接收到序号。因为我们发送的字节流可能会被拆分成几个报文发送 例如 helloword 拆成hello跟word俩个报文,如果hello先到,那么hello里的确认号会作为word里面的序号发送过来。

第四列 ”状态码“ //标志位 //控制位

我们主要看我画了红圈的位置,这里是我们报文的“状态码”。专业的叫标志位和控制位。我们客户机和服务器之间用什么沟通,就用这个红圈里面的信息。其中最重要的就是ACKFIN SYN 。ACK代表确认 FIN代表着发送 SYN代表请求连接 例如,客户端需要发送数据,那么这条数据里面就会有 FIN 如果服务器确认接收到这条数据,那么服务器就会回应它的请求,发送一个报文 里面含有ACK。

那么怎么看ACK 、FIN、SYN 有没有被发送过来呢又或者怎么看其他状态被发送过来了,在C语言里0代表着false//1代表着true,我们看状态码的值是1还是0就可以确认报文里面的状态码是哪个了,第四列理解到这里就行

第五列 数据校验

第一个用于校验数据完整性。第二个只有 在状态码里面的 URG 被设置了 1 才会触发,它告诉接收方紧急数据的位置。

第六列 数据存放

在这里会存放我们需要发送,接收的数据,空间长度可设置,最多是40字节

TCP/IP协议

tcp/ip就是你在传输层中决定要怎么传输的一种协议。想知道更多的可以去文心一言问问或者看别的大佬的文章介绍。

我这里主要讲一下tcp/ip里面的三次握手和四次挥手,以及优化

在我们客户机和服务器之间刚开始的连接我们需要反复确认,直到确认连接以后才能交互数据。而三次握手就是连接开始时的操作保证了连接的安全可靠,四次挥手就是结束连接。

三次握手(建立新连接)

由客户机发起连接请求(第一次握手)这个请求其实就是一个报文,这个报文里面 SYN会设置为1 表示发起新的连接当服务器收到这个报文后就知道客户机要和它建立一个新的连接,于是服务器就发送给客户端一个设置了ACK的报文,表示确认收到他的请求(第二次握手)其实在这个报文里面还设置了SYN请求连接表示服务器同意建立连接,因为这个报文里面也含有SYN请求所以我们客户机也要继续回应服务器发送一个含有ACK的报文(第三次握手)。对于客户机来说通过俩次握手我已经确定能够成功的给服务器发送数据,也能成功的收到服务器的数据。但是对于服务器而言,只有俩次握手是不够的,因为目前为止服务器只能确定可以收到客户机的数据,不确定客户机能不能收到服务器的请求,所以最后还需要一次握手,能够通过这三次交互,我们客户机和服务器会确定连接成功。

四次挥手(断开连接)

四次挥手也是由客户机发起。这时候客户机会发送一个FIN被设置为1的报文:第一次挥手 (ps:除了建立连接发送SYN,其他时候发送FIN)当服务器收到这个报文以后,它就知道了客户端想要断开连接,但是这时候服务器不一定做好了准备。因为客户机发送这个报文的时候可能我们之间还有数据没有发送完,可能还要继续发送。所以服务器只能先发一个确认信息也就是回一个带有ACK的报文给客户机:第二次挥手,说我知道你要断开了。接着服务器如果有数据还在传输的话那么会让客户机等他一下,等到数据发送完接着服务器这时已经准备好断开了,所以它发了个带FIN的报文给客户机:第三次挥手,这时客户机收到FIN的报文以后也发ACK报文回应给服务器:第四次挥手。至此四次挥手结束。通过这四次沟通客户机和服务器就都已经做好了断开的准备。其实在第二次挥手的时候是可以简化的,类似像握手的那样。在第二次的时候把ACK和FIN一起发过去,最后只需要客户机再回复ACK,这样就减少发送了一次请求。

看完以上的图和讲解,大概对tcp/ip有个概念了。这时我们可以思考一下三次握手,四次挥手能不能是四,五次握手或者五六次挥手。其实是可以的,无非就是在原有的基础上加固。也就是更加确认。讲完tcp/ip协议我们可以解释数据是如何传送的了。

本机封装

首先,我们的数据不论是服务器还是客户机都会经过四层封装。数据会依次经过应用层、传输层、网络层、数据链路层,完成封装。

我们一个个解释。

FTP头

也就是http和https、

TCP头

就是我们刚刚说的TCP协议(这里有可能是UDP协议)俩者都是网络传输的协议,取决你要用哪种。TCP需要建立连接再传输数据,UDP是无连接的协议,在发送数据之前,UDP不需要建立连接,而是直接发送数据报。因此,UDP具有更高的效率和更低的延迟,但也可能导致数据丢失或乱序。、

IP头

就是封装源IP地址和目的IP地址//本地IP和服务器IP

数据帧头

给数据封装上头尾还有MAC地址,头尾帧用于标识数据的开始和结尾。MAC地址:物理地址,也就是位置信息。比如你在广东发送请求那么你的MAC地址就是广东的,如果你人去了广西发这个请求,那么MAC地址就是广西的 。

封装过程

那么我们的数据是怎么怎么进行封装的呢,就好比如一颗糖,我给它包上了一张纸,这第一张纸就是在应用层里,我包上了FTP头。然后我又给它包上一张纸,这第二张纸就是传输层。以此类推,我(客户机)一共包了四张纸给了小明(服务器)。那么小明拿到我包的糖以后,他要从最外面的纸开始拆,也就是数据链路层开始拆,然后再拆网络层,全部拆完以后他才能吃到我的糖果,对应的 如果小明要给我糖,也是从第一张开始包(应用层)。到这里我们应该比较清晰的知道整个数据的交互过程了。

代码的形式

那么在我们代码里面这个数据是长什么样子呢。它类似于我们前端nginx打包后的代码,全部都在一行,以字符串(字节流)的形式。它转变成字符串的这个过程或者行为就叫 ”序列化“ 以便可以将其写入文件、传输到网络或存储在数据库中(数据缓冲区)。

”反序列化“就是把已经转化的数据重新转换回原始数据结构或对象的过程。

至此我们就大概了解了数据之间的交互。和相关的网络协议,每一层都是一种协议。最后大家可以多讨论一下,有什么不足的地方希望各位小伙伴和大佬补充。

#java##网络安全##学习编程[话题]##TCP网络##悬赏#
全部评论
为什么要序列化和反序列化,因为咱们发送数据的时候可能是好几百个报文,序列化和反序列化让服务器or客户机知道要读几条报文
1 回复 分享
发布于 05-27 16:28 广东
非常好的文章收藏了
点赞 回复 分享
发布于 05-27 20:01 广东
膜拜大佬,收藏了
点赞 回复 分享
发布于 06-11 16:18 北京

相关推荐

把球:这个听过,你加了就会发现是字节的hr
点赞 评论 收藏
分享
八极星:我看成了化身一团黑子哈哈哈😂
点赞 评论 收藏
分享
4 4 评论
分享
牛客网
牛客企业服务