计算机网络总结

网络编程简单总结(https://www.myzwl.win/2017/07/29/socket_1/)

tcp/ip分层
链接层(ARP欺诈)-网络层(ip、icmp(ping))-传送层(tcp、udp)-应用层(POP3、Http、FTP,SSH、SMTP)
ip协议
ip层就是唯一确定了一台机器,就像我们住的房间地址一样,唯一确定了我们的住处
这里需要注意的是,ip地址由四位字节组成,每个字节由8位二进制组成,同时有a,b,c三类地址,如图由网络号和主机号组成,当然这是公网,如果是局域网的话,就需要配网关和子网掩码了,如192.168.1.1和255.255.0.0那么255.255就是确定了ip地址哪几位字节是网络号,如192.168就是网络号
TCP与UDP协议
tcp协议
有65536个端口 0号是保留端口
1-1024是固定端口
又叫有名端口,即被某些程序固定使用,一般程序员不使用。
22:SSH远程登录协议 23:telnet使用 21:ftp使用
25:smtp服务使用 80:iis使用 7:echo服务
1025-65535是动态端口
UDP协议
UDP向应用程序提供了一种发送封装的原始IP数据报的方法,并且发送时无需建立连接,是一种不可靠的连接。
简单来说,就是只发一次数据,不管对方有没有接收到都不会再发了,但是有时候效率会很高,像网络拥堵时

url
统一资源定义符也被称为网页地址。Internet上的每一个网页都具有一个唯一的名称标识,通常称之为URL地址,这种地址可以是本地磁盘,也可以是局域网上的某一台计算机,更多的是Internet上的站点,简单地说,URL就是Web地址,俗称“网址”,是用于完整地描述Internet上网页和其他资源的地址的一种标识方法,如:
http://www.sina.com:8080/index.html
1、协议;2、ip地址(32位);3、端口号(16位)0-65535;4、资源名称。

单工、半双工和全双工
Socket编程(模拟socket编程)

tcp 如何保证传输的可靠性

tcp 是面向连接,可靠的字节流服务
面向连接意味着两个使用tcp 的应用(通常是一个客户端和一个服务器)在彼此交换数
据之前必须先建立一个tcp 连接。在一个tcp 连接中,仅有两方进行彼此通信,广播和多播
不能用于tcp。
Tcp 通过下列方式提供可靠性:
1)将应用数据分割为tcp 认为最合适发送的数据块;
2)超时重传:当tcp 发出一个段后,他启动一个定时器,等待目的端确认收到这个报
文段。若不能及时收到一个确认,将重发这个报文段。
3)当tcp 收到发自tcp 链接另一端的数据时,它将发送一个确认(对于收到的请求,给
出确认响应)。这个确认不是立即发送,通常将推迟几分之一秒(之所以推迟,可能是要对
包做完校验);
4)若tcp 收到包,校验出包有错,丢弃报文段,不给出响应,tcp 发送端会超时重传;
5)对于失序数据进行重新排序,然后交给应用层(tcp 报文段作为ip 数据报进行传输,
而ip 数据报的到达会失序,因此tcp 报文段的到达也可能失序。若必要,tcp 将对收到的数
据进行重新排列,以正确的顺序交给应用层)。
6)对于重复数据,直接丢弃。
7)tcp 可以进行流量控制,防止较快主机致使较慢主机的缓冲区溢出
字节流服务:两个应用程序通过tcp 连接,tcp 不在字节中插入记录标识符,我们将这
种为字节流服务。
Tcp 对字节流的内容不做任何解释,tcp 不知道传输的字节流数据是二进制数据还是ascii
字符或其他类型数据,对字节流的解释由tcp 连接双方的应用层。

简单描述一下https

https 其实是由两部分组成:http+ssl/tls,也就是在http 上又加了一层处理加密信息的
模块,服务端和客户端的信息传输都会通过tls 加密,传输的数据都是加密后的数据。加解
密过程:
1)客户端发起https 请求(就是用户在浏览器里输入一个https 网址,然后连接到server
的443 端口)
2)服务端的配置(采用https 协议的服务器必须要有一塔数字证书,可以自己制作,
也可以向组织申请,这套证书就是一对公钥和私钥)。
3)传输证书(这个证书就是公钥,只是包含了很多信息)
4)客户端解析证书(由客户端tls 完成,首先验证公钥是否有效,若发现异常,则弹出
一个警示框,提示证书存在问题,若无问题,则生成一个随机值,然后用证书对随机值进行
加密)
5)传输加密信息(这里传输的是加密后的随机值,目的是让服务端得到这个随机值,
以后客户端和服务端的通信就可以通过这个随机值来进行加密了)
6)服务端解密信息(服务端用私钥解密后得到了客户端传来的随机值,then 把内容通
过该值进行对称加密。所谓对称加密就是,将信息和私钥通过某种算法混在一起,这样除非
知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法
够彪悍,私钥够复杂,数据就够安全)
7)传输加密的信息
8)客户端解密信息,用随机数来解。

短链接一般只会在client/server 间传递一次读写操作。
Tcp 保活功能,主要为服务器应用程序提供,服务器应用程序需要知道客户主机是否崩
溃,从而可以代表客户使用资源.
tcp 保护功能是探测长连接存活状况。
Tcp 的keep-alive 是检查当前tcp 是否还活着;http 的keep-alive 是让一个tcp 连接活多
久,他们是不同层次的概念。

