目录
一、三次握手
1.1 三次握手过程
1.2 为什么不两次握手
1.3 四次握手
1.4 常见问题
1.5 TCP的有限状态机
二、TCP与UDP
2.1 TCP/IP协议簇
2.2 TCP与UDP的区别
三、TCP协议的函数顺序
3.1 服务器端顺序
3.2 客户端顺序
四、UDP顺序
4.1 服务端
4.2 客户端
五、IP地址
5.1 定义与分类
A,B,C类地址
5.2 子网掩码
5.3 同一网段
六、应用层的一些协议
七、网络安全
7.1 主动攻击与被动攻击
7.2 安全的网络
八、加密模型
8.1 加密解密
8.2 密码学
8.3 两种密钥体制
对称密钥密码体制
公钥密码体制
8.4 数字签名
https://blog.csdn.net/qq_38950316/article/details/81087809#commentsedit
TCP建立可靠的传输协议的时候需要三次握手。
注意,连接的建立与结束都是 客户端 发起的。
第一次握手:建立连接时,客户端发送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连接成功)状态,完成三次握手。
三次握手是为了可靠性。既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。
例如,如果两次握手,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。但是假如C没有收到S的确认,因此不会收到S的数据,而S不断的重新发送超时的数据分组。导致死锁。
建立TCP时候需要三次握手,关闭连接的时候需要四次握手。
主动方依然是客户端发起的。
简而言之是这样:
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连接的时间要比客户端早一些。
为什么关闭需要四次握手?
因为当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个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
此部分用于思考
网络层是IP协议,TCP是运输层的协议。
https://www.cnblogs.com/steven520213/p/8005258.html
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]
TCP与UDP都是传输层的协议。
UDP:Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据报的方法。
连接方面区别
安全方面的区别
传输效率的区别
连接对象数量的区别
https://www.cnblogs.com/52php/p/5872596.html
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,因为三次握手机制是客户端发起的。
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编程步骤要简单许多,分别如下:
UDP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、循环接收数据,用函数recvfrom();
5、关闭网络连接;
socket——bind——recvfrom
UDP编程的客户端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置对方的IP地址和端口等属性;
5、发送数据,用函数sendto();
6、关闭网络连接;
socket——bind——sendto
注意,再次提醒,IP协议是在网络层,TCP协议是在运输层。
IP地址在整个网络范围内都是统一的
定义为网络号加主机号。
为了便于对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。
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,会得到同样的网络地址。
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。
篡改即更改报文流
恶意程序分为很多种
保密性,安全鉴别,完整性,运行安全性
明文X通过加密和解密用的K,得到密文。
,加密过程
,解密过程
密码编码学:密码体制的设计学
密码分析学:未知密钥的情况下推演出明文或者密钥的技术。
对称密钥密码体制,公钥密码体制
例如DES,属于此体制。对密钥保密,对算法公开。因为解密技术的发展以及计算机的出现,两重DES不再保密,因此提出了三重DES。即:
三重DES广泛应用于网络,金融,信用卡等系统。
使用不同的加密与解密密钥。
加密密钥PK,public key公钥是公开的,解密密钥SK ,secret key是保密的,加密算法E与解密算法D也是公开的。
例如,如果A向B发送信息,需要下面流程:
公钥密码体制有以下特点:
数字签名必须具有三点功能:1.报文鉴别,确信报文的确是发送者发送的。2.报文完整性,报文未被篡改过。3.不可否认,发送者时候不可抵赖对报文的签名。
核实签名:
A用私钥进行加密,任何人用A的公钥均可恢复出明文。此步是为了确认此信息是A发送的。
但是这个过程虽然确认是A发送的,但是报文X并未保密,因为任何人均可根据A的公钥恢复出明文。采用下面这种方法,就能保证A与B之间的保密传输且具有数字签名。