目录
三.TCP协议 (三次握手四次挥手细节过程理解在之前的博文中有详细图解)
UDP的特征: 什么是无连接,不可靠,关键为什么它如此的不稳定但是在现在的短视频 音视频通话 DNS ARP这些全部都还使用的是UDP作为传输层协议
根据上述的延迟解释一下音视频通话为例解释下为啥使用UDP而不是TCP?
实际上,上网的大部分行为都是在进行进程间通信.. 也就是不断地获取信息和发送信息
比如:
1. 把服务器上面地资源数据拿到本地 (短视频, 网页)
2. 把本地地数据推送到服务器 (搜索, 注册,登录,下单)



主要请求方法解释:

上述便是需要Content-Length的原因, 获知正文是否存在以及正文长度

#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <strings.h>
#include <signal.h>
#include <string>
#include <fstream>
#define ERR_EXIT(m) \
do { std::cerr << m << std::endl; close(EXIT_FAILURE); } while(0)
typedef struct sockaddr SA;
int main() {
signal(SIGCHLD, SIG_IGN);//信号处理, 避免子进程僵尸
int listenfd, connfd, pid;
socklen_t addLen;
struct sockaddr_in clientAdd, serveAdd;
if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ) {
ERR_EXIT("socket");
}
int flag = 1;
setsockopt(listenfd,SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag));
//SO_REUSEADDR BOOL 允许套接口和一个已在使用中的地址捆绑(参见bind())
//SOL_SOCKET固定level设置
bzero(&serveAdd, sizeof(serveAdd));//清空
serveAdd.sin_family = AF_INET;//协议家族
serveAdd.sin_port = htons(8080);//默认80端口
serveAdd.sin_addr.s_addr = htonl(INADDR_ANY);
//INADDR_ANY == 0 作用适配地址
if (bind(listenfd, (SA*)&serveAdd, sizeof(serveAdd)) == -1) {
ERR_EXIT("bind");
}
//3: 等待队列syn队列的长度
if (listen(listenfd, 3) == -1) {
ERR_EXIT("listen");
}
while (1) {
if ((connfd = accept(listenfd, (SA*)&clientAdd, &addLen)) == -1) {
ERR_EXIT("accept");
}
pid = fork();//fork出来子进程
if (pid) {
close(connfd);
//父进程关闭connfd然后仅仅进行listen. SIGCHLD会自动收尸
} else {
close(listenfd);//子进程进行发送响应报文
char buffer[1024];
recv(connfd, buffer, sizeof(buffer), 0);
std::cout << "#############################http request begin#############################################"<<std::endl;
//打印recv的来自客户端的请求并且输出请求信息
std::cout << buffer << std::endl;
std::cout << "#############################http request end#############################################"<<std::endl;
std::ifstream ifs("./index.html");
if (ifs) {
int len;
ifs.seekg(0L, ifs.end);//定位到文件末尾
len = ifs.tellg();//获取文件长度
ifs.seekg(0L, ifs.beg);//回到文件开头
char *file = new char[len];
ifs.read(file, len);//读取正文, 字符串形式读取
ifs.close();
//开始处理响应:
std::string status_line = "HTTP/1.1 200 OK\r\n";//状态行
std::string reply_header;//响应头部
reply_header +="Content-Length: " + std::to_string(len) + "\r\n";
std::string black = "\r\n";
send(connfd, status_line.c_str(), status_line.size(), 0);
send(connfd, reply_header.c_str(), reply_header.size(), 0);
send(connfd, black.c_str(), black.size(), 0);
send(connfd, file, len, 0);
delete [] file;
}
close(connfd);
exit(EXIT_SUCCESS);
}
}
close(listenfd);
return 0;
}


服务器IP : 端口号 可以访问, 服务器可能没有开放端口, 可以在购买的服务器安全组中设置

- HTTP的请求信息是明文传输, 容易被窃取
- HTTP不会验证对方的信息, 存在被冒充的风险
- 数据的完整性没有校验, 容易被中间人篡改
写传输层协议之前先介绍一个四元组的概念: 网络通信的实现就是基于四元组的,不论是TCP还是UDP 要想将数据从一端传入到另外一端,就必须明确对端的二元组, 双方如果都要相互通信就要确定四元组

首先我们确定要双方不同主机上的不同进程间进行通信, 必须确定双方的 ip + port why?









滑动窗口下的丢包问题分析
- 第一种是ACK丢失
- 如上述情况下,滑动窗口的ACK部分丢失其实不是很紧要,因为可以通过后序的ACK确认;ACK一旦确认之后代表的含义是 默认之前的所有序列数据都已经全部收到了
- 情况2是数据包传过去的时候就丢失了
- 当某一段报文段丢失之后, 发送端会一直收到 1001 这样的ACK, 就像是在提醒发送端 "我想要的是 1001" 一样
- 然后; 如果发送端主机连续三次收到了同样一个 "1001" 这样的应答, 就会将对应的数据 1001 - 2000 重新发送;
- 这个时候接收端收到了 1001 之后, 再次返回的ACK就是7001了(因为2001 - 7000)接收端其实之前就已 经收到了, 被放到了接收端操作系统内核的接收缓冲区中 (提前收到的后序的报文也不会丢弃, 只是前面的没有确认 后面的也就无法确认,因为一旦确认就默认前面的所有数据全部已经收到了)
- 这种机制被称为 "高速重发控制"(也叫 "快重传").