a 发送给b 一个信息,但是a 不承认他发送了,防止这个可用数字签名
DNS 即使用tcp,又使用udp
https 若在浏览器端抓包,是可以看到数据的,并没有加密,抓到的是加密之前的

http 请求过程——当我们在浏览器输入www.baidu.com,然后回车之后的详解

1)域名解析(域名www.baidu.com 变为ip 地址)。
2)发起tcp 的三次握手,建立tcp 连接。浏
览器会以一个随机端口(1024-65535)向服务端的web 程序80 端口发起tcp 的连接.这个请
求(原始的http 请求,经过原始的tcp/ip 四层模型层层封装),到达服务器端后,进入网
卡,然后进入内核的协议栈(一层一层拨开),然后到达web 应用程序,最终建立了tcp/ip
链接。
3)建立tcp 连接后发起http 请求。
4)服务器响应http 请求,客户端得到html 代码。
服务器web 应用程序收到http 请求后,就开始处理请求,处理之后就返回给浏览器html
文件。
5)浏览器解析html 代码,并请求html 中的资源。
6)浏览器对页面进行渲染,并呈现给用户。

什么是正向代理和反向代理

正向代理:我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代
理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要哪
个无法访问的网站的内容,代理服务器取回来给我。server 不知道client。
反向代理:client 不知道server,并不是URL 中请求的那个资源,而是不知道从什么地方来
的。以代理服务器来接收internet 上的请求,然后将请求转发给内部网络的服务器,并将从
服务器上得到的结果返回给internet 上请求的客户,此时代理服务器对外就表现为一个服务
器。1)保证内网安全、2)负载均衡,nginx 通过proxy-pass-http 配置代理站点,upstream
实现负载均衡。

怎么用udp 实现tcp

由于在传输层udp 已经是不可靠的,那就要在应用层自己实现一
些保证可靠传输的机制,简单来说,要使用udp 来构建可靠的面向连接的数据传输,就要
实现类似于tcp 的超时重传(定时器),拥塞控制(滑动窗口),有序接收(添加包序号),
应答确认(ack 和seq)。目前已经有了实现udp 可靠运输的机制——udt:主要目的高速广
域网海量数据传输,他是应用层协议

Tcp:
1)流量控制:防止较快主机使较慢主机缓冲区溢出,是点对点;
2)拥塞控制:全局性,防止过多的数据注入网络。
tcp 采用滑动窗口进行流量控制,滑动窗口大小可变,窗口大小的单位是字节。

一致性哈希算法

在分布式集群中,对机器的添加和删除或机器故障后自动脱离集群,这些操作是分布式
集群管理最基本的功能,若采用常用的hash(object)%N 算法,那么在有机器添加或删除以后,
很多原有的数据就无法找到,所以出现一致性哈希算法——
1)环形hash 空间:按照常用的
hash 算法来将对应的key 哈希到一个具有232 个桶的空间,即(0-232 -1)的数字空间中,现
在我们将这些数字头尾相连,想象成一个闭合的环形。
2)把数据通过一定的hash 算法映射到环上。
3)将机器通过一定的hash 算法映射到环上。
4)节点按顺时针转动,遇到的第一个机器,就把数据放在该机器上

Nginx负载均衡五种配置

1)轮询(默认),每个请求按时间顺序逐一分配到不同的后端服务器,如果后端
服务器down 掉,能自动剔除;
2)指定权重,指定轮询几率。权重越大,轮询几率越大,
用于后端服务器性能不均的情况。
3)ip 绑定ip_path,每个请求按访问ip 的哈希结果分配,
这样每个客户固定访问一个服务器,可以解决session 问题。
4)fair(第三方)按后端服务器的响应时间来分配请求,响应时间短的优先分配。
5)url_hash 按访问的url 结果来分配请
求,使每个url 定位到同一个后端服务器。后端服务器为缓存时比较有效

三次握手(手动画出图解)

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

完成三次握手,客户端与服务器开始传送数据

关闭TCP连接:改进的三次握手

对于一个已经建立的连接,TCP使用改进的三次握手来释放连接(使用一个带有FIN附加标记的报文段)。TCP关闭连接的步骤如下:

第一步,当主机A的应用程序通知TCP数据已经发送完毕时,TCP向主机B发送一个带有FIN附加标记的报文段(FIN表示英文finish)。

第二步,主机B收到这个FIN报文段之后,并不立即用FIN报文段回复主机A,而是先向主机A发送一个确认序号ACK,同时通知自己相应的应用程序:对方要求关闭连接(先发送ACK的目的是为了防止在这段时间内,对方重传FIN报文段)。

第三步,主机B的应用程序告诉TCP:我要彻底的关闭连接,TCP向主机A送一个FIN报文段。

第四步,主机A收到这个FIN报文段后,向主机B发送一个ACK表示连接彻底释放

两次握手不行吗

A发送报文滞留过长导致失效,然后b发送链接请求,A不理睬

TIME-WAIT为什么是2MSL

确保最后一个报文发到b,没有则重传
防止已失效的报文链接出现在本链接中

为什么TCP释放连接需要四次

TCP建立连接要进行三次握手,而断开连接要进行四次。这是由于TCP的半关闭造成的。因为TCP连接是全双工的(即数据可在两个方向上同时传递)所以进行关闭时每个方向上都要单独进行关闭。这个单方向的关闭就叫半关闭。当一方完成它的数据发送任务,就发送一个FIN来向另一方通告将要终止这个方向的连接

热评文章