计算机网络基础(三次握手|TCP/IP协议|五层协议栈|网络安全)
目录
一、三次握手
https://blog.****.net/qq_38950316/article/details/81087809#commentsedit
TCP建立可靠的传输协议的时候需要三次握手。
1.1 三次握手过程
注意,连接的建立与结束都是 客户端 发起的。
第一次握手:建立连接时,客户端发送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连接成功)状态,完成三次握手。
1.2 为什么不两次握手
三次握手是为了可靠性。既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始***进行协商,这个***在握手过程中被发送和确认。
例如,如果两次握手,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。但是假如C没有收到S的确认,因此不会收到S的数据,而S不断的重新发送超时的数据分组。导致死锁。
1.3 四次握手
建立TCP时候需要三次握手,关闭连接的时候需要四次握手。
主动方依然是客户端发起的。
简而言之是这样:
- 1. C发送结束信息FIN和***给S,
- 2. S收到之后就立刻回复ACK与两个***,其中一个是确认***,另一个是自己的***。并且开始通知应用层关闭数据传送。
- 3. S等所有数据传输完成后给S发送FIN,与两个***,表示最终关闭连接确认。
- 4. C收到之后即回复确认ACK与两个***,两个***均为回复S的***。同时等待2MSL之后关闭。
- 5. S收到C发来的确认之后就可以关闭。此时关闭会比S关闭的早。
1)客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其***为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。
2)服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的***seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
3)客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
4)服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的***为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
5)客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的***是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
6)服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
1.4 常见问题
为什么关闭需要四次握手?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。
但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,因为还需要通知应用层减少通信。所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手,保证Server端从收到Client端的结束报文到通知自身应用层结束这段时间的报文可以传送到Client端。
为什么四次握手时候TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。
如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟(这个时间存疑,不清楚是75分钟还是75秒,需要查阅相应资料确认。但是基本确认为75秒,因为75分钟太长了)发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
1.5 TCP的有限状态机
此部分用于思考
二、TCP与UDP
网络层是IP协议,TCP是运输层的协议。
https://www.cnblogs.com/steven520213/p/8005258.html
2.1 TCP/IP协议簇
TCP是运输层的协议,socket是TCP与应用层之间的联系,IP协议是网络层的协议。
TCP/IP协议是一个协议簇。里面包括很多协议的。UDP只是其中的一个。
TCP/IP协议(传输控制协议/互联网协议)不是简单的一个协议,而是一组特别的协议,包括:TCP,IP,UDP,ARP等,这些被称为子协议。在这些协议中,最重要、最著名的就是TCP和IP。因此,大部分网络管理员称整个协议族为“TCP/IP”。https://baike.baidu.com/item/TCP/IP%E5%8D%8F%E8%AE%AE/212915
TCP/IP包含了链路层,传输层,网络层,应用层。
1、链路层
链路层有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。把链路层地址和网络层地址联系起来的协议有ARP(Address Resolution Protocol,地址解析协议)和RARP(Reverse Address Resolution Protocol,逆地址解析协议)。封装成帧,透明传输,差错检测。
2、网络层
网络层处理分组在网络中的活动,例如分组的选路。在TCP/IP协议族中,网络层协议包括IP协议(Internet Protocol,网际协议)、ICMP协议(Internet Control Message Protocol,网际控制报文协议)和IGMP协议(Internet Group Management Protocol,网际组管理协议)。网络层只提供简单的,无连接的,尽最大努力的交付。
3、传输层
传输层主要为两台主机上的应用程序提供端到端的通信。在TCP/IP协议族中,有两个互不相同的传输协议:TCP(Transmission Control Protocol,传输控制协议)和UDP(User Datagram Protocol,用户数据报协议)。
4、应用层
应用层负责处理特定的应用程序细节。几乎各种不同的TCP/IP实现都会提供下面这些通用的应用程序:Telnet远程登录、SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)、FTP(File Transfer Protocol,文件传输协议)、HTTP(Hyper Text Transfer Protocol,超文本传输协议)等。 [2]
2.2 TCP与UDP的区别
TCP与UDP都是传输层的协议。
UDP:Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据报的方法。
连接方面区别
- TCP面向连接(如打电话要先三次握手建立连接)。
- UDP是无连接的,即发送数据之前不需要建立连接。
安全方面的区别
- TCP提供可靠的服务,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达。
- UDP尽最大努力交付,即不保证可靠交付。
传输效率的区别
- TCP传输效率相对较低。
- UDP传输效率高,适用于对高速传输和实时性有较高的通信或广播通信。
连接对象数量的区别
- TCP连接只能是点到点、一对一的。
- UDP支持一对一,一对多,多对一和多对多的交互通信。
三、TCP协议的函数顺序
https://www.cnblogs.com/52php/p/5872596.html
3.1 服务器端顺序
TCP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt(); * 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、开启监听,用函数listen();
5、接收客户端上来的连接,用函数accept();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
8、关闭监听;
socket——bind——listen——accetp——read/write——close
注意,connect是只在客户端出现的,而服务器端只有listen与accept,因为三次握手机制是客户端发起的。
3.2 客户端顺序
TCP编程的客户端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置要连接的对方的IP地址和端口等属性;
5、连接服务器,用函数connect();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
socket——bind——connect——read/write——close
四、UDP顺序
4.1 服务端
与之对应的UDP编程步骤要简单许多,分别如下:
UDP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、循环接收数据,用函数recvfrom();
5、关闭网络连接;
socket——bind——recvfrom
4.2 客户端
UDP编程的客户端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置对方的IP地址和端口等属性;
5、发送数据,用函数sendto();
6、关闭网络连接;
socket——bind——sendto
五、IP地址
注意,再次提醒,IP协议是在网络层,TCP协议是在运输层。
IP地址在整个网络范围内都是统一的
5.1 定义与分类
定义为网络号加主机号。
A,B,C类地址:
为了便于对IP地址进行管理,将IP地址分为了五类,在考试中经常考到是A、B、C类的判断。
判断IP地址的类型只需要判断第一组数的范围即可。
A类:1-126
B类:128-191
C类:192-223
需要大家注意的是第一组数为127是用于测试用的,不属于任何类型。
【例题2】下列IP地址中,( )地址是B类地址。
A.10.110.25.1 B.127.10.210.25
C.192.56.30.240 D.128.20.230.2
【答案】D。
5.2 子网掩码
https://baijiahao.baidu.com/s?id=1606474671793061553&wfr=spider&for=pc
之前的两级IP地址不够灵活,空间利用率低。因此需要三级的IP地址:
划分子网增加了灵活性,但是减少了能在子网上连接的主机数。通过子网掩码,我们就能分出网络地址与主机地址。
例如,IP为141.14.72.24,子网掩码为 255.255.192.0,如何获得网络地址?解法如下:
再例如把上面子网掩码改成 255.255.224.0,会得到同样的网络地址。
5.3 同一网段
https://baike.baidu.com/item/%E5%90%8C%E4%B8%80%E7%BD%91%E6%AE%B5/448495?fr=aladdin
同一网段指的是IP地址和子网掩码相与得到相同的网络地址。想在同一网段,必须做到网络标识相同。
即IP地址与子网掩码相与,如果结果相同,即网络地址相同,则在同一网段。
(这里查相关资料,默认是子网掩码可以不同,只要最终的网络地址相同即判断为同一网段。)
六、应用层的一些协议
域名系统
域名系统用于从计算机网络地址之中解析出IP地址。DNS,domain name system。
七、网络安全
7.1 主动攻击与被动攻击
- 被动攻击:称为截获,不干扰信息流。
- 主动攻击:分为篡改和恶意程序。
篡改即更改报文流
恶意程序分为很多种
- 拒绝服务Dos (denial of service):攻击者不停向服务器发布大量分组,使服务器无法正常工作。
7.2 安全的网络
保密性,安全鉴别,完整性,运行安全性
- 保密性:只有发送方和接收方才懂得信息内容。截获者完全不懂信息内容。
- 端点鉴别:计算机网络必须能鉴别发送方和接收方的真实身份。
- 完整性:必须确认收到信息是完整的,没有被人篡改过。
- 运行安全性:恶意程序或者拒绝服务等。访问控制对计算机的安全很重要,对访问网络的权限加以控制。
八、加密模型
8.1 加密解密
明文X通过加密和解密用的K,得到密文。
,加密过程
,解密过程
8.2 密码学
密码编码学:密码体制的设计学
密码分析学:未知**的情况下推演出明文或者**的技术。
8.3 两种**体制
对称**密码体制,公钥密码体制
对称**密码体制
例如DES,属于此体制。对**保密,对算法公开。因为解密技术的发展以及计算机的出现,两重DES不再保密,因此提出了三重DES。即:
三重DES广泛应用于网络,金融,信用卡等系统。
公钥密码体制
使用不同的加密与解***。
加***PK,public key公钥是公开的,解***SK ,secret key是保密的,加密算法E与解密算法D也是公开的。
例如,如果A向B发送信息,需要下面流程:
- A用B的公钥PKB通过E对明文X加密,得出密文Y,发送给B
- B通过自己的私钥SKB通过对D运算解密,恢复出明文
公钥密码体制有以下特点:
- 虽然公钥可以加密,但是不能解密
- 先对X进行D运算和先对X进行E运算,结果一样。
8.4 数字签名
数字签名必须具有三点功能:1.报文鉴别,确信报文的确是发送者发送的。2.报文完整性,报文未被篡改过。3.不可否认,发送者时候不可抵赖对报文的签名。
核实签名:
A用私钥进行加密,任何人用A的公钥均可恢复出明文。此步是为了确认此信息是A发送的。
但是这个过程虽然确认是A发送的,但是报文X并未保密,因为任何人均可根据A的公钥恢复出明文。采用下面这种方法,就能保证A与B之间的保密传输且具有数字签名。