基于TCP应用层协议 HTTP HTTPS SSH Telnet FTP SMTP

报头理解, 报头实现地方式, 使用C语言中地位段进行理解: 多少位分为一段

首先是无连接, 连接是什么: 连接算是一端到另外一端的不存在的一根线 (抽象的来说,这个是我的个人理解, 连接的过程也就是三次握手的过程)对于三次握手不理解的可以看我前文链接存在详解
首先不论是有连接还是无连接, 我们核心应该确定的是什么? 确定四元组,对了四元组,无连接也可以进程间通信,只不过每一次必须传入四元组, 但是口说无凭, 咱看看接口呗。对比一下:

因为UDP没有TCP的哪些为了保证可靠性的机制: 比如超时重传机制,拥塞控制,流量控制机制,为数据包编号排序等...
首先解释UDP相比TCP为什么相对实时性好, 在时间上更短, 更加快速。。。




- 连接
- TCP是面向连接的传输层协议,传输数据前需要先建立连接
- UDP 是不需要建立连接的。 即可马上立即传输数据 (接口传入二元组)
- 服务对象
- TCP是一对一的两点服务,即一条连接只有两个断点
- UDP支持一对一 ,一对多, 多对多的交互通信
- 可靠性
- TCP是可靠交付数据的,数据无差错,不重复,按顺序到达
- UDP则是尽力交付,不保证可靠 (因为没有各种传输策略)
- 本文从再看HTTP 和 对比学习 HTTPS入手
- HTTP协议的学习核心在于搞清楚他是一次性的无状态连接方式,连接建立之后服务结束立马断开连接。。。
- 还有就是搞清楚HTTP的报文格式
- 上述的核心在于最开始的一行请求行 (请求方法 URL 协议版本) + 状态行(协议版本 状态码 状态码描述字段) 搞清楚空行的作用:分割报头和正文
- HTTPS对比 HTTP学习 : 一个是明文传输的角度来看 另外一个是从网站真实性,身份验证,中间数据修改 的角度来看去分析,HTTPS相对 HTTP多了SSL加密层
- 然后是UDP和TCP的学习:
- UDP无连接的 基于一个一个数据包的传输的一种 不可靠传输协议 (但是因为其相对TCP的快速 (实时性更好) + 可制定各种传输策略实现可靠传输 )在音视频通话等领域有着不可替代的作用
- TCP有连接的 基于数据流的可靠传输协议 (可靠的核心在于各种策略机制)
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图
关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭3年前。Improvethisquestion我正处于学习Ruby的阶段,我想查看一些小型库的源代码以了解它们是如何构建的。我不知道什么是小型图书馆,但希望SO能推荐一些易于理解的图书馆来学习。因此,如果有人知道一两个非常小的库,这是新手Rubyists学习的好例子,请推荐!我想使用Manveru'sInnatelib,因为它试图保持在2000LOC以下,但我还不熟悉其中经常使用的Ruby速记。也许大约100-5
由于匿名block和散列block看起来大致相同。我正在玩它。我做了一些严肃的观察,如下所示:{}.class#=>Hash好的,这很酷。空block被视为Hash。print{}.class#=>NilClassputs{}.class#=>NilClass为什么上面的代码和NilClass一样,下面的代码又显示了Hash?puts({}.class)#Hash#=>nilprint({}.class)#Hash=>nil谁能帮我理解上面发生了什么?我完全不同意@Lindydancer的观点你如何解释下面几行:print{}.class#NilClassprint[].class#A
是否可以在不实际下载文件的情况下检查文件是否存在?我有这么大的(~40mb)文件,例如:http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm这与ruby不严格相关,但如果发件人可以设置内容长度就好了。RestClient.get"http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm",headers:{"Content-Length"=>100} 最佳答案
我很难理解Ruby中sender和receiver的实际含义。它们一般是什么意思?到目前为止,我只是将它们理解为方法调用和获取其返回值的调用。但是,我知道我的理解还远远不够。谁能给我一个Ruby中发送者和接收者的具体解释? 最佳答案 面向对象中的一个核心概念是消息传递和早期概念化,这在很大程度上借鉴了计算的Actor模型。艾伦·凯(AlanKay)创造了面向对象一词并发明了最早的OO语言之一SmallTalk,他拥有voicedregretatusingatermwhichputthefocusonobjectsinsteadofo
我在这方面尝试了很多URL,在我遇到这个特定的之前,它们似乎都很好:require'rubygems'require'nokogiri'require'open-uri'doc=Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html"))putsdoc这是结果:/Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:353:in`open_http':404NotFound(OpenURI::HT