网络编程-TCP/IP协议栈-UDP/HTTP协议

UDP协议

  • UDP协议全称是用户数据报协议,在网络中她与TCP协议一样用于处理数据包,两个协议同处于协议栈的传输层,和TCP不同的是,UDP是一种无连接的协议栈。

  • 因为UDP是无连接的,所以相对来说,UDP的报头比TCP要简单的多了。如下图:
    在这里插入图片描述

  • UDP特点:

    • 第一UDP是一个非连接的协议,传输数据之前源端口和终端不建立连接,当他想传送时就简单的去抓取来自应用城西的数据,并尽可能快的把他扔在网络上,在发送端,UDP传送数据的速递仅仅是受应用程序生成数据的速度,计算机的计算能力,和传输带宽的现在;在接受端,UDP吧每个消息段放再队列中,应用程序每次从队列中读一个消息段。
    • 由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一天服务器可以同时向多个客户端传输相同的消息
    • UDP信息包的标题短,只有8字节,相对于TCP的20字节信息包的额外开销很小
    • 吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率,传输带宽,源端和终端主机性能的限制
    • UDP使用尽量大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表(这个表中有许多参数)
    • UDP是面向报文的,发送方的UDP对应应用程序交下来的报文,在添加首部后就向下交付给IP层,即不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。
  • 我们经常用PING命令来测试两台主机之间TCP/IP通信是否正常,其实PING命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的信息及时反馈回来,那么网络就是通的。

HTTP协议

  • HTTP协议名为超文本传输协议。这个协议在TCP/IP协议栈的应用层,因此,我们无需关系HTTP是如何传输的,只需要看我们传输的内容,能否正确的被接收端识别。
  • HTTP是基于TCP实现的,简单说来,TCP协议负责可靠的内容传输,HTTP协议负责识别内容,两者本身不在一个层面,没有可比性。
  • HTTP是无状态的意思是,每一次的内容解析是没有关联的。TCP有状态是指两端在连接过程的时候是有在连接中的状态
  • HTTP包含两种报文类型,请求报文,响应报文。
    • 请求报文用在客户端对服务器的请求时候使用的报文格式
    • 响应报文用在服务响应请求的报文格式
HTTP协议请求消息结构
  • 客户端发生一个HTTP请求奥服务器的请求消息包括一下格式:请求行(request line),请求头部(header),空行和请求数据四个部分组成,下图给出了请求报文的一般格式。
    在这里插入图片描述
  • 如上图所示HTTP消息主要包含以下实质内容(空格和换行也不能少):
    • 请求方法
    • URL:统一资源定位符
    • HTTP请求头部
    • HTTP请求体
  • 以下是一个HTTP请求的例子,从Fiddler抓包工具中抓出来的一个请求案例。
