| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 网络基础2(上):http协议、tcp/udp协议 -> 正文阅读 |
|
[网络协议]网络基础2(上):http协议、tcp/udp协议 |
?"逆风让翱翔,更珍贵" (一)应用层?应用层是我们最常接触到的,编写代码的所在层。往下的传输、网路....由OS管理。 (1)初始HTTP?①认识URL②urlencode和urldecode
?
(2)HTTP协议格式??(3)HTTP的方法:①GET?vs?POST请求资源
可知,由url带参 的传参效率肯定不如?用正文传参更好。 并且,POST?与? GET在参数的私密性上,POST > GET 当然,在http / 1.1,时可以支持长链接: ②其他方法:?
但是最常用的就是,GET?和?POST方法。 (4)HTTP状态码:
注:所谓的(3xx)重定向,就是为了更新用户的目标地址! (5)其他常见的HTTP_header:1.Content-Type: 数据类型(text/html等)。 3.Host:?服务器的IP+端口 5.referer: 当前页面是从哪个页面跳转过来的。 6.location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问(重定向)。 ①理解cookie我们在生活中,都有一个常识。登录一个网站,比如说哔哩哔哩、爱奇艺....如果是第一次登录,则需要用户提供自己的账号+密码,但是第二次、三次之后就不再需要了提供了,这是为什么呢? 所以,本地cookie记录的是用户个人隐私的账号、密码,就一定会存在被盗的风险。 因此,之后堆cookie值检测的时,引入了session_id 进行了优化 ? ?(6)模拟实现HTTP请求(request) 与?响应(response)①建立通信?②连接请求?③链接响应:??③POST?与?GET传参? ④重定向与location?(二)传输层?(1)认识传输层?
最常用的也就是?tcp/udp协议①再谈端口号:
?在tcp/udp协议中,用 “源端口号“、“目的端口号”、“源IP”、“目的IP”,“协议号”。识别进程间通信。 ②端口划分范围?我们都知道,端口大小,是一个16位的整型。
知名端口号:
③netstat:查看网络状态工具(简单介绍)?
④iostate:监控io的负载情况
当然?还有更多io的指令? ?? ⑤pidof:获得进程pid?通过进程名,可以直接查看它的pid 两个问题:?只需要保证 绑定的port?与 端口是唯一关系就行。? (2)UDP协议??①UDP协议格式在之前曾经提到过,协议共性的两个特点:
?它是如何保证的? ·16为UDP长度,表示整个数据报(首部+数据)的最大长度 ·16位校验和用于?比对数据,出错就?丢弃。 ②协议共性?与?UDP要理解UDP协议的,不得不理解报头C结构体。 ?那么,我们知道了报头,拿到了报头的数据,你又怎能保证,一定能发给对端服务器的进程呢?? 原理就是采用一直哈希映射,能够因为拿到?目的端口号port,从而能够快速找到进程! ③UDP特点?
面向数据报: 应用层交给UDP多长的报文,原样发送,既不拆分,也不合并。 ④UDP缓冲区?
udp的socket既能读,也能收,所以也叫做“全双工”。? ? (三)TCP协议为什么网络传输的数据会存在不可靠的现象? 当电线足够长,经过的设备越多,任何一个设备出故障,都可能造成网络通信,传输数据的不可靠。? ①TCP结构?TCP全称为"传输控制协议"。可以看出,TCP主打的是对数据传输的控制。
②TCP首部长度?(1)TCP协议结构详解?①序列?与?确认序列双方主机进行通信? ?TCP为每字节数据?都进行了编号(这个理解之后会提到),即称为序列号。
你可能会存在以下的问题 为什么需要两套序号??一套不就够了吗???同udp不同,udp只有接收缓冲区,发送的任务交由内核部分完成。 但是tcp有 独立的接收 +?发送缓冲区。 因此,他们发送数据,也是确认应答的需要<应答机制>?。 ②16位窗口大小?在上面刚刚也谈到了,TCP协议有自己独立的缓冲区。 因此上层应用层不是直接将自己的数据,拿到网络中去?传输,而是把数据拷贝(memcpy\memmove)至TCP的缓冲区中。 通信有关双方,不是一方向另一方无脑地发送数据。 ?因此,接收方就需要把自己的接收能力,告诉发送方,让发送方适应自己的接收能力。从而降低出现数据传输不一致性的可能。 ③紧急指针所谓紧急指针,就是保存着紧急数据的地址。 因为序号的缘故,TCP读取数据是有序的!?那么如果出现重要的数据,需要被先读取,就可以使用紧急指针。
④六个标志位?各个标志位,在不同的场景下,运用不同!
(2)可靠性保障机制对于UDP而言,发布出去的数据,或者数据打满了接收缓冲区,多余的部分直接进行丢弃。很显然,这是不能被容忍的。 在我们日常生活中,如何保证自己的消息得到传播是可靠的??答案就是,当我们对一个人说一句话, 那个人或是点头,或是也回话,那么我们就认为,我传输给他的消息就是可靠的。 这也就是,应答机制的雏形。 ①确认应答机制注: 因为,在应用层以下都是属于内核级别的,所以socket通信渠道的建立?都是由OS来完成。 与系统调用接口的联系: 发送三次握手---->connet? 建立连接----->accept(完成了三次握手)? ? ②超时重传机制?当发生如下的 数据在传输的过程中,迟迟收不到应答(ACK), 或者收到同样的ACK应答。 那么对于这种情况应该怎样处理? 需要进行超时重传
?超时重传依据: 对于client而言,认为ACK发出,那么连接就已经建立。 但对于server而言,收到ACK,连接才建立。 因此,发送方没收到ACK应答,达到一定时间,就需要?再一次向对方申请(RST)重传, 建立新连接。 ③流量控制TCP的处理速度,严格上来说是由接收方决定!?
④连接管理机制?为什么要三次握手?而不是四次,五次??如何理解四次挥手??如何理解只关闭client端 close(fd)?为什么主动断开连接的一方不能立即进入CLOSED?理解TIME_WAIT状态所以,断开链接不是?一定会断开! 注:TCP保证的是数据通信之中,但不保证建立 、?断开。 等待时长:? bind失败问题: 因为?进行主动断开链接的一方,一定会进入TIME_WAIT?状态。导致连接并没有被完全释放。因此不能bind端口。
?测试TIME_WAIT状态:⑤拥塞控制:我们分别对?发送端,接收端?进了考虑。看是否?接收端的接受能力(窗口大小-->流量控制)、发送端的发送能力(滑动窗口),但如果问题不是出现在?双方,而是出现在网络通道上呢?? 在大型的局域网中,不止有一台主机正在进行通信。可能当前的网络状态就已经比较拥堵. 在不清楚当前网络状态下, 贸然发送大量的数据,是很有可能引起雪上加霜的。
TCP引入了 “慢启动”的机制;?指数增长(2^n) ①慢慢恢复通信速度。 ②确认少量时,会不会依旧丢包 ③引入慢启动?域值 ?(3)TCP效率优化①滑动窗口?对每一个发送的数据段, 都要给一个ACK确认应答. 收到ACK后再发送下一个数据段。 因此,我们连续给对方发送多条数据,优化性能。 所以,滑动窗口是在发送方内部的。?
?
滑动窗口的特殊情况下的快传机制?(1)ACK在响应的途中丢包,但是数据包传达。 (2)但如果不是ACK响应丢包,而是数据传达丢包
? ②延迟应答③捎带应答? ?数据一并传输过去。
?(四)TCP协议的其他问题(1)面向字节流
(2)粘包问题??所谓粘包问题,指的就是,有效载荷?与?报头不能有效分离! 为什么TCP有粘包问题?但是,UDP就不会存在粘包问题,因为它的结构是?定长报文,很容易鉴别。 本质上就是TCP是面向字节流,基于TCP的应用层不能很好的?分别报头?和?有效载荷的界限。? 如何解决??(区别?报文?和?有效载荷)①定长报头 ②特殊字符 ③字描述+定长(特殊字符)? (3)TCP异常问题我们知道?进程不管是终止?还是机器重启,(sock)文件描述符的生命周期是随进程的。所以并无大碍。 但,如果是网络出现故障,发送端已经断开了。但此时?接收端以为仍在链接,当接收端进行写入操作时,无响应后,会进行reset。 即使没有写入操作,?TCP内置了一个“保活定时器”,一种心跳机制 ,会定期询问对方。如果对方不在,也就会立即释放连接。 (4)listen的第二个参数这个参数,记录是 established(全连接) + 1。
为什么需要维护这个链接队列?? 在系统角度: 太长队列,OS维护成本太高,并且被暂时不需要的队列?占用大量资源。? 总结①http 协议格式?和?http?POST?GET方法区别 http状态码?cookie理解 ②UDP协议格式?UDP特点? ③TCP协议格式?TCP特点? ④?TCP可靠性: 校验和、序列号(普通+确认)、应答机制、重发机制(超时、快重传)、流量控制、拥塞控制 ⑤TCP性能: 滑动窗口 、?延迟应答 、?捎带应答 ⑥TCP粘包?解决,listen?第二个参数理解 本篇到此结束?感谢您的阅读 祝你好运~ |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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/25 22:37:20- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |