IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 网络编程(UDP/TCP) -> 正文阅读

[网络协议]网络编程(UDP/TCP)

1.网络模型

?

数据从网络中一个终端上的应用程序传送到另外一个终端的应用程序,中间需要经历很多过程,有多方参与对数据进行层层封装、转发。我们把这个流程在逻辑上进行分层,每一层根据本层的规章制度(协议)各司其职。TCP/IP协议族可以分为四层:应用层传输层网络层数据链路层。? ?

????????1> 应用层协议

????????????????与网络相关的程序通过网络与其他程序通信使用的数据格式规范。比如浏览器向服务器发请求获取网页数据,此时发送的请求报文(皇室信件)就需要遵循HTTP协议(按HTTP协议的要求填写字段)。常见的应用层协议有:

  • HTTP(80端口),主要用于普通浏览。

  • HTTPS(443端口),HTTP协议的安全版本。

  • FTP(20和21端口),用于文件传输。

  • POP3(110端口),收邮件用。

  • SMTP(25端口),用来发送电子邮件。

  • SSH(22端口),用于加密安全登陆用。

  • DHCP(67端口,动态主机配置协议),动态配置IP地址。

  • DNS,用于完成地址查找,邮件转发等工作(运行在TCP和UDP协议上)。

  • SNMP,用于网络信息的收集和网络管理。

  • ARP,用于动态解析以太网硬件的地址。

????????2> 传输层协议(解决诸如端到端可靠性(数据是否已经到达目的地)和保证数据按照正确的顺序到达这样的问题。TCP、UDP都是传输层协议)?

????????3> 网络层协议(解决在一个单一网络上传输数据包的问题。IP协议是网络层协议)

????????4> 数据链路层协议?(它是数据包从一个设备的网络层传输到另外一个设备的网络层遵循的规范。比如以太网协议、Wi-Fi协议)

2.IP介绍

?在互联网中,一台主机只有一个IP地址。 IP地址用于在TCP/IP通信协议中标记每台计算机的地址,通常用于十进制来表示,如192.168.1.100,但是在计算机内部,IP地址是一个32位的二进制数值,如11000000 10101000 00000001 00000110(192.168.1.6)。 具体来讲,一个完整的IP地址信息应该包括IP地址、子网掩码、默认网关和DNS等四部分。只有这四部分协同工作,才能与互联网中的计算机相互访问。

????????1> IP地址(一个完整的IP地址由两部分组成,分别是网络号部分和主机号部分。网络号表示其所属的网络段编码,主机号则表示该网段中该主机的地址编码。 按照网络规模的大小,IP地址可以分为A、B、C、D、E五类,其中A、B、C类是3种主要的类型地址,D类地址用于多点广播,E类用于扩展备用地址)

????????????????(1).A类IP地址:

????????????????????????一个A类IP地址由1个字节的网络地址和3个字节的主机地址组成,网络地址的最高位必须是"0",地址范围从1.0.0.0~126.0.0.0。

????????????????(2).B类IP地址:

????????????????????????一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成,网络地址的最高位必须是"10",地址范围从128.0.0.0~191.255.255.255。

????????????????(3).C类IP地址:

????????????????????????一个C类IP地址由3个字节的网络地址和1个字节的主机地址组成,网络地址的最高位必须是"110",地址范围从192.0.0.0~223.255.255.255。

????????????????(4).D类IP地址:

????????????????????????用于多点广播(Multicast)。D类IP地址第一个字节以"10"开始,它是一个专门保留的地址;它并不指向特定的网络,目前这一类地址被用在多点广播中。多点广播地址用来依次寻址一组计算机,它标识共享同一协议的一组计算机。

????????????????(5).E类IP地址:

????????????????????????以"10"开始,为将来使用保留,全"0"(0.0.0.0)IP地址对应于当前主机;全"1"的IP地址(255.255.255.255)是当前子网的广播地址。

? ? ? ? 2> 子网掩码(子网掩码是与IP地址结合使用的一种技术)

????????????????主要作用有两个:1)用于确定IP地址中的网络号和主机号;2)用于将一个大的IP网络划分为若干小的子网络。

????????3> 默认网关(默认网关意为一台主机如果找不到可用的网关,就把数据包发送给默认指定的网关,由这个网关来处理数据包)

????????4>DNS(DNS服务器用于将用户的域名请求转换为IP地址)

算机的IP地址一旦被分配,可以说是固定不变的。 【命令行提示符】窗口中输入"ipconfig",按Enter键,即可显示出本机的IP配置相关信息。

3.端口介绍

? ? ? ? 1> 端口的分类按端口号来说,可以分为三大类:公认端口、注册端口、动态和/或私有端口

