网络基础学习之TCP三次握手以及四次分手

前言

计算机网络是什么?

利用通信线路将地理上分散的、具有独立功能的计算机系统和通信设备按不同的形式连接起来,以功能完善的网络软件及协议实现资源共享和信息传递的系统;

主要网络有哪些?

1.局域网 LAN;(作用范围一般为几米到几十公里)
2.城域网 MAN;(界于WAN与LAN之间)
3.广域网 WAN;(作用范围一般为几十到几千公里)

计算机网络发展史

1.诞生阶段,单个计算机为中心的远程联机系统;
2.ARPANET,多个主机通过通信线路互联起来;
3.开放性的标准化体系结构,OSI诞生;
4.Intentnet互联网;

计算机网络体系结构

计算机网络体系结构

TCP/IP协议族

Transmission Control Protocol / Internet Protocol的简写,传输控制协议/因特网互联协议,是Internet最基本的协议,Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成;协议采用了4层的层级结构;它是利用IP进行通信时所必须用到的协议群的统称;

TCP/IP概念层模型功能TCP/IP协议族
应用层文件传输、电子邮件、文件服务、虚拟终端TFTP、HTTP、SNMP、FTP、SMTP、DNS、Telent
传输层提供端对端的接口TCP、UDP
网络层为数据包选择路由IP、ICMP、RIP、OSPE、BGP、IGMP
链路层传输有地址的帧以及错误检测功能SLTP、CSLIP、PPP、ARP、RARP、MTU

TCP 面向连接的、可靠的流协议;
UDP 面向无连接的通讯协议;
IP 在源地址和目的地址之间传送的数据包;
ICMP 控制报文协议;
IGMP internet组管理协议;
ARP 地址解析协议;
RARP 反向地址转化协议;

TCP和UDP

TCPUDP都是传输层的协议,传输层主要为两台主机上的应用程序提供端到端的通信;

不同之处:TCP提供了一种可靠的数据传输服务,TCP是面向连接的,也就是说,利用TCP通信的两台主机首先要经历一个建立连接的过程,等到连接建立后才开始传输数据,而且传输过程中采用“带重传的肯定确认”技术来实现传输的可靠性。TCP还采用一种称为“滑动窗口”的方式进行流量控制,发送完成后还会关闭连接。所以TCP要比UDP可靠的多;

UDP是把数据发出去后,不管对方是不是在接收,也不管对方是否能接收的了,也不需要接收方确认,属于不可靠的传输,可能会出现丢包现象;

我们常用的网络应用基本上都是基于TCPUDP的,这两个协议又会使用网络层的IP;但是我们完全可以绕开传输层的TCPUDP,直接使用IP,甚至直接访问链路层,比如tcpdump程序就是直接和链路层进行通信的;
传输协议图

网络通信中的值和端口号

MAC地址:全称叫做媒体访问控制地址,也称为局域网地址以太网地址物理地址,由网络设备制造商生产时写入硬件内部。MAC地址与网络无关;

IP地址:全称叫做互联网协议地址,为互联网上的每一个网络和每一台主机配置一个唯一的逻辑地址,与物理地址作区别;所以IP地址用来识别TCP/IP网络中互连的主机和路由器;

端口号用来识别同一个计算机中进行通信的不同应用程序,因此也被称为程序地址;

TCP三次握手

TCP是面向连接的通信协议,通过三次握手建立连接,然后才开始数据的读写,通讯完成时要拆除连接。
TCP三次握手图
TCP提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好两端之间的准备工作;
所谓三次握手是指建立一个TCP连接时需要客户端和服务端总共发送三个包以确认连接的建立;

第一次握手 客户端将标志位SYN置为1,随机产生一个seq = J,并将该数据包发送给服务端,客户端进入SYN_SENT状态,等待服务端确认;

第二次握手 服务端接收到数据包后由标志位SYN =1 知道客户端请求建立连接,服务端将标志位SYN和ACK都置为1,ack = J+1,随机产生一个值seq = K,并将该数据包发送给客户端以确认连接请求,服务端进入SYN_RCVD状态;

