计算机网络 问题整理

OSI网络体系结构与TCP/IP协议模型

● OSI是一个理论上的网络通信模型,而TCP/IP则是实际上的网络通信标准计算机网络 问题整理_第1张图片

● 应用层(Application layer):为用户的应用进程提供网络通信服务


● 表示层(Presentation Layer):对应用层的命令和数据进行解释,以确保所发送的信息可以被另一个系统的应用层读取。功能:1、数据格式变换。2、数据加密解密。3、数据压缩和恢复。


● 会话层(Session Layer):进程和网络之间的接口。功能:1、建立管理终止会话。2、设置校验点防止通信失效


● 传输层(transport layer):进程间的通信。功能(差可留用):1、可靠\不可靠传输。2、差错控制(顺序)。3、流量控制(发送速度)。4、复用分用(多进程复用一个通信子网)
● (定规则的客户)发五份文档就要收到原封不动的五份,这五份一定要按顺序排好,客户是上帝让你发慢就发慢,一个BOSS可以对应很多个客户。
● 路由器


● 网络层:主机间的通信(IP),数据分组路由与转发。功能:1、路由选择(最佳路径)。2、差错控制(校验码)3、流量控制。4、拥塞控制(堵车)。
● (聪明的BOSS)选一条最佳的路径,控制好发送的速度别让网络堵了,还要不能出错
● 网卡,网桥,交换机


● 数据链路层(data link layer):把网络层的数据报组装成帧。功能:1、陈真(…10000100010101010…)。2、差错控制(帧错+位错)。3、流量控制
● (细心的秘书)把复杂的报文变成二进制,一样也要控制速度,不能出错
● 网卡,集线器,中继器
计算机网络 问题整理_第2张图片


● 物理层:DAC,实现比特流的透明传输。功能:1、定义接口特性(引脚设置,01电压)。2、定义传输模式(单工、半双工、双工)。3、定义传输速率。(带宽?)。4、比特同步(时钟)。5、比特编码(设置01电压)
● (傻子搬运工)不动脑来什么发什么,跑得快不快


● 上一层的数据传到下一层,要在头部添加控制信息(检验、地址)
计算机网络 问题整理_第3张图片
● “物联网淑慧试用”,网络层次由下到上简称
计算机网络 问题整理_第4张图片

TCP报文段首部格式计算机网络 问题整理_第5张图片

● 六个控制位
紧急位URG:URG=1时,表明是高优先级的数据,不用在发送缓存队列排队。
确认位ACK:ACK=1时,表明确认号有效,在连接建立后所有传送的报文段都必须把ACK置1。
推送位PSH:PSH=1时,表明是高优先级数据,应尽快交付给接受进程,不用在接收缓存队列等缓存填满。
复位RST:RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立传输连接。
同步位SYN:SYN=1时,表明是一个连接请求报文段。
终止位FIN:FIN=1时,表明发送方数据已发完,要求释放连接。

● 两个重要字段(4字节)
序列号seq:在一个TCP连接中,传送的字节流中每一个字节都按顺序编号,序号表示报文段数据部分的第一个字节的序号。
确认号ack:期望收到下一个报文段数据部分的第一个字节的序号。若确认号位N,表明0~N-1的所有数据都已收到。


三次握手

TCP连接建立的过程:A发送建立连接请求给B,B确认与A建立连接并发送建立连接请求给A,A确认与B建立连接。
计算机网络 问题整理_第6张图片
● 为什么不是两次:因为每一个同步请求,都需要对方的确认,而实现双方的确认,至少需要三次握手,这样可以防止迟到的失效报文段传送到了服务器。当A发送建立连接请求给B,B没有回复确认时,A又会再发一次连接请求。A的上一条请求可能并没有丢失,而是在某个网络节点长时间滞留,当这个连接释放后,B收到了滞留的请求,如果是两次握手的话,B确认并直接建立新的连接,白白浪费资源,而如果是三次,还需要A的再一次确认,连接才会建立,避免出现这个问题。
● 为什么不是四次:因为三次握手,AB都收到了对方的确认,已经能避免出现问题,四次的话,A会收到B的两次建立连接的确认,浪费多一次的信息传递的时间和资源。


四次挥手

TCP连接释放过程:A的数据发完了,B确认A的数据发完了,…(B发数据)…,B的数据发完了,A确认B的数据发完了
计算机网络 问题整理_第7张图片
● 为什么是四次:TCP连接是全双工,每个方向必须单独关闭,因此针对每一个 FIN 报文,都需要一次 ack 报文,故需要四次。理论上三次也可以,FIN 仅仅代表对方没有数据要发给你,但你还有数据要发给对方,所以未必会马上关闭 socket。
● 怎么才可以变成三次:对方发 FIN 的时候,回一个 ack 和 FIN,对方再回一个 ack 就关了。
● TIME_WAIT的作用:如果最后的 ACK 报文段丢失,服务器将会重发 FIN 报文段,因此客户端必须维护状态信息,等待直到确认服务器不会再重发 FIN 报文段的时间


TCP可靠传输

可靠:保证接收方进程从缓存区读出的字节流与发送方发出的字节流是完全一样的。
1.校验:与UDP校验一样,增加伪首部
2.序号:给字节流编号,发送以报文段为单位,报文段序号是报文段数据部分的第一个字节的编号,确认序号会说明了它下一次需要接收的数据序列号
3.确认:数据到达接收方,接收方需要发出一个确认应答,表示已经收到该数据段
4.重传:
● 超时重传:发送方在规定的时间内没有收到确认就要重传已发送的报文段。TCP采用自适应算法,动态改变重传时间RTTs(加权平均往返时间)。
● 快速重传:每当比期望序号大的失序报文段到达时,发送一个冗余ACK,指明下一个期待字节的序号,当发送方收到3个对于1号报文段的冗余ACK,认为2号报文段丢失,重传2号报文段。
5.滑动窗口?


TCP流量控制(点到点)

● 在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,即接收窗口rwnd,发送方的发送窗口取接受窗口rwnd和拥塞窗口cwnd的最小值。
● TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。若持续计时器设置的时间到期,就发送一个零窗口探测报文段。接收方收到探测报文段时给出现在的窗口值。若窗口仍是0,发送方重置持续计时器。


TCP拥塞控制(全局性)

防止过多的数据注入到网络中。
计算机网络 问题整理_第8张图片
慢开始和拥塞避免:拥塞窗口大小从1开始,指数增长,到达 ssthresh ,加法增大,若网络堵塞,ssthresh/2,重新从1开始。
快重传和快恢复:拥塞窗口大小从1开始,指数增长,到达 ssthresh ,加法增大,收到3个重复的确认,执行快重传,重新从ssthresh开始,加法增大。


拆包粘包为什么会产生?如何分包?

● 要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包
● 待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包
● 要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包
● 接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。


如何分包?

解决的关键在于如何给每个数据包添加边界信息
● 发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度,这样接收端在接收到数据后,通过读取包首部的长度字段,便知道每一个数据包的实际长度了。
● 发送端将每个数据包封装为固定长度(不够的可以通过补0填充),这样接收端每次从接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。
● 可以在数据包之间设置边界,如添加特殊符号,这样,接收端通过这个边界就可以将不同的数据包拆分开。


HTTP和HTTPS有什么不同

HTTPS 是 HTTP 的安全版,相应地功耗也上去了
● HTTP 协议,传输协议是 TCP,帐号密码明文传输,容易被窃听截取,数据的完整性未校验,容易被篡改,客户端与服务器都无法验证对方的身份,存在冒充风险。
● 为了解决上述问题,HTTPS 出现了,S 代表安全套接字层 SSL(Secure Socket Layer),添加了加密和认证机制。
● 资源消耗:HTTPS 协议由于加解密安全算法处理,消耗更多的 CPU 和内存资源
● 时间:HTTPS 协议需要多次握手,导致页面的加载时间延长 50%。
● 证书:HTTPS 协议需要申请 SSL 证书,功能越强大证书的费用越高


http://mail.163.com/index.html

● http://:HTTP超文本传输协议,网页在网上传输的协议。
● mail:服务器名,代表着是一个邮箱服务器,所以是mail
● 163.com:域名,是用来定位网站的独一无二的名字
● mail.163.com:网站名,由服务器名+域名组成
● /:根目录,通过网站名找到服务器,然后在服务器存放网页的根目录
● index.html:根目录下的默认网页(当然,163的默认网页是不是这个我不知道,只是大部分的默认网页,都是index.html)
● http://mail.163.com/index.html:URL,统一资源定位符,全球性地址,用于定位网上的资源


DNS域名服务器

● 通过 URL 解析 IP 地址
● 查快表,最近是否访问过这个域名,访问过直接返回记录的 IP 地址
● 没访问过这个域名,主机先请求本地域名服务器,本地域名服务器只知道自己域名里的信息(xyz.com),只能再访问根域名服务器,它知道所有顶级域名服务器的 IP 地址(163.com,baidu.com),拿到地址去访问顶级域名服务器,它知道所有域名对应的 IP 地址(163.com),如果还要再详细到每个部门,就要去访问权限域名服务器(mail.163.com)


HTTP 从URL输入到页面渲染经过了什么

