一看就懂的TCP、TCP&UDP、三次握手、四次挥手

什么是TCP

TCP是 TCP/IP 体系中的一个协议,运输层的主要协议。TCP是面向连接的,可靠的,面向字节流的通信协议

  • 面向连接
    就是说应用程序在使用TCP协议之前,必须先建立TCP连接。
    且每一条TCP连接只能有两个端点,一定是点对点(一对一)才能连接。
  • 可靠的
    TCP提供可靠交付的服务,不管网络链路中出现了怎样的变化,TCP都能
    无差错、不丢失、不重复并且按序到达。
  • 字节流
    TCP中的“流”指的是流入到进程或从进程流出的字节序列。
    如果应用进程传送到TCP缓存的数据块太长,TCP就可以把它划分短一些再传送。
什么是TCP连接

用于保证可靠交付和流量控制的一些状态信息,这些信息的组合包括Socket、序列号和窗口大小称为连接。

  • TCP连接的端点是个很抽象的套接字(Socket)
    套接字(socket) = IP地址 : 端口号
  • 每一条TCP连接唯一地被通信两端的两个端点确定
    TCP连接 : : = {socket1,socket2} = {(IP1:port1),(IP2:port2)}
  • 窗口大小:用来做流量控制
TCP报文段首部格式

在这里插入图片描述

  • 序列号 : 在建立连接时由计算机生成的随机数作为其初始值,通过SYN包传给接受端主机,每发送一次数据,就累加一次该数据字节数大小,用来解决网络乱序问题。
  • 确认应答号: 是期望收到对方下一个报文段的第一个数据字节的序号。发送端收到这个确认应答号以后可以认为在这个程序以前的数据都已经被正常接受,用来解决不丢包的问题。
  • 六个控制位
    1.紧急URG:当URG=1时,表明紧急指针字段有效。当URG置为1时,发送应用进程就告诉发送方的TCP有紧急的数据要传送,于是发送方TCP就把紧急数据插入到本报文段数据的最前面。
    2.确认ACK:仅当ACK=1时确认号字段才有效。TCP规定,在建立连接后所有传送的报文段都必须把ACK置为1。
    3.推送PSH:在数据包到达接收端以后,立即传送给应用程序,而不是在缓冲区中排队。
    4.复位RST:表示连接复位请求。用来复位那些产生错误的连接,也被用来拒绝错误和非法的数据包。
    5.同步SYN:该标志仅在三次握手建立TCP连接时有效。在三次握手期间,随着文件的交换和新连接的创建,可以看到更多的SYN标志被发送和接收。SYN置为1就表示这是一个连接请求或连接接受报文。
    6.终止FIN:用来释放一个连接。当FIN=1,表示此报文段的发送方的数据已发送完毕,并要求释放运输连接。
TCP&UDP
UDPTCP
无连接即刻传输面向连接的传输层协议
支持一对一、一对多、多对多一对一的两点服务
尽最大努力交付,不保证交付数据可靠交付、无差错、不丢失
没有拥塞控制有拥塞控制和流量控制
首部开销小首部开销大(首部长度较长)

应用场景

UDPTCP
DNS域名系统FTP文件传输
RIP路由信息协议HTTP超文本传送协议
SNMP简单网络管理协议SMTP简单邮件传送协议
NFS网络文件系统TELNET远程终端协议
三次握手

在这里插入图片描述
一开始客户端和服务器都处于CLOSE关闭状态,然后服务器进程优先创建传输控制块TCB,准备接收客户端请求,然后服务器就进入LISTEN监听状态。

  1. 客户端初始化一个序列号seq=x 置于TCP首部,同时将SYN标志位置为1,表示请求建立连接。将第一个SYN报文段发送给服务端(此时报文不含有应用层数据)之后进入SYN_SENT状态。
  2. 客户端收到SYN报文段后,首先服务端也初始化一个自己的序列号seq=y,置入TCP首部的序号中。其次把客户端的序列号+1 (x+1)填入TCP首部的确认应答号中,同时将SYN和ACK标志位置为1。最后把该报文段发送给客户端。(不包含应用层数据),之后服务端进入SYN_RCVD状态。
  3. 客户端收到服务端的报文后,向服务端回复最后一个应答报文,首先将ACK标志位置为1,其次确认应答号中填入服务端序号+1(y+1),最后将报文发送给服务端之后,都进入ESTABLISHED状态。(此次握手可以携带数据)
为什么要三次握手

