HTTP-TCP总结
发布日期:2022-02-17 02:39:48 浏览次数:33 分类:技术文章

本文共 2542 字,大约阅读时间需要 8 分钟。

一、HTTP

Hyper Text Transfer Protocol是一种无状态的、以请求|应答方式运行的协议。它支持可扩展的语义和自描述消息格式,与HTML可以灵活互动

  • 无状态:浏览器无法识别谁连接它→cookie
  • 请求应答方式:request、response
  • 可扩展的语义:头部可以添加自定义标签
  • 自描述消息格式:可以自己定义消息的格式,如application/json、text/html、text/plain

1. HTTP消息格式

消息格式 request response
起始行 GET / HTTP1.1 HTTP1.1 200 OK (404 Not Found)
头部字段集合 Connection:keep-alive Content-type:text/html
空行
消息正文
  • 可扩展的语义不要使用下划线,因为某些浏览器不会解析,建议使用’-’

在这里插入图片描述

2. HTTP请求的过程

① 浏览器输入网址,按下inter

② 域名解析。首先从本地缓存李查看有没有这个域名的IP地址(浏览器缓存、操作系统自身的DNS缓存、本机域名解析文件),如果没有就向DNS服务器发送请求获取

  • chrome://net-internals/#dns
  • ipconfig /displaydns
  • C:\Windows\System32\drivers\etc

在这里插入图片描述

TCP三次握手建立连接后→浏览器就发送HTTP请求→应用服务器就响应,发送HTML代码→浏览器解析HTML代码,然后发送请求获取JS、图片等等资源→浏览器呈现完整的页面

④ 页面关闭,就通过TCP四次挥手结束连接

3. 推荐阅读

二、TCP

Transmission Control Protocol是面向连接的、可靠的、基于字节流的传输层通信协议

  • 面向连接的:数据传输之前需要先建立连接→三次握手

  • 全双工:双方都有单独的管道进行通信

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iju9A897-1607612211924)(全双工-半双工-单工.jpg)]

  • 基于字节流:不是把数据全部一次性传输,而是打包成一段一段的,发过去后再按照顺序组合起来,就得到完整的数据

  • 流量缓冲:双方都建立了一个缓冲区,以提高接收效率

  • 可靠的传输服务:会保证数据到达对方,没有收到回应就会认为数据丢失了,会进行重发

  • 拥塞控制:网络条件不好的话,还会动态调整每次发送的数据的大小和速度

1. TCP的报文格式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZSFrLC6k-1607612211930)(image-20201210202623864.png)]

  • sequence number:本段数据的第一个字节的序号,每一个字节一个序号【例如当前序号是300,数据长度是100,则下一个报文段序号是400】
  • acknowledge number:指明下一个期待收到的字节序号,表名之前的数据已经成功收到,ack=1才有效
  • 窗口大小:发送到告诉自己接收端的缓存大小,以来控制自己发送数据的速率啥的

2. 三次握手

① 假设服务端启动了80端口监听,进入监听状态。客户端创建发送syn包(seq=x)→进入SYN_SENT状态→等待服务端响应【创建一个数据结构,保存源端口、目的端口、地址、序号等,然后设置SYN=1,seq=x】

服务端收到syn包,要确认收到→设置ACK=1(ack=x+1)→自己也发送一个syn包(seq=y)→发送这个包SYN+ACK包过去,进入SYN_RECEIVED状态

客户端收到SYN+ACK包后,就发送ACK(ack=y+1),自己进入ESTABLISH状态。服务端收到后也进入ESTABLISH状态,至此,三次握手圆满结束。

在这里插入图片描述

在这里插入图片描述

注:TCP连接的第一个报文序列号(ISN)是0,那么后续每个报文的序列号是固定的。但是为了防止黑客使用TCP Spoof方法攻击,这个ISN要求是随机的,避免被黑客猜到。在Windows的不同版本,或者Linux的不同版本,这个随机的方法都不太一样。RFC1948里建议的随机算法是ISN=M+F(localhost, localport,remotehost, remoteport)其中M是一个计时器,每4毫秒加1。F是一个Hash算法,比如MD5或者SHA256。TCP协议要使用的序列号是后面报文实际携带的序列号和ISN的相对值

3. 四次挥手

① TCP客户端发送一个FIN(seq=i),客户端进入FIN_WAIT_1状态

服务端收到后,发送一个ACK(ack=i+1),服务端进入CLOSE_WAIT(因为是全双工,现在才服务端到客户端单方面关闭,所以还不是完全关闭)客户端收到ACK后,就进入FIN_WAIT_2状态