第三次握手 客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack = K+1,并将该数据包发送给服务端,服务端检查ack是否为k+1,ACK是否为1,如果正确则连接建立成功,客户端和服务端进入ESTABLISHED状态,完成三次握手,随后客户端与服务端之间可以开始数据传输了;

为什么TCP握手需要三次?

TCP是可靠的传输控制协议,而三次握手是保证数据可靠传输又能提高传输效率的最小次数。
三次握手的过程是通信双方互相告知序列号起始值,并确认对方已经收到了序列号起始值的必经步骤;
如果只是两次握手,至多只有连接发起方的起始序列号能被确认,另一方选择的序列号得不到确认;
如果是四次握手,很明显,三次握手后,通信的双方已经知道了对方序列号的起始值,也确认了对方知道自己序列号起始值,第四次没有必要了;

TCP三次握手的漏洞SYN洪泛攻击

TCP三次握手是有一个缺陷的,如果我们利用三次握手的缺陷进行攻击,这个攻击就是SYN洪泛攻击。三次握手中有一个第二次握手,服务端向客户端应答请求,应答请求是需要客户端IP的,攻击者可以伪造这个IP,往服务端狂发第一次握手的内容,第一次握手中客户端IP地址是伪造的,从而服务端忙于进行第二次握手但第二次握手没有结果,导致服务器被拖累死机;

解决方案 使用防火墙,在确认了连接的有效性后,才向内部的服务端发起SYN请求;

TCP四次挥手

四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发;

由于TCP连接是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当甲方完成数据发送任务后,发送一个FIN给乙方来终止这一方向的连接,乙方收到一个FIN只是意味着不会收到甲方数据了,但是乙方还可以给甲方发送数据,直到乙方也发送了FIN给甲方。

TCP四次挥手图

第一次挥手

  • 客户端向服务端发送一个FIN数据包(FIN =1,seq = u)主动断开连接,报文中会指定一个序列号;
  • 告诉服务器,我要跟你断开连接,不会再给你发数据了;
  • 客户端此时还是可以接收数据,如果一直没有收到被动连接方的确认包,则可以重新发送这个包;
  • 此时客户端处于FIN_WAIT1状态;

第二次挥手

  • 服务端收到FIN数据包之后,向客户端发送确认包(ACK = 1,ack = u+1),把客户端的序列号值+1作为ACK报文的序列号值,表明已经收到客户端的报文了;
  • 这时服务端告诉客户端:我知道你要断开了,但是我还有数据没有发送完,等发送完所有数据就进行第三次挥手;
  • 此时服务端处理CLOSE_WAIT状态,客户端处理FIN_WAIT2状态;

第三次挥手

  • 服务端向客户端发送FIN数据包(FIN = 1,seq = w),且指定一个序列号,以及确认包(ACK = 1,ack = u+1),用来停止向客户端发送数据;
  • 这个动作是告诉客户端:我的数据也发送完了,不再给你发数据了;
  • 此时服务端处于LAST_ACK状态,客户端处理TIME_WAIT状态;

第四次挥手

  • 客户端收到FIN数据包之后,一样发送一个ACK报文作为应答,且把服务端的序列号值+1作为自己ACK报文的序列号值;
  • 此时客户端处理TIME_WAIT状态;
  • 需要过了一定时间(2MSL)以后,客户端发送确认包(ACK =1,ack = w+1),此时客户端才会进入CLOSE状态,以确保发送方的ACK可以到达接收方,防止已失效连接请求报文段出现在此连接中;

为什么需要等待2MSL

1.确保发送方发送的第四次挥手ACK报文可以到达接收方;
2.确保当前连接的所有报文都已经过期;

为什么TCP的挥手需要4次?

TCP是全双工模式,这就意味着,当客户端发出FIN报文段时,只是表示客户端已经没有数据要发送了,客户端告诉服务端,它的数据已经全部发送完毕;
但是,这个时候客户端还是可以接收来自服务端的数据,当服务端返回ACK报文段时,表示它已经知道客户端没有数据发送了,但服务端还是可以发送数据给客户端;当服务端也发送FIN报文段时,这个时候就表示服务端也没有数据要发送了,就会告诉客户端,我也没有数据要发送了,之后就中端此次TCP连接;

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值