0.客户端输入 URL 或点击超链接
1.浏览器分析 URL
2.浏览器向 DNS 请求解析 IP 地址
3.DNS 解析出服务器 IP 地址
4.浏览器与服务器建立TCP连接
5.浏览器发出取文件命令
6.服务器响应
7.释放TCP连接
8.浏览器显示


HTTPS 从URL输入到页面渲染经过了什么

0.客户端输入 URL 或点击超链接
1.浏览器分析 URL
2.浏览器向 DNS 请求解析 IP 地址
3.DNS 解析出服务器 IP 地址
4.浏览器与服务器建立TCP连接和SSL链接
5.服务器返回证书信息(包含公钥)
6.客户端服务器协商 SSL 链接的安全等级,也就是信息加密的等级
7.确认安全等级,建立会话密钥,利用公钥将密钥加密,传给服务器
8.服务器利用私钥解密出会话密钥
9.利用会话密钥进行通信


编程

①创建套接字

int socket(int domain, int type, int protocol);

doman协议域:AF_INET\PF_INET——IPv4 Internet协议(32位),AF_INET6——IPv6 Internet协议(128位)
type套接口类型:SOCK_STREAM——TCP连接(流式套接字),SOCK_DGRAM——UDP连接(数据包套接字)
protocol协议:IPPROTO_TCP——TCP传输协议,IPPTOTO_UDP——UDP传输协议,IPPROTO_SCTP——SCTP传输协议


②服务器绑定套接字
将套接字与特定的 IP 地址和端口(16位)绑定起来,只有这样,流经该 IP 地址和端口的数据才能交给套接字处理。

int bind(int sockfd, const struct sockaddr* addr, socklen_t addrlen);

sockfd套接字:通过socket()函数创建,唯一标识一个套接口
addr指针:服务器的协议地址
addrlen:服务器的协议地址的类大小


③服务器进入监听状态
让套接字进入被动监听状态,套接字从默认 CLOSED 状态转换到 LISTEN 状态

int listen(int sockfd, int backlog);

sockfd套接字:服务器的套接字
beacklog:等待连接队列的最大长度


④服务器接受客户端请求
服务器一直阻塞直到有客户端连接

int accept(int sockfd, const struct sockaddr* addr, socklen_t* addrlen);

sockfd套接字:服务器的套接字
addr指针:客户端的协议地址
addrlen:客户端的协议地址的类大小
如果成功,返回一个全新的套接字,代表与客户端的TCP连接


⑤客户端建立与服务器的连接

int connect(int sockfd, const struct sockaddr* addr, socklen_t addrlen);

sockfd套接字:客户端的套接字
addr指针:客户端的协议地址
addrlen:客户端的协议地址的类大小


⑥关闭套接字

int close(int fd);

fd:套接字
close 多进程,把套接字的引用计数-1,只有在0的时候才会关闭套接字。终止读写。
shutdown 不计数,直接关掉。可以选终止读还是写。


⑦关闭套接字

int shutdown(int sockfd, int howto);

sockfd:套接字
howto:SHUT_RD——关闭读,SHUT——关闭写(半关闭),SHUT_RDWR——关闭读写,想当于调用两次 shutdown


服务器例程

int main() {
	//初始化 DLL
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);
	
    //创建套接字
	SOCKET servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
	//服务器IP地址和端口 绑定套接字
	sockaddr_in sockAddr;
	memset(&sockAddr, 0, sizeof(sockAddr));  //每个字节都用0填充
	sockAddr.sin_family = PF_INET;  //使用IPv4地址
	sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1");  //具体的IP地址
	sockAddr.sin_port = htons(1234);  //端口
	bind(servSock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));  //将套接字和IP、端口绑定
	//进入监听状态
	listen(servSock, 20);

    //接收客户端请求(阻塞)
    SOCKADDR clntAddr;
    int nSize = sizeof(SOCKADDR);
    SOCKET clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize);

    ////向客户端发送数据
    //const char* str = "Hello World!";
    //send(clntSock, str, strlen(str) + sizeof(char), NULL);

    //关闭套接字
    closesocket(clntSock);
    closesocket(servSock);
    //终止 DLL 的使用
    WSACleanup();

    return 0;
}

网络测试

● ping:互发一样的数据报,两台机器是否连通,时延是多少。ping www.baidu.com
● tracert:从当前主机到目的主机所经过的路由地址。tracert www.baidu.com
● telnet:测试端口的 web 服务器是否正常工作。telnet www.hitsz.edu.cn 80
● netstat:显示所有连接的端口。


脑图:
计算机网络 问题整理_第9张图片

你可能感兴趣的:(计算机网络 问题整理)