? ? ? ? ? ? ? ? 1)公认端口(公认端口的区间为0~1023,这种端口紧密绑定于一些服务。例如,80端口就总是HTTP通信。)

? ? ? ? ????????2)?注册端口(注册端口的区间为1024~49151,这种端口松散绑定于一些服务。可以解释为,有许多服务绑定于这些端口,但同样这些端口用于许多其他目的。例如,许多动态处理端口从1024左右开始)

? ? ? ????????? 3)?动态/私有端口(动态和/或私有端口的区间为49152~65535,理论上,不应为服务分配这些端口;实际上,机器通常从1024起分配动态端口。也有一些特例,比如,SUN的RPC端口从32768开始)

? ? ? ? 2> 常见的端口号及其功能

? ? ? ? ? ? ? ? 1)80端口号(80端口是为HTTP协议开放的,是HTTP协议的默认端口,用于网页浏览。在输入网站时,用户输入百度一下,你就知道,其实是访问百度一下,你就知道,因为位于网址后端的端口号是由浏览器自动补全的)

????????????????2)8080端口号(8080端口,经常在访问某个网站或使用代理服务器的时候用得到,主要还是用于代理服务)

????????????????3)21端口号(21端口主要用于文件传输协议(FTP)服务,是FTP的默认端口。用于传输控制信息(而20端口可能同样会在FTP中用到,只不过20端口用到时只用于传输数据)。 注:文件传输协议(FTP):主要是为了在两台计算机之间实现文件的上传与下载)

? ? ? ? ? ? ? ? 4)23端口号(23端口是telnet(远程登录)的端口,是Internet上普遍采用的登录和仿真程序,主要用于远程登录。 注:Telnet协议:是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式)

在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。要开始一个telnet会话,必须输入用户名和密码来登录服务器。

????????????????5)25端口号(25端口为简单邮件传输协议(SMTP)服务器所开放,主要用于发送邮件。 ??注:简单邮件传输协议(SMTP):一种提供可靠且有效的电子邮件传输的协议)?

????????????????6)53端口号(53端口为域名系统服务协议(DNS)服务器所开放,主要用于域名解析。通过DNS服务器可以实现域名与IP地址之间的转换,只要记住域名就可以快速访问网站。域名系统服务协议 ??注:域名系统服务协议(DNS):用于域名与 IP 地址的相互转换,以及控制因特网的电子邮件的发送)

4.UDP编程

?????????1> 不同电脑之间的进程如何通信

????????????????首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在1台电脑上可以通过进程号(PID)来唯一标识一个进程,但是在网络中这是行不通的。其实TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用进程(进程)。这样利用ip地址,协议,端口就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互

? ? ? ? 2> 什么是套接字

????????????????socket(简称套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的. 例如我们每天浏览网页、QQ 聊天、收发 email 等等

? ? ? ? 3> 创建套接字

????????????????在 Python 中 使用socket 模块的函数 socket 就可以完成:

????????????????函数 socket.socket 创建一个 socket,该函数带有两个参数:

? ? ? ? ? ? ? ? 1)Address Family:可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UNIX(用于同一台机器进程间通信),实际工作中常用AF_INET

? ? ? ? ? ? ? ? 2)Type:套接字类型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 协议)或者 SOCK_DGRAM(数据报套接字,主要用于 UDP 协议)

import socket
socket.socket(AddressFamily, Type)

????????????????创建一个tcp socket(tcp套接字)

import socket

# 创建tcp的套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# ...这里是使用套接字的功能(省略)...

# 不用的时候,关闭套接字
s.close()

????????????????创建一个udp socket(udp套接字)

import socket

# 创建udp的套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# ...这里是使用套接字的功能(省略)...

# 不用的时候,关闭套接字
s.close()

套接字使用流程 与 文件的使用流程很类似:1)创建套接字,2)使用套接字收/发数据,3)关闭套接字

? ? ? ? 4> 实现网络调试助手(可以下载一个网络调试助手)的UDP通信(UDP则是面向无连接的协议)

????????????????数据包就是这种形式。比如:短信。只要数据发送出去, 无需去管对方是否接收到。使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包。但是,能不能到达就不知道了。虽然用UDP传输数据不可靠,但它的优点和TCP比,速度快,对于不要求可靠到达的数据,就可以使用UDP协议。 创建一个基于udp的网络程序流程很简单,具体步骤如下:1)创建客户端套接字,2)发送/接收数据,3)关闭套接字

? ? ? ? 5> 实现UDP双端通信

? ? ? ? ? ? ? ? 1)UDP网络程序---发送数据

