美文网首页
客户端如何处理一个请求?

客户端如何处理一个请求?

作者: Black哞哞儿 | 来源:发表于2019-06-04 14:53 被阅读0次

书接上文,今天就来聊一聊客户端如何处理一个请求,博主也个渣渣后端工程师,所以客户端的东西了解的较少较浅,也只能简单和大家聊一聊,如有不对也请指出

客户端收到指令后,肯定是先进行数据的封包,于是这个时候就不得不拿出我压箱底的《TCP/IP详解(卷1)》这本书,然后打开概述,我们这里以tcp/ip协议族(这里有几千个协议,当然我们关注的也只有那么十几个)的四层模型为例,来看看客户端(应用程序+操作系统)对数据进行封装顺序:

从上至下(应用层、传输层、网络互连层、主机到网络层)

数据封装:

· 数据的叫法:

        应用层:段

        传输层:报

        网络互连层:帧

        主机到网络层:比特

数据封装过程

· TCP报文段

报文头部

32位的原端口和目的端口,没啥,过

32位的序号:传送的字节流的起始序号,对应每个字节,最多4Gb的数据对应的序号范围 :[0, 2^32 -1],假如10kb的数据要分两段传输,则需要 10 * 1024个序号 = 10240,所有字节对应的序号范围[0, 10139] , 那么第一段的序号为0,第二段的序号为5120

32位的确认号:每次接收端接受完一次数据,确认序号段包含发送确认序号端希望下一次接受的序列号。依旧是上文的例子,A发送10kb数据给B,分两段,第一段A发送给B,序号:0和5kb的数据,那么B在返回的报文中的确认号就是5120,表示希望下段报文的序号是5120

4位的数据偏移:TCP报文段的首部长度,即报文段首部的起始到报文段数据的起始的长度,单位4字节,长度是4位,4位最大可表示的数(15),数据偏移最大可表示60字节

6位的保留:占位

URG:URGent pointer 紧急指针有效 URG置为1时,发送应用进程就告诉发送方的TCP有紧急数据要传送。于是发送方TCP就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍然是普通数据。这时要与首部中紧急指针(Urgent Pointer)字段配合使用

ACK:ACKnowledgment 仅当ACK = 1时确认号字段才有效,当ACK = 0时确认号无效。TCP规定,在连接建立后所有的传送的报文段都必须把ACK置为1

PSH:PuSH 当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应。在这种情况下,TCP就可以使用推送(push)操作。这时,发送方TCP把PSH置为1,并立即创建一个报文段发送出去。接收方TCP收到PSH=1的报文段,就尽快地(即“推送”向前)交付接收应用进程。而不用再等到整个缓存都填满了后再向上交付

RST:ReSeT 当RST=1时,表名TCP连接中出现了严重错误(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立传输连接。RST置为1还用来拒绝一个非法的报文段或拒绝打开一个连接

SYN:SYNchronization 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK=1,因此SYN置为1就表示这是一个连接请求或连接接受报文

FIN:FINis 用来释放一个连接。当FIN=1时,表明此报文段的发送发的数据已发送完毕,并要求释放运输连接

16位的窗口:因为接收方的缓存数据存储空间有限,所以用窗口值作为接收方让发送方设置其发送窗口的依据。还是用上文的例子,A准备给B发送10kb数据,分两段,但是B接受A第一段数据后,存储空间只剩下3kb,那么返回的报文中的窗口值为3*1024 = 3072, 用窗口值来提醒A,自己并不能接收剩下的5120个字节的数据

16位校验和:检验和字段检验的范围包括首部和数据这两部分。和UDP用户数据报一样,在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。伪首部的格式和UDP用户数据报的伪首部一样。但应把伪首部第4个字段中的17改为6(TCP的协议号是6);把第5字段中的UDP中的长度改为TCP长度。接收方收到此报文段后,仍要加上这个伪首部来计算检验和。若使用TPv6,则相应的伪首部也要改变

16位紧急指针:标记紧急数据在数据字段中的位置,当URG=1时有效

选项:数据偏移量最大表示60字节,而TCP报文首部固定20字节,那么选项部分最大可以是40字节的数据。最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍

· UDP报文段

UDP报文段

16位的长度:表示UDP报文段的长度,最小为8字节,表示仅有头部数据

源端口、目的端口、校验和见上文

强缓存/协商缓存

未完待续。。。。

参考:

《TCP/IP详解卷1:协议》第1章 概述-读书笔记

相关文章

  • 学习tomcat——如何建立连接,处理请求

    tomcat如何建立连接,处理请求 学习探讨tomcat如何建立网络连接协议,并处理客户端过来的请求 建立http...

  • API Clients - Django REST framew

    API客户端-Django REST框架 API客户端 API客户端处理如何发出网络请求和如何解码响应的基本细节。...

  • strust2的详细工作流程

    Struts2请求处理流程 1.客户端发送请求(客户端初始化一个指向servlet容器(如tomcat)的请求) ...

  • 多线程多进程线程池进程池

    利用并发处理来自客户端的请求, server端 线程池处理请求 多线程处理请求 telnet 10.0.122.1...

  • Servlet相关

    用来处理客户端发送来的请求,并对该请求做出响应。 处理请求 将处理的结果通过响应发送到客户端 通常情况下 我们现在...

  • 无镜--kafka之延迟操作

    服务端在处理客户端的请求,针对不同的请求,可能不会立即返回响应结果给客户端。在处理这类请求时,服务端会为这类请求创...

  • JSP页面的生命周期

    jspService()方法被调用来处理客户端请求。对于每个请求,JSP引擎创建一个新的线程来处理该请求。如果有多...

  • Future模式

    Future模式 概念 处理流程 传统处理流程 客户端发出call请求,这个请求需要很长一段时间才能返回。客户端一...

  • SKIL/工作流程/Java部署客户端

    Java部署客户端 SKIL部署客户端是用于处理SKIL客户端请求的Java API。与原始JSON请求相比,它直...

  • springMVC的执行流程

    客户端发送请求-> 前端控制器 DispatcherServlet 接受客户端请求 -> 找到处理器映射 Hand...

网友评论

      本文标题:客户端如何处理一个请求?

      本文链接:https://www.haomeiwen.com/subject/ybsvtctx.html