③ 所有数据都传完了,服务端发送一个FIN(seq=j),比如close方法,进入LAST_ACK【等待最后的ack】

客户端接收到FIN后,发送ACK(ack=j+1),服务端就自己关了,客户端进入TIME_WAIT状态,会等待2MSL时间(TCP报文在Internet最长生存时间,主要还是确认网络中所有数据都接收了-比如最后一个ACK丢了,服务端会重发,客户端才知道丢了)

在这里插入图片描述

4. 理解TCP字节流

TCP是传输层,并不关心上一层传的数据是啥,它只管根据对方窗口和网络情况动态决定一个个 报文段的长度(另外TCP缓冲区还会去重)

在这里插入图片描述

5. TCP可靠性传输

5.1 停止等待协议:

客户端发送M1到服务端→服务端收到后,返回ACK→客户端再发送M2→服务端收到,返回ACK

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4vUOm8y9-1607612211943)(image-20201209151109765.png)]

缺点:感觉像单线程一样,效率很低

5.2 重传机制

对于数据丢包后,该怎么办呢?

​ ① ACK报文丢失:客户端发送M1,等待一段时间后,发现没收到ACK,就知道丢了,于是再发送M1,直到收到ACK

在这里插入图片描述

​ ② 请求报文丢失:客户段发送M1过去,M1丢了,于是隔段时间再发,直到收到ACK

在这里插入图片描述

5.3 滑动窗口和累计确认ack

上面的效率不高,每次接收一个报文,服务端要回复ACK,要好几十个字节,很浪费,于是设计了一个高效的类似于多线程的发送方案(滑动窗口应该是在缓冲区那里设置的一种算法)

在这里插入图片描述

  • 思路就是客户端一次性发送多个报文,服务端接收后(会等待一下,多接受几个数据后),回复收到的最大的序号
  • 滑动窗口的大小还会收到网络情况而动态调整

三、说明

本文只是理解并参考了一部分博客,要深究的话其实还有很多知识。由于博主知识有限,有误之处还请指出!

转载地址:https://blog.csdn.net/qq_39811414/article/details/111025810 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:博客2-部分容器以及泛型
下一篇:Typescript笔记

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月18日 22时20分43秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

OGNL,OGNL在Struts2环境当中的使用(入门) 2021-06-29
Java OGNL入门(Java环境当中使用) 2021-06-29
Struts2的值栈(ValueStack),详解+图解 2021-06-29
OGNL中特殊字符 # $ %的用法和含义,案例+解析 2021-06-29
Struts2的拦截器,Struts2的执行流程,图解+详解(底层代码)以及 自定义拦截器(配置和使用) 2021-06-29
Struts2的标签库大全(案例+用法+解析) 2021-06-29
Struts2数据有效性的校验的两种方式,Struts2数据校验(案例+解析) 2021-06-29
Struts2的国际化 全局的国际化:(JSP,Action,配置文件)Action范围的国际化:包范围的国际化:临时的国际化 2021-06-29
Spring的IOC的注解开发(案例+解析) 2021-06-29
Spring的AOP(面向切面编程)的XML开发以及Spring的AOP的底层原理(案例+解析) 2021-06-29
Spring的切入点AspectJ表达式(解析) 2021-06-29
Spring的AOP的注解开发,基于AspectJ的注解开发 2021-06-29
Spring的事务管理(解析+转账案例) 2021-06-29
SSH框架整合:延迟加载问题的解决 2021-06-29
SVN:自己搭建源代码的版本控制系统(服务端VISUALSVN+客户端TortoiseSVN安装和使用)模拟客户使用的过程(使用大全) 2021-06-29
环境搭建 + 用户登录注册| CRM客户关系管理系统项目实战一(Struts2+Spring+Hibernate)解析+源代码 2021-06-29
Java Web项目源代码|CRM客户关系管理系统项目实战(Struts2+Spring+Hibernate)解析+源代码+教程 2021-06-29
客户管理模块(保存查询客户)| CRM客户关系管理系统项目实战二(Struts2+Spring+Hibernate)解析+源代码 2021-06-29
客户管理模块(文件上传-图片/删除-修改客户/条件查询客户)| CRM客户关系管理系统项目实战三(Struts2+Spring+Hibernate)解析+源代码 2021-06-29
联系人管理-查询列表| CRM客户关系管理系统项目实战四(Struts2+Spring+Hibernate)解析+源代码 2021-06-29