首先我们要明白为什么要进行握手,TCP是面向连接的协议,通讯前必须先建立连接。其次那又问为什么是三次而不是两次或者四次,因为两次握手无法防止历史连接的建立,没办法保证双方的初始序列号都能被确认接收,造成双方资源浪费。那为什么不是四次,四次握手其实也能够可靠的同步双方的初始化序号,但是由于第二步和第三步可以优化成一步,所以就成了三次握手。三次握手就已经理论上最少可靠连接建立,所以不需要使用更多次通信次数。

四次挥手

在这里插入图片描述注(客户端主动关闭)

  • A的应用进程先向其TCP发出连接释放报文段,并停止发送数据主动关闭TCP连接,将终止控制位置为1 FIN=1,其序号seq=u,(它等于前面已传送过的数据的最后一个字节的序号加1)此时A进入FIN-WAIT-1(终止等待1)
  • B收到连接释放报文段后,即发出确认,确认号是ACK=u+1,自己的序号seq=v,然后B就进入CLOSE_WAIT(关闭状态)。此时A已经没有数据向B发送。但B若发送数据,A仍要接收。B到A方向的连接并未关闭这个状态还得持续一段时间。
  • A收到来自B的确认后,进入FIN-WAIT-2 状态,等待B发出的连接释放报文。
  • B若没有要向A发送的数据,其应用进程就通知TCP释放连接,这时B发出的连接释放报文 FIN=1 序号为w ,确认号ack=u+1,这时B就进入LAST_ACK(最后确认)状态,等待A的确认。
  • A在收到B的连接释放报文后,必须对此发出确认,在确认报文段中把ACK置为1,序号为u+1,确认号w+1。然后进入到TIME_WAIT(时间等待)状态。
  • A再经过时间等待计时器设置的时间2MSL后,A才进入CLOSED
为什么要有TIME-WAIT状态
  1. 保证连接正常关闭
    为了保证A发送的最后一个ACK报文能够到达B。因为这个有可能丢失,B收不到确认报文就会重发FIN+ACK报文,而A就能在2MSL中收到重传的FIN+ACK报文,接着A就重传一次确认,重新启动2MSL计时器,最后A和B都正常进入到CLOSED状态
  2. 防止旧链接的数据包
    防止已失效的连接请求报文段(例:被延迟的数据包)出现在本链接中。A发送完最后一个ACK报文段后,再经过2MSL,就可以使本链接持续时间内所产生的所有报文段都从网络中消失。这样就不会影响下一个新的连接中出现这种旧的连接请求段。
为什么 TIME_WAIT 等待的时间是 2MSL?

MSL 是 Maximum Segment Lifetime,报文最大生存时间,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。因为 TCP 报文基于是 IP 协议的,而 IP 头中有一个 TTL 字段,是 IP 数据报可以经过的最大路由数,每经过一个处理他的路由器此值就减 1,当此值为 0 则数据报将被丢弃,同时发送 ICMP 报文通知源主机。

MSL 与 TTL 的区别:MSL 的单位是时间,而 TTL 是经过路由跳数。所以 MSL 应该要大于等于 TTL 消耗为 0 的时间,以确保报文已被自然消亡。

TIME_WAIT 等待 2 倍的 MSL,比较合理的解释是:网络中可能存在来自发送方的数据包,当这些发送方的数据包被接收方处理后又会向对方发送响应,所以一来一回需要等待 2 倍的时间。

比如,如果被动关闭方没有收到断开连接的最后的 ACK 报文,就会触发超时重发 Fin 报文,另一方接收到 FIN 后,会重发 ACK 给被动关闭方, 一来一去正好 2 个 MSL。

2MSL 的时间是从客户端接收到 FIN 后发送 ACK 开始计时的。如果在 TIME-WAIT 时间内,因为客户端的 ACK 没有传输到服务端,客户端又接收到了服务端重发的 FIN 报文,那么 2MSL 时间将重新计时。

在 Linux 系统里 2MSL 默认是 60 秒,那么一个 MSL 也就是 30 秒。Linux 系统停留在 TIME_WAIT 的时间为固定的 60 秒。

其定义在 Linux 内核代码里的名称为 TCP_TIMEWAIT_LEN:

#define TCP_TIMEWAIT_LEN (60*HZ) /* how long to wait to destroy TIME-WAIT 
                                    state, about 60 seconds  */

如果要修改 TIME_WAIT 的时间长度,只能修改 Linux 内核代码里 TCP_TIMEWAIT_LEN 的值,并重新编译 Linux 内核。

TIME_WAIT 过多有什么危害?

过多的 TIME-WAIT 状态主要的危害有两种:

第一是内存资源占用;
第二是对端口资源的占用,一个 TCP 连接至少消耗一个本地端口;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值