from socket import *

# 1. 创建udp套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)

# 2. 准备接收方的地址
# '192.168.1.103'表示目的ip地址
# 8080表示目的端口
dest_addr = ('192.168.1.103', 8080)  # 注意 是元组,ip是字符串,端口是数字

# 3. 从键盘获取数据
send_data = input("请输入要发送的数据:")

# 4. 发送数据到指定的电脑上的指定程序中
udp_socket.sendto(send_data.encode('utf-8'), dest_addr)

# 5. 关闭套接字
udp_socket.close()

? ? ? ? ? ? ? ? 2)UDP网络程序---发送,接收数据

from socket import *

# 1. 创建udp套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)

# 2. 准备接收方的地址
dest_addr = ('192.168.236.129', 8080)

# 3. 从键盘获取数据
send_data = input("请输入要发送的数据:")

# 4. 发送数据到指定的电脑上
udp_socket.sendto(send_data.encode('utf-8'), dest_addr)

# 5. 等待接收对方发送的数据
recv_data = udp_socket.recvfrom(1024)  # 1024表示本次接收的最大字节数

# 6. 显示对方发送的数据
# 接收到的数据recv_data是一个元组
# 第1个元素是对方发送的数据
# 第2个元素是对方的ip和端口
print(recv_data[0].decode('gbk'))
print(recv_data[1])

# 7. 关闭套接字
udp_socket.close()

? ? ? ? ? ? ? ? 3)UDP通信代码实现

????????????????说明:--- 每重新运行一次网络程序,上图中红圈中的数字,不一样的原因在于,这个数字标识这个网络程序,当重新运行时,如果没有确定到底用哪个,系统默认会随机分配
---记住一点:这个网络程序在运行的过程中,这个就唯一标识这个程序,所以如果其他电脑上的网络程序如果想要向此程序发送数据,那么就需要向这个数字(即端口)标识的程序发送即可。

一般情况下,在一台电脑上运行的网络程序有很多,为了不与其他的网络程序占用同一个端口号,往往在编程中,udp的端口号一般不绑定

但是如果需要做成一个服务器端的程序的话,是需要绑定的,想想看这又是为什么呢?

如果报警电话每天都在变,想必世界就会乱了,所以一般服务性的程序,往往需要一个固定的端口号,这就是所谓的端口绑定????????

from socket import *

# 1. 创建套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)

# 2. 绑定本地的相关信息,如果一个网络程序不绑定,则系统会随机分配
local_addr = ('', 7788) #  ip地址和端口号,ip一般不用写,表示本机的任何一个ip
udp_socket.bind(local_addr)

# 3. 等待接收对方发送的数据
recv_data = udp_socket.recvfrom(1024) #  1024表示本次接收的最大字节数

# 4. 显示接收到的数据
print(recv_data[0].decode('gbk'))

# 5. 关闭套接字
udp_socket.close()

5.TCP编程

? ? ? ? 1> TCP通信流程

????????????????TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。

????????????????TCP通信需要经过创建连接、数据传送、终止连接三个步骤。TCP通信模型中,在通信开始之前,一定要先建立相关的连接,才能发送数据,类似于生活中,"打电话"。这种连接是一对一的,因此TCP不适用于广播的应用程序,基于广播的应用程序请使用UDP协议。

? ? ? ? 2> 三次握手和四次挥手

????????????????TCP的三次握手(建立连接)和四次挥手(关闭连接)

? ? ? ? ? ? ? ? ? ? ? ? 1.SYN(synchronous建立联机)2.ACK(acknowledgement 确认)3.PSH(push传送)4.FIN(finish结束)5.RST(reset重置)6.URG(urgent紧急)

????????????????????????在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接

? ? ? ? ? ? ? ? ? ? ? ? (1) 第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。(2) 第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。(3) 第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。完成三次握手,客户端与服务器开始传送数据:

