1.区别

tcp协议是对应于传输层,http协议是对应于应用层,从本质上来说,二者是没有可比性的。http协议是建立在tcp协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发送一次http请求。http会通过tcp建立起一个到服务器的连接通道,当本次请求需要的数据完毕之后,http会立即将tcp连接断开,这个过程是很短的。所以http是一种无状态的短链接。所谓的无状态是指浏览器每次向服务器发起请求的时候,不是通过一个连接,而是每次都建立一个新的连接。如果是一个连接的话,服务器进程中就能保持住这个连接并且在内存中记住一些信息状态。而每次请求结束之后,连接就关闭,相关的内容就释放了,所以记不住任何状态,成为无状态连接。

http就是在每次请求完成之后就把tcp连接关闭了,所以是短链接,而我们直接通过socket[套接字]编程使用tcp协议的时候,我们可以自己通过代码区控制什么时候打开连接什么时候关闭连接,只要我们不通过代码把连接关闭,这个连接就会在客户端和服务端的进程中一直存在,相关状态数据就会一直存着。

2.http之状态码

状态码有三位数字组成,第一个数字定义了响应的类别,且有5种可能:

1xx:指示信息----表示请求已接收,继续处理

2xx:成功----表示请求已被接收,理解,接受

3xx:重定向----要完成请求必须进行更进一步的操作

4xx:客户端错误----请求有语法错误或请求无法实现

5xx:服务端错误----服务器未能是实现合法的请求

常见状态码,状态描述,说明:

200:ok      //客户端请求成功

400:bad request     //客户端请求有语法错误,不被服务器所理解

401:Unauthorized      //请求未经授权

403:forbidden    //服务器收到请求,但是拒绝提供服务

404:not found    //请求资源不存在 eg:输入了错误的url

500:internal server error    //服务器发生不可预期的错误

503:server unavailable     //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

3.tcp三次握手和四次分手

传递过程中出现的字符的含义:

SYN,ACK,FIN存放在tcp的标志位,一共有6个字符,这里就介绍这三个:

SYN:代表请求创建连接,所以在三次握手中前两次要SYN=1,表示这两次用于建立连接

FIN:表示请求关闭连接,在四次分手时,我们发现FIN发了两遍。这是因为tcp的连接是双向的,所以一次FIN只能关闭一个方向

ACK:代表确认接受,不管是三次握手还是四次挥手,在回应的时候都会加上ACK=1,表示消息接收到了,并且在建立连接之后的发送数据的时候,都需加上ACK=1,来表示数据接收成功

seq:序列号,当发送一个数据时,数据是被拆成多个数据包来发送,序列号就是对每个数据包进行编号,这样接收方才能对数据包进行再次拼接

ack:这个代表下一个数据包的编号,这也就是为什么第二次请求时,ack时seq+1

三次连接:

1.客户端首先要发送SYN=1,表示要创建连接

2.服务端接收到后,要告诉客户端:我接受到了,所以加个ACK=1,就变成了ACK=1,SYN=1

3.理论上这时候就创建连接成功了,但是要防止一个意外,所以客户端要在发送一个消息给服务端确认一下,这时候只需要ACK=1就行了【如果一个连接请求在网络中跑的慢,超时了,这时客户端会从发请求,但是这个跑的慢的请求最后还是跑到了,然后服务端就接收了两个连接请求,然后全部回应就会创建两个连接,浪费资源!如果加了第三次客户端确认,客户端在接受到一个服务端连接确认请求后,后面再接收到的连接确认请求就可以抛弃不管了】

四次挥手:【tcp是双向连接的】

1.首先客户端请求关闭客户端到服务端方向的连接,这时候客户端就需要发送一个FIN=1,表示要关闭一个方向的连接

2.服务端接收到后是需要确认一下的,所以返回一个ACK=1

3.这时之关闭了一个方向,另一个方向也需要关闭,所以服务端也向客户端发送了一个FIN=1,ACK=1

4.客户端接收到后发送ACK=1,表示接受成功

4.osi的七层模型:

物理层--------数据链路层--------网络层--------传输层--------会话层--------表示层--------应用层

最新文章

  1. 基于Microsoft Azure、ASP.NET Core和Docker的博客系统
  2. ThinkPHP邮件发送函数示例
  3. ITK 3.20.1 VS2010 Configuration 配置
  4. 【No.4 Ionic】修改 cordova 插件
  5. JY02-HTML/CSS-京东01 定位是很粗暴的页面布局方法
  6. 封装一些数据库SQLCipher的方法(增、删、改、查)
  7. python 的内建函数
  8. php文件上传原理详解(含源码)
  9. 【USACO15FEB】审查(黄金)Censoring (Gold)
  10. (二叉树 递归) leetcode 889. Construct Binary Tree from Preorder and Postorder Traversal
  11. linux驱动编写之poll机制
  12. django2.0内置分页
  13. (转)winform之ListView
  14. linux操作系统重启后 解决nginx的pid消失问题
  15. 基于Easyui框架的datagrid绑定数据,新增,修改,删除方法(四)
  16. 让你的QT显示一个窗口吧
  17. I.MX6 Android mmm convenient to use
  18. redis关闭保护模式
  19. vue+element-ui中的图片获取与上传
  20. 旅行青蛙分析(Android篇)

热门文章

  1. 2022年7月14日,第四组 周鹏,认识JAVA的第二天(;´д`)ゞ(;д;)
  2. Dubbo 3 之 Triple 流控反压原理解析
  3. [深度探索C++对象模型]trival constructor和non-trival constructor
  4. uniapp 开发微信小程序问题笔记
  5. Caddy-用Go写的新一代可扩展WebServer
  6. 03初识MapReduce
  7. Flutter 3.7 新特性:介绍后台isolate通道
  8. .NET与大数据
  9. 【随笔记】ATECC608 加密芯片调试记录
  10. chatGPT 桌面版安装教程