//1. post:请求方法  
//2. http://edu.zhenai.com/api/business/supremecourse/course.do:请求URL 
//3. HTTP/1.1:HTTP协议以及版本
POST http://edu.zhenai.com/api/business/supremecourse/course.do HTTP/1.1
//以下报文头部
Cookie: token=506188.1587368100293.ef83f599f1a54833d0cc5124da98140a.test; token=506188.1587368100293.ef83f599f1a54833d0cc5124da98140a.test; sid=88TIsgom9Xqw3GMLTDv0; 
User-Agent: PostmanRuntime/7.25.0
Accept: */*
Cache-Control: no-cache
Postman-Token: 4b0c8482-cce5-40e2-a7b9-a251378c6475
Host: edu.zhenai.com
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 30
zone: 1027071-liaojiamin
Host: edu.zhenai.com
//以下报文体
supremeCourseID=129&allow=true
HTTP请求方法
  • HTTP包含来多种不同的请求方法,每一种请求方式用在不同的场景
序号方法描述
1GET请求指定页面信息,并放回实体主体
2HEAD类似get请求,不过返回的响应中没有具体的内容,用于获取报头
3POST向指定资源提交数据进行处理请求(例如提交表达或者上传文件),数据被包含在请求体中,POST请求可能会操作新的资源的建立和/或已有资源的修改
4PUT从客户端想服务器传送的数据取代指定的文档内容
5DELETE请求服务器删除指定内容
6CONNECTHTTP1.1协议中预留给能够将连接改为管道方式的代理服务器
7OPTIONS允许客户端查看服务器的性能
8TRACE回显服务器收到的请求,主要用于测试或诊断
URL-- 统一资源定位符
  • URL由三部分组成:资源类型,存放资源的主机域名,资源文件名
  • URL的一般语法格式为(带括号 [ ] 的是可选项目): protocol 😕/ hostname[:port] / path / [;parameters][?query]#fragment
  • 如上面HTTP请求案例中的URL:http://edu.zhenai.com/api/business/supremecourse/course.do&supremeCourseID=129&allow=true
    • protocol:http
    • hostname:edu.zhenai.com
    • parameters:supremeCourseID=129&allow=true
    • path:api/business/supremecourse/course.do
HTTP请求头
  • 请求头中主要包含本次请求的附加信息,其中常用的字段如下:
    • Accept:指定客户端能够接受的内容类型
    • Accept-Encoding:指定浏览器可以支持的web服务器返回内容压缩编码类型
    • Accept-Language:浏览器可接受的语言
    • Content-Length:请求的内容长度,如:Content-Length:348
    • Content-Type:请求的与实体对于的MIME信息,常用的类型也有很多中,如下表信息中列出
    • Date:请求发送日期和时间
      更多的HTTP响应头和请求头信息对照表
//Content-type常用类型
text/html:HTML格式
text/plain:纯文本格式
text/xml:xml格式
image/gif:gif图片格式
image/jpeg:jpg图片格式
image/png:png图片格式
//以为application开头的媒体格式类型:
application/xhtml+xml:XHTML格式
application/xml:xml数据格式
application/atom+xml:atom xml聚合格式
application/pdf:pdf格式
application/msword:word文档格式
application/octet-stream:二进制流数据
application/x-www-form-urlencoded:form表达数据被编码后送到服务器
HTTP请求体
  • 在整个报文中,请求头之后,隔一个空格,以下部分就是HTTP的请求体。
  • 请求体是我们发送请求的时候需要传给接收端的内容。其格式需要和请求头中的Content-Type对应,不日回导致接受无法识别。如上案例中的请求体:supremeCourseID=129&allow=true
HTTP响应
  • HTTP的响应统一分为:响应行,响应头,响应体,和请求报文有点类似。总体结构如下:
// 状态行,用于描述服务器对请求的处理结果
HTTP/1.1 200 OK 
// 多个响应头:响应头用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理之后他返回的数据
Server: nginx/1.15.5
Date: Mon, 29 Jun 2020 13:31:00 GMT
Content-Type: application/json;charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
Content-Disposition: inline;filename=f.txt
Content-Length: 2166// 此处保留一个空行
//实体内容:代表服务器向客户端返回的数据信息。
{"data":{"msg":"获取成功",......}
HTTP响应行
  • 响应行中包含来HTTP的版本和本次请求的状态,请求状态的对于值见其他资源HTTP响应码
HTTP响应头
  • 响应头用于描述服务器的基本信息,数据的描述,这些信息将告知客户端如何处理响应题中的内容
    • Allow服务器支持哪些请求方法(GET,POST)
    • Content-Encoding 文档的编码(Encode)方法。
    • Content-Length 表示内容长度。
    • Content-Type 表示后面的文档属于什么MIME类型。
      更多的响应头字段参考资源HTTP响应头和请求头信息对照表
HTTP响应实体
  • 响应实体中包含的就是客户端从服务器中获取的数据。数据的格式和长度都会在响应头中描述。

上一篇 网络编程-TCP/IP协议栈-TCP协议
下一篇 网络编程-HTTPS协议的实现原理

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

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

相关文章

十问十答 Ms-PL 许可证

Microsoft 公共许可证(The Microsoft Public License)是微软为释出开源项目而编写和发布的自由开源软件许可证。如果你用 .NET 开发,你会经常碰见 Ms-PL。在微软的自由开源项目托管地 Codeplex(已寿终正寝,微软已战略转…

网络编程-HTTPS协议的实现原理

HTTP传输协议缺点 之前几篇文章中详细讲解了TCP/IP协议栈中的几个协议,其中个就有对HTTP做了一个比较详细的讲解。HTTP是基于TCP进行传输的,其中传输的内容都是明文报文数据,如果我是一个黑客,我会想办法获取这个HTTP消息体&…

从案例角度解析建模平台动态规则引擎

源宝导读:明源云ERP建模平台提供了强大的页面联动规则引擎,原来需要编写代码完成的联动控制逻辑,现在只需要点点鼠标,通过配置完成。本文从实际案例的角度出发,介绍原始的代码逻辑如何转化为引擎规则的过程。一、背景明…

想基于K8s按需扩展应用程序,可从这几方面入手

马修赫瑟(Matthew Heusser)在花费了十年时间进行编程,测试和项目管理之后,Matt Heusser于2011年创立了自己的公司Excelon Development。该协会前董事会成员Matt还是软件测试人员,是德国波茨坦最具影响力的敏捷测试专业…

windows环境下ELK平台搭建

背景 日志系统主要包括系统日志,应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器的软件,硬件信息,检查配置过程中的错误以及错误发生的原因。通常分析日志可以了解服务器的负荷,性能安全性,从而及时…

EntityFramework Core 3.x上下文构造函数可以注入实例呢?

今天讨论的话题来自一位微信好友遇到问题后请求我的帮助,当然他的意图并不是本文标题,只是我将其根本原因进行了一个概括,接下来我们一起来探索标题的问号最终的答案是怎样的呢?老规矩,首先我们定义如下上下文public c…

SpringCloud常见问题总结(一)

Eureka常见问题 Eureka注册服务慢 默认情况,服务注册到Eureka Server 的过程比较慢。在开发或者测试时候,如果能够加速注册的过程,从而提升工作效率。Spring Cloud官方文档详细描述了该问题的原因并提供了解决方案: //原文 Why…

[剑指offer]面试题21:包含min函数的栈

面试题21:包含min函数的栈 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。 栈内压入3、4、2、1之后接连两次弹出栈顶数字…

IO 模型知多少

1. 引言同步异步I/O,阻塞非阻塞I/O是程序员老生常谈的话题了,也是自己一直以来懵懵懂懂的一个话题。比如:何为同步异步?何为阻塞与非阻塞?二者的区别在哪里?阻塞在何处?为什么会有多种IO模型&am…

[剑指offer]面试题22:栈的压入、弹出序列

面试题22:栈的压入、弹出序列 题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5 是某栈的压栈序列,序列4、5、3、2、1…

Ubuntu上安装使用Docker

Docker简介 Docker是一个开源的容器引擎,他有助于更快的交付应用。Docker可以将应用程序和基础设施层做隔离,并且能将基础设施当做程序一样进行管理。使用Docker,可以更快的打包,测试以及部署应用程序,并且可以缩短从…

让 .NET 轻松构建中间件模式代码

让 .NET 轻松构建中间件模式代码Intro在 asp.net core 中中间件的设计令人叹为观止,如此高大上的设计何不集成到自己的代码里呢。于是就有了封装了一个简单通用的中间件模板的想法,以后有需要的时候就可以拿来即用。接口定义这里按执行的委托是同步还是异…

[剑指offer]面试题26:复杂链表的复制

面试题26:复杂链表的复制 题目:请实现函数ComplexListNodeClone(ComplexListNodepHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling 指…

SpringCloud + Docker

Dockerfile构建Docker 镜像 注意这里说的Dockerfile是指的一个文本文件,类似txt,只不过名字是Dockerfile,里面编辑Docker的一些指令,指令作用在于描述构建镜像的细节。如下一个简单的案例,用上一节中下载的nginx镜像来…

红帽借“订阅”模式成开源一哥,首创者升任总裁

4 月 6 日,红帽公司宣布,产品和技术总裁 Paul Cormier 即日起任红帽总裁,并兼任首席执行官。Paul Cormier 是开源商业化“订阅”模式的提出者,这一模式促使红帽达成连续超70个季度的盈利,身价升至340亿美金&#xff0c…

Docker中数据管理

Docker数据管理 生产环境中,对数据进行持久化,或者需要在多个容器直接进行数据共享,这必然涉及到容器的一些数据管理的操作。容器中数据管理主要有两种方式: 数据卷(Data Volumes):容器内数据直…

C#两大知名Redis客户端连接哨兵集群的姿势

前言前面《Docker-Compose搭建Redis高可用哨兵集群》,我的思路是将Redis、Sentinel、Redis Client App链接到同一个网桥网络,这个网桥内的Redis Client App就可以使用ContainerIP访问网桥内任意redis节点。同一网桥网络访问规避了Docker上发生的NAT&…

Docker之Dockerfile详解

使用Dockerfile创建镜像 Dockerfile是一个文本格式的配置文件,我们可以利用Dockerfile来快速的创建一个自定义的镜像。 基本结构 Dockerfile由一行命令语句组成,并且支持以#开头的注释一般包括四个部分:基础镜像信息,维护者信息…

创业的N种死法

点击蓝字关注,回复“职场进阶”获取职场进阶精品资料一份互联网的江湖一直流传着大佬们的创业传奇。马云上厕所几分钟敲定几千万美金融资。王石走投无路靠倒卖玉米赚到上百万从此逆袭。扎克伯格为了获得哈佛美女照片,开发一个小玩意从此改变了世界。传奇…

Docker容器实战思维

Docker成功的基础 Docker的实现用到的基础技术(cgroups, namespace,分层文件系统)在Docker之前已经存在很多年,并且 Linux Containers(LXC)也在很多企业的环境中得到了大量的应用实践,并得到明…