http、UDP协议
一 、http
如果要谈http,那我们不能脱离应用层------直接为用户提供网络服务,是用户与网络交互的接口。
应用层常用的协议---HTTP/HTTPS:网页浏览,DNS域名解析
http应用协议是基于tcp协议的:
1.1认识URL
什么是URL ---其实就是我们平常说的网址
urlencode和urldecode
像 / ? : 等这样的字符,已经被url当做特殊意义理解了.因此这些字符不能随意出现.比如,某个参数中需要带有这些特殊字符,就必须先对特殊字符进行转义.转义的规则如下:将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式c++就会被转码成%2B
最前面就有https,我们先来浅谈一下https 和 http 的区别
HTTP 默认使用的端口是 80,而 HTTPS 使用的是 443 端口。
HTTP 是直接基于 TCP 传输的
HTTPS 是在 HTTP 和 TCP 之间加入了 SSL/TLS 加密层,也就是HTTP + SSL/TLS + TCP,从而实现数据加密传输。
所以https 简单来说就是有了一层加密,就更加安全。我们可以发现现在浏览器网址前面都有一个小锁。
1.1.2--加密 和 解密
什么是加密 ---加密就是把 明文 给进行操作,使得 成为密文
什么是解密---解密就是把密文 给解析出来 变成明文
加密解密的就到了密码学,感兴趣可以自己查查
为什么要加密? 其实回答很简单,就是怕你传输的东西,被被人盗取利用,就比如说你的qq号和密码,让别人盗取,就会造成一些损失。
经典的就是一些运营商劫持---比如有个软件你要下载了,链接出来也是下载它,一点击下载,跨擦出来了一个浏览器的下载进度条。
这就是因为 假设我们在家里,我们路由器给我们形成一个子网,我们是在子网下进行发送数据,我们把数据传输到家庭路由器,然后再经过一系列的传输就会传到运营商的路由器里,如果没有加密的话,就有可能会被篡改。
也就是http 是明文直接传输,明文经过路由器,交换机,运营商的路由器,代理服务器,所以在这些过程中被别人截取,可能被别人把你的隐私信息直接给暴露,有的就可能被篡改。
所以就有了https进行加密,进行加密的方法就是中间一层,也就是我们所说的ssl,ssl加密也不是决定安全,毕竟厉害的人那么多。
2.http的协议格式
http 请求报文(Request Message)是客户端(如浏览器)向服务器发送请求时所使用的标准格式。它遵循特定的文本结构,由请求行、请求头部、空行和请求体四部分组成。
2.1请求行
方法 请求目标(资源路径) 协议版本
方法:
GET:获取指定资源(最常用)
POST:向服务器提交数据(如表单、文件上传)
PUT:上传或更新资源
DELETE:删除资源
HEAD:只获取响应头,不返回响应体
OPTIONS:查询服务器支持哪些方法
PATCH:对资源进行部分修改
这个方法最主要的运用呢就是GET方法和PUSH方法
举个例子来看
GET方法
GET /search?q=随便 HTTP/1.1 Host: test.com
POST 方法
POST /login HTTP/1.1 Host: test.com Content-Type: application/x-www-form-urlencoded Content-Length: 29username=admin&password=123456
也就是POST会把用户名和密码直接显示到你的请求行上,就会很不安全
请求目标(资源路径)
http://www.example.com/index.html
协议版本
HTTP/1.0
HTTP/1.1(目前最广泛使用)
HTTP/2(二进制格式,不以明文显示)
2.2请求头部
Content-Type:数据类型(text/html等)
Content-Length:Body的长度
Host:客户端告知服务器,所请求的资源是在哪个主机的哪个端口上;
User-Agent:声明用户的操作系统和浏览器版本信息;
referer:当前页面是从哪个页面跳转过来的;
Location:搭配3xx状态码使用,告诉客户端接下来要去哪里访问;
Cookie:用于在客户端存储少量信息.通常用于实现会话(session)的功能;
二:UDP协议
UDP协议是传输层的协议
首先要再次谈到端口号
1.1端口号-udp
1.1.1-端口号的范围划分
0 - 1023: 知名端口号, HTTP, FTP, SSH 等这些广为使用的应用层协议, 他们的
端口号都是固定的. • 1024 - 65535: 操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作
系统从这个范围分配的
1.1.2-认识知名端口号
有些服务器是非常常用的, 为了使用方便, 人们约定一些常用的服务器, 都是用以下这些
固定的端口号: • ssh 服务器, 使用 22 端口
• ftp 服务器, 使用 21 端口
• telnet 服务器, 使用 23 端口
• http 服务器, 使用 80 端口
• https 服务器, 使用 443
运行命令,就可以看到端口号。
cat /etc/services
1.1.4 端口号的认识
我们要理解两个问题一个进程是否可以bind 多个端口号?
第二个问题是一个端口号可以被多个进程bind?
其实这两个问题我们原来的学习的过程中就已经回答过了
一个进程是否可以bind 多个端口号?
一个进程可以绑定多个端口号,qq可以被多个端口号访问,可以要绑定多个端口号
一个端口号可以被多个进程bind?
一个端口号只能对应一个进程,这就相当于是一个进程能有多个文件描述符,但是一个文件描述符只能对应一个进程。
2.UDP报文
要学习UDP协议还是按照往常,我们要理解UDP协议是如何解包的,UDP是如何做到分用的,
2.1-UDP协议格式
大家看图片就可以可能到,端口号什么的这些组成的报头,是固定长度的,所以只要读取前八个字节,就可以把这些数据全部获取到,读到UDP长度的时候,就表示整个报文的长度,也就是UDP首部+数据的长度,然后把把前八个字节分开,就是数据,就实现了报头 和 有效载荷的分离。
2.2UDP的特点
无连接:知道对端的IP和端口号就直接进行传输,不需要建立连接;
不可靠:没有确认机制,没有重传机制;如果因为网络故障该段无法发到对方。 UDP协议层也不会给应用层返回任何错误信息; 面向数据报:不能够灵活的控制读写数据的次数和数量----应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并;用UDP传输100个字节的数据:
UDP虽然是不可靠的,但是总不能传过来都是错的把,所以该协议也是加上了一些检验正确的。UDP头部包含一个可选的校验和字段。这个校验和用于检测数据在传输过程中是否发生了错误。接收方会计算接收到的数据报的校验和,如果与发送方的校验和不匹配,该数据报通常会被静默丢弃。这保证了应用层接收到的数据在传输过程中没有发生损坏。
2.3UDP的缓冲区
UDP 没有真正意义上的 发送缓冲区. 调用 sendto 会直接交给内核, 由内核将数据传给网络层协议进行后续的传输动作;
UDP 具有接收缓冲区. 但是这个接收缓冲区不能保证收到的 UDP 报的顺序和发送 UDP 报的顺序一致; 如果缓冲区满了, 再到达的 UDP 数据就会被丢弃。
UDP也是既可以读,也可以写,所以UDP是全双工的。