Computer Network
Summary of 4 Layer Model
The 7-layer OSI Model
traceroute -w 1 www.jonblog.site
https://www.bilibili.com/video/BV1F54y1t7Dx?from=search&seid=12798261982184143495
Open System Interconnection
OSI 7层模型
TCP/IP 5层模型
应用层
protocol
URI
ftp://ftp.is.co.za/rfc/rfc1808.txt http://www.ietf.org/rfc/rfc2396.txt
ldap://[2001:db8::7]/c=GB?objectClass?one mailto:John.Doe@example.com
news:comp.infosystems.www.servers.unix
tel:+1-816-555-1212
telnet://192.0.2.16:80/ urn:oasis:names:specification:docbook:dtd:xml:4.1.2
Http1.1
https://tools.ietf.org/html/rfc7230#section-6
HyperText Transfer Protocol 可靠的数据传输协议,基于TCP
报文格式
Http2.0
https://tools.ietf.org/html/rfc7540
可以看到http2.0改造了协议, head 改成了 HEADERS frame ,Body 改成了 DATA frame。
- Length : 整个frame 开始到结束
- Type : frame的类型
- Stream ID用作流控制
- Payload 请求正文
https://www.bilibili.com/video/BV1SJ411q7ei?from=search&seid=10178848750670062838
https://www.bilibili.com/video/BV1Sw411d7oE?from=search&seid=10178848750670062838
端口作用
进程id是会变化的,进程通过绑定固定不变的端口,来实现通信。
http版本区别
https://juejin.cn/post/6844903489596833800
Socket
对TCP/IP的封装, 提供可供程序员做网络开发的接口-Socket编程接口。
SocketHttpTest.java
http get请求
按照get请求拼接字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17StringBuffer protocol = new StringBuffer();
//请求行
protocol.append("GET ");
protocol.append(url.getPath());
protocol.append("?");
protocol.append(url.getQuery());
protocol.append(" ");
protocol.append("HTTP/1.1");
protocol.append("\r\n");
// http请求头
protocol.append("Host:");
protocol.append(url.getHost());
protocol.append("\r\n");
//空行
protocol.append("\r\n");1
2
3
4
5
6
7
8
9
10
11
12
13
14//post请求体 get没有
System.out.println("发送的http报文: \n" + protocol.toString());
Socket socket = new Socket();
socket.connect(new InetSocketAddress(url.getHost(), 80));
//获得输入输出流
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
bufferedWriter.write(protocol.toString());
bufferedWriter.flush();
StringBuilder stringBuilder = new StringBuilder();
1 | String line = ""; |
1 | * Http Post请求 |
分块编码
数据量很大!分块编码
上面的5就是 下面的字符长度
HTTPS
https://www.bilibili.com/video/BV1F54y1t7Dx?p=5
https://www.bilibili.com/video/BV1j7411H7vV?from=search&seid=12798261982184143495
传输层 (TCP UDP)
代码运行在用户机器上,为了对 网络层进行更好的控制 UDP(User Datagram Protocol)
面向报文传输
没有拥塞控制,无法保证数据在网络中是否丢失
UDP首部开销小
![传输层]
TCP (Transmission Control Protocol)
面向连接的协议
提供可靠传输
全双工通信
面向字节流协议: 可能对用户数据合并或分拆进行传输
TCP首部
序号
tcp标记
如何保证TCP可靠传输?
停止等待协议
连续ARQ协议(Automatic Repeat request) :
滑动窗口: 以字节为单位,实现流量控制 累计确认
选择重传: 重传边界和范围
定时器
超时定时器
坚持定时器: 解决死锁局面,当收到窗口为0的消息,则启动坚持定时器,每隔一段时间发送一个窗口探测报文
TCP协议的拥塞控制
报文超时即认为拥塞
慢启动算法
由小到大逐渐增加发送数据量,直到到达 “慢启动阈值”=>开始 拥塞避免算法
拥塞避免算法
只要网络不拥塞,就试探拥塞窗口调大
TCP三次握手
TCP标记
三次握手
![shake]
为何3次握手1
客户端角度 : 1 ,2,说明客户端的发送和接收没问题
服务端角度: 1,2,说明服务端的接收没问题,但是不确定自己的发送收否有问题,所以需要3确认
为何3次握手2
第一次握手客户端发出: Server觉得 : 客户端的发送能力没问题
第二次握手服务端发出: Client觉得 : 服务端的接收能力没问题, 以及服务端的发送能力没问题。
第三次握手客户端发出: Server觉得: 客户端的接收能力没问题。
为什么要第三次握手?
只有两次握手的话,一旦第二次握手接收超时,重新发送后就会重新发送,会导致建立2个连接
TCP连接的4次挥手
由客户端向服务端发起 : 服务端收到信息后,就能确定客户端已经停止发送数据。
由服务端向客户端发起 : 客户端收到消息后,就能确定服务端已经知道客户端不会再发送数据。这一次是为了TCP可靠传输,确认收到了数据包。
由服务端向客户端发起 : 客户端收到消息后,就能确定服务端已经停止发送数据。此时 服务端数据发送完了。
由客户端向服务端发起 : 服务端收到信息后,就能确定客户端已经知道服务端不会再发送数据。
Client: 分手
Server : what
Server : 好吧 分吧
Client : 我已经删微信了;
等待计时器 : 2MSL(Max Segment liftime),
**为什么需要等待计时器?**: 如果第4个挥手报文接收方没收到,那么接收方会重新发送第3次的挥手报文
为什么第3次挥手是接收方发出的? : 我的理解是,第2次挥手是确认收到的回复,第三次是挥手是确认数据发送完毕,告诉发送方可以断开了,然而我又有了疑问?
为什么需要第4次挥手?
小扎和小美通信
https://www.zhihu.com/question/63264012
网络层
通过ISP、路由 找到 ,运行在路由器上 rip协议:不太理解
网络配置
主机计算
IPADDR : 192.168.139.10
NETMASK子网掩码 : 255.255.255.0
网络号: 就是上面的IPADDR ,NETMASK进行 与运算, 192.168.139.0,10就是网络中的第10号主机。
##路由表
第一条意思
我这台计算机通过 eth0,不需要任何中间的网关Geteway,久可以访问这个网络(192.168.150.)中的任何计算机,
怎么找到目标主机
面试题:路由器是怎么找目标服务器
https://www.bilibili.com/video/BV1PU4y1s7Bs?p=18&spm_id_from=pageDriver
https://www.bilibili.com/video/BV1PU4y1s7Bs?p=24&spm_id_from=pageDriver
www.baidu.com通过 DNS解析得到目标ip地址 61.135.169.121
61.135.169.121和第一条255.255.255.0进行 按位与运算的到的61.135.169.0和192.168.150.0结果不一样,所以该条目被淘汰。
第二条目不用管(好像这个条目有问题),来到第三条,按照步骤2按位与运算,得到结果0.0.0.0,和Destination结果一样。则此时的Gateway起作用。
数据给到下一跳网关,也就是192.168.150.2,如果获得的下一跳网关Gateway是 0.0.0.0的话,那么说明在同一个局域网直接发数据就好了,不用跳了。
#数据链路层
封装成帧
透明传输
差错检测
ARP协议
网卡的IP 192.168.150.1 和at后面对应的 网卡mac地址。
网卡pc1到pc5的过程
网络数据里层存放目标IP地址,外层有下一跳的mac地址。
但是mac地址是怎么来的呢?
就是通过 arp协议,
- pc1发到pc2路由器,带的数据是1,mac先定义成FFFFFF
- pc2接受到后,回传给pc1自己的mac地址,接着上面的传输层步骤4就有了下一跳的mac地址了。
物理层: 铜线介质类
- 数据链路层 : 相邻两台机器间的连接,把数据报以帧的形式发送, 以太网协议
https://www.bilibili.com/video/BV1pA411M7Ai?p=137&spm_id_from=pageDriver
https://www.bilibili.com/video/BV1PU4y1s7Bs?from=search&seid=16016904944562540448
https://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
https://hpbn.co/brief-history-of-http/
https://www.w3.org/Protocols/History.html
https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP
TCP 三次握手,确保两端收发能力的正常。
Client -> Server : Client发送Ok
Client send | Client recieve | Server send | Server Recieve | |
---|---|---|---|---|
Client->Server | ok | |||
Server ->Client | ok | |||
Client->Server | ok | ok |