????????????????????????采用四次挥手关闭连接:由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A。(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。

? ? ? ? 3> 实现网络调试助手与TCP服务端的通信

from socket import *

# 创建socket
tcp_client_socket = socket(AF_INET, SOCK_STREAM)

# 目的信息
server_addr = ('192.168.64.1', 8080)
# 链接服务器
tcp_client_socket.connect(server_addr)

# 提示用户输入数据
send_data = input("请输入要发送的数据:")

tcp_client_socket.send(send_data.encode("utf-8"))

# 接收对方发送过来的数据,最大接收1024个字节
recvData = tcp_client_socket.recv(1024)
print('接收到的数据为:', recvData.decode('utf-8'))

# 关闭套接字
tcp_client_socket.close()

? ? ? ? 4> 实现TCP双端通信(作为服务端要先启动)

????????????????如同上面的电话机过程一样,在程序中,如果想要完成一个tcp服务器的功能,需要的流程如下: ? ?

  • socket创建一个套接字

  • bind绑定ip和port

  • listen使套接字变为可以被动链接

  • accept等待客户端的链接

  • recv/send接收发送数据?

from socket import *

# 创建socket
tcp_server_socket = socket(AF_INET, SOCK_STREAM)

# 本地信息
address = ('', 7788)

# 绑定
tcp_server_socket.bind(address)

# 使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动的,这样就可以接收别人的链接了
tcp_server_socket.listen(128)

# 如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务
# client_socket用来为这个客户端服务
# tcp_server_socket就可以省下来专门等待其他新客户端的链接
client_socket, clientAddr = tcp_server_socket.accept()

# 接收对方发送过来的数据
recv_data = client_socket.recv(1024)  # 接收1024个字节
print('接收到的数据为:', recv_data.decode('gbk'))

# 发送一些数据到客户端
client_socket.send("thank you !".encode('gbk'))

# 关闭为这个客户端服务的套接字,只要关闭了,就意味着为不能再为这个客户端服务了,如果还需要服务,只能再次重新连接
client_socket.close()

tcp注意点:

  1. tcp服务器一般情况下都需要绑定,否则客户端找不到这个服务器

  2. tcp客户端一般不绑定,因为是主动链接服务器,所以只要确定好服务器的ip、port等信息就好,本地客户端可以随机

  3. tcp服务器中通过listen可以将socket创建出来的主动套接字变为被动的,这是做tcp服务器时必须要做的

  4. 当客户端需要链接服务器时,就需要使用connect进行链接,udp是不需要链接的而是直接发送,但是tcp必须先链接,只有链接成功才能通信

  5. 当一个tcp客户端连接服务器时,服务器端会有1个新的套接字,这个套接字用来标记这个客户端,单独为这个客户端服务

  6. listen后的套接字是被动套接字,用来接收新的客户端的链接请求的,而accept返回的新套接字是标记这个新客户端的

  7. 关闭listen后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之前已经链接成功的客户端正常通信。

  8. 关闭accept返回的套接字意味着这个客户端已经服务完毕

  9. 当客户端的套接字调用close后,服务器端会recv解堵塞,并且返回的长度为0,因此服务器可以通过返回数据的长度来区别客户端是否已经下线

6.HTTP协议

? ? ? ? 1> 浏览器访问服务器的过程

?

1.用户输入网址.2.浏览器请求DNS服务器, 获取域名对应的IP地址.3.请求连接该IP地址服务器.4.发送资源请求. (HTTP协议)5.web服务器接收到请求, 并解析请求, 判断用户意图.6.获取用户想要的资源.7.将资源返回给web服务器程序.8.web服务器程序将资源数据通过网络发送给浏览器.9.浏览器解析请求的数据并且完成网页数据的显示.

? ? ? ? 2> 域名和DNS?

????????????????我们在访问一台服务器的时候, 需要记住该服务器的IP地址, 由于IP地址不利于人们记忆, 所以推出的域名技术. 域名是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称, 用于在数据传输时标识计算机的位置。域名可以用来表示一个单位、机构或可以利用个人在 Internet上 的确定的名称或位置. 域名是惟一的. 客户可以利用这个名字找寻有关的产品和服务信息。由于我们用域名来标识计算机的位置, 但是我们前面讲过, 网络上标识主机的唯一标识是IP地址, 所以就需要记录一下, 一个域名和IP地址的对应关系, 这个对应关系就存储在DNS服务器中, 当我们向 DNS 发出请求时,DNS会返回给我们域名所对应的IP地址.

? ? ? ? 3> HTTP介绍(超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据,互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法)

HTTP发展历史
版本产生时间内容发展现状
HTTP/0.91991年不涉及数据包传输,规定客户端和服务器之间通信格式,只能GET请求没有作为正式的标准
HTTP/1.01996年传输内容格式不限制,增加PUT、PATCH、HEAD、 OPTIONS、DELETE命令正式作为标准
HTTP/1.11997年持久连接(长连接)、节约带宽、HOST域、管道机制、分块传输编码2015年前使用最广泛
HTTP/22015年多路复用、服务器推送、头信息压缩、二进制协议等逐渐覆盖市场

超文本传输协议(HTTP)是万维网应用层的协议,是通过两个程序实现:

  • 一个是客户端程序(一般称为浏览器)

  • 另一个是服务器 (常称Web服务器)

这两个通常运行在不同的主机上,通过交换HTTP报文来完成网页请求响应;并且HTTP定义了报文的结构和客户/服务器之间交换报文的规则

?HTTP请求报文格式

HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。

一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成

? ? ? ? 1> 请求行

? ? ? ? ? ? ? ? 请求行由请求方法字段,url字段(请求资源路径)和HTTP协议版本字段3个字段组成,它们用空格隔开,例:GET /login.html HTTP/1.1

? ? ? ? ? ? ? ? HTTP协议请求方法有GET,POST,PUT,DELETE,HEAD,OPTIONS,TRACE,CONNECT。

? ? ? ? ? ? ? ? 常见的请求方法.GET(没有请求体,只有请求行,请求头和空行组成)

---- 请求行 ----
GET / HTTP/1.1  # GET请求方式 请求资源路径 HTTP协议版本
---- 请求头 -----
Host: www.baidu.com  # 服务器的主机地址和端口号,默认是80
Connection: keep-alive # 和服务端保持长连接
Upgrade-Insecure-Requests: 1 # 让浏览器升级不安全请求,使用https请求
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36  # 用户代理,也就是客户端的名称
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 # 可接受的数据类型
Accept-Encoding: gzip, deflate # 可接受的压缩格式
Accept-Language: zh-CN,zh;q=0.9 #可接受的语言
Cookie: pgv_pvi=1246921728; # 登录用户的身份标识

---- 空行 ----

? ? ? ? ? ? ? ? .POST(请求行,请求头,空行,请求体组成)

---- 请求行 ----
POST /v2/api/?login HTTP/1.1 # POST请求方式 请求资源路径 HTTP协议版本
---- 请求头 ----
Host: passport.baidu.com # 服务器的主机地址和端口号,默认是80
Connection: keep-alive # 和服务端保持长连接
Content-Type: application/x-www-form-urlencoded  # 告诉服务端请求的数据类型
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36 # 客户端的名称
---- 空行 ----
---- 请求体 ----
username=hello&pass=hello # 请求参数

? ? ? ? 2> 请求头

? ? ? ? ? ? ? ? 有关键字/值对组成,每行一对,关键字和值用冒号隔开请求头通知服务器有关客户端请求的信息:

? ? ? ? ? ? ? ? User-Agent:产生请求的客户端信息浏览器类型,Accept:客户端可识别的内容类型列表,Host:请求的主机名,容许多个域名同处一个IP地址。即虚拟主机

????????3> 请求体(携带数据)

HTTP响应报文格式(响应行,响应头,响应体)

? ? ? ? 1> 响应行 例如:HTTP-Version Status-Code Reason-Phrase CRLF

其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。

响应报文说明:

--- 响应行/状态行 ---
HTTP/1.1 200 OK # HTTP协议版本 状态码 状态描述
--- 响应头 ---
Server: Tengine # 服务器名称
Content-Type: text/html; charset=UTF-8 # 内容类型
Transfer-Encoding: chunked # 发送给客户端内容不确定内容长度,发送结束的标记是0\r\n, Content-Length表示服务端确定发送给客户端的内容大小,但是二者只能用其一。
Connection: keep-alive # 和客户端保持长连接
Date: Fri, 23 Nov 2018 02:01:05 GMT # 服务端的响应时间
--- 空行 ---
--- 响应体 ---
<!DOCTYPE html><html lang=“en”> …</html> # 响应给客户端的数据

状态码:

? ? ? ? 1xx-->指示信息--代表请求已经接收,继续处理

? ? ? ? 2xx-->成功--请求已经成功,理解,接受

? ? ? ? 3xx-->重定向--要求完成请求需要更进一步的操作

? ? ? ? 4xx-->客户端错误--请求语法错误,或请求无法实现

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

????????常见状态码:

? ? ? ? ????????200:客户端请求成功

? ? ? ? ????????301:永久重定向

? ? ? ????????? 302:临时重定向

? ? ? ? ????????400:错误请求

????????????????401:未授权

? ? ? ????????? 403:禁止访问

? ? ? ????????? 404:未找到

? ? ? ????????? 405:请求方式有误

? ? ????????? ? 500:服务器内部错误

? ? ?????????? ?501:未实现

? ? ????????? ? 502:错误网关

? ? ????????? ? 504:网关超时

? ? ????????? ? 505:HTTP版本不支持

? ? ? ? 2> 响应头

? ? ? ? ? ? ? ? 用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理响应数据

? ? ? ? 3>响应体

? ? ? ? ? ? ? ? 就是响应时的消息体,数据可以市普通文本,XML,JSON,HTML源码等

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-10-07 14:09:39  更:2021-10-07 14:10:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 2:38:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码