6、传输层-TCP-UDP协议

参考推荐:

TCP/IP 详解卷一 - TCP_思翊的博客-CSDN博客

TCP协议和UDP协议_udp协议和tcp协议_仟各的博客-CSDN博客

UDP协议详解_yunfan188的博客-CSDN博客

TCP的MSS的计算与详解_tcp mss_林哥小站的博客-CSDN博客


目录

TCP协议

UDP协议

端口号


TCP协议

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的通信协议。简单来说TCP就是有确认机制的UDP协议,每发出一个数据包都要求确认,如果有一个数据包丢失,就收不到确认,发送方就必须重发这个数据包。为了保证传输的可靠性,TCP协议在UDP基础之上建立了三次对话的确认机制,即在正式收发数据前,必须和对方建立可靠的连接。TCP数据包和UDP一样,都是由首部和数据两部分组成,唯一不同的是,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。

传输层的主要工作是定义端口,标识应用程序身份,实现端口到端口的通信,TCP协议可以保证数据传输的可靠性

TCP 用于应用程序之间的通信。当应用程序希望通过 TCP 与另一个应用程序通信时,它会发送一个通信请求。这个请求必须被送到一个确切的地址。在双方“握手”之后,TCP 将在两个应用程序之间建立一个全双工 (full-duplex) 的通信。

这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。

1、TCP段首部格式?

TCP段首部的定长部分为20个字节,即5个单位的长度。

  • 源端口16位,作用是标识报文的返回地址。
  • 目的端口:16位,指明报文接收计算机上的应用程序地址接口。
  • 序号:32位,指出段中的数据部分在发送方数据流中的位置。
  • 确认号:32位,指出接收方希望收到对方下次发送的数据的第一个字节的序号
  • 首部长度(数据偏移):4位,包括TCP头大小,指示何处数据开始。
  • 保留:6位,这些位必须是0。为了将来定义新的用途而保留。
  • CWR:压缩标志,CWR与后面的 ECE 标志都用于 IP 首部的 ECN 字段,当ECE = 1 时,则通知对方已将拥塞窗口缩小。
  • ECE:拥塞标志,当ECE= 1 则会通知对方,从对方到这边的网络有阻塞。
  • URG位:紧急标志,和紧急指针配合使用,当其为1时表示,此报文要尽快传送。
  • ACK位:确认标志,和确认号字段配合使用,当ACK位置为1时,确认号字段有效。
  • PSH位:为推送标志,置1时,发送方将立即发送缓冲区的数据。
  • RST位:复位标志,置1时,表明有严重差错,必须释放连接。
  • SYN位:同步标志,置1时,表示请求建立连接。
  • FIN位:终止标志,置1时,表明数据已经发送完,请求释放连接。
  • 窗口大小:16位,用于向对方通告当前本机的接收缓冲区的大小。
  • 校验和:16位,校验范围包括段首部、数据以及伪首部。
  • 紧急指针:16位,指向后面是优先数据的字节,在URG标志设置了时才有效。如果URG标志没有被设置,紧急域作为填充。加快处理标示为紧急的数据段。
  • 选项:长度不定,但长度必须为1个字节。如果没有选项就表示这个1字节的域为0。
  • 数据:该TCP协议包负载的数据。

2、TCP连接的建立过程?三次握手?

1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=X,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。

2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=X+1,随机产生一个值seq=Y,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

3)第三次握手:Client收到确认后,检查ack是否为X+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=Y+1,并将该数据包发送给Server,Server检查ack是否为Y+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

3、TCP连接的关闭过程?四次挥手?

建立连接的过程是三方握手,而关闭连接通常需要4个段(四次握手),服务器的应答和关闭连接请求通常不合并在一个段中,因为有连接半关闭的情况,这种情况下客户端关闭连接之后就不能再发送数据给服务器了,但是服务器还可以发送数据给客户端,直到服务器也关闭连接为止。

1)Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

2)Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。

3)Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

4)Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

4、为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

  • 保证TCP协议的全双工连接能够可靠关闭;
  • 保证这次连接的重复数据段从网络中消失。

5、SYN攻击

在三次握手过程中,Server发送SYN-ACK之后,收到Client的ACK之前的TCP连接称为半连接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将产时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态并且源IP地址是随机的,则可以断定遭到SYN攻击了,使用如下命令查看:

#netstat -nap | grep SYN_RECV

6、TCP协议特点

  • TCP是面向连接的运输层协议;
  • 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的;
  • TCP提供可靠交付的服务;
  • TCP提供全双工通信:数据在两个方向上独立的进行传输,因此,连接的每一端必须保持每个方向上的传输数据序号;
  • 面向字节流:面向字节流的含义:虽然应用程序和TCP交互是一次一个数据块,但TCP把应用程序交下来的数据仅仅是一连串的无结构的字节流。

UDP协议

UDP(User Datagram Protocol,用户数据报协议)定义了端口,同一个主机上的每个应用程序需要指定唯一的端口号,并且规定网络中传输的数据包必须加上端口信息,当数据包到达主机以后,就可以根据端口号找到对应的应用程序了。UDP协议比较简单,实现容易;但UDP协议没有确认机制不面向连接,也不保证传输的可靠性,数据包一旦发出,无法知道对方是否收到,因此可靠性较差,为了解决这个问题,提高网络可靠性,TCP协议就诞生了。UDP 和 TCP 很相似,但是更简单,同时可靠性低于 TCP。

1、UDP首部格式

  • UDP首部有8个字节,由4个字段构成,每个字段都是两个字节,

源端口号:16位,需要对方回信时选用,不需要时全部置0;

目的端口号:16位,在终点交付报文的时候需要用到;

长度:16位,UDP的数据报的长度(包括首部和数据)其最小值为8(只有首部);

校验和:16位,检测UDP数据报在传输中是否有错,有错则丢弃,该字段是可选的,当源主机不想计算校验和,则直接令该字段全为0。

当传输层从IP层收到UDP数据报时,就根据首部中的目的端口,把UDP数据报通过相应的端口,上交给应用进程。

2、UDP校验和

在计算校验和的时候,需要在UDP数据报之前增加12字节的伪首部,伪首部并不是UDP真正的首部。只是在计算校验和,临时添加在UDP数据报的前面,得到一个临时的UDP数据报。校验和就是按照这个临时的UDP数据报计算的。

伪首部既不向下传送也不向上递交,而仅仅是为了计算校验和。这样的校验和,既检查了UDP数据报,又对IP数据报的源IP地址和目的IP地址进行了检验。

UDP伪首部结构和TCP的伪首部相同,只不过UDP伪首部的协议字段值为17,而TCP为6,下图为UDP用户数据报的格式和伪首部:

UDP校验和的计算方法和IP数据报首部校验和的计算方法相似,都使用二进制反码运算求和再取反,但不同的是:IP数据报的校验和之检验IP数据报和首部,但UDP的校验和是把首部和数据部分一起校验。

发送方,首先是把全零放入校验和字段并且添加伪首部,然后把UDP数据报看成是由许多16位的子串连接起来,若UDP数据报的数据部分不是偶数个字节,则要在数据部分末尾增加一个全零字节(此字节不发送),接下来就按照二进制反码计算出这些16位字的和。将此和的二进制反码写入校验和字段。在接收方,把收到得UDP数据报加上伪首部(如果不为偶数个字节,还需要补上全零字节)后,按二进制反码计算出这些16位字的和。当无差错时其结果全为1,。否则就表明有差错出现,接收方应该丢弃这个UDP数据报。

3、UDP协议特点

UDP主要特点如下:

  • UDP是无连接的:发送数据之前不需要建立连接(当然,发送数据结束时也没有连接可释放),因此减少了开销和发送数据之前的时延
  • UDP 尽最大努力交付:不保证可靠交付,因此主机不需要维护复杂的连接状态表。所有维护传输可靠性的工作需要用户在应用层来完成。没有TCP的确认机制、重传机制。
  • UDP是面向报文的:发送方的 UDP对应用层交下来的报文,添加首部后直接向下交付为IP层,既不合并,也不拆分,保留这些报文的边界。
  • UDP没有拥塞控制:应用层能够更好的控制要发送的数据和发送时间,网络中的拥塞控制也不会影响主机的发送速率。某些实时应用(如:IP电话、实时视频会议等)要求以稳定的速度发送,在网络出现拥塞时能容忍一些数据的丢失,但是不能允许有较大的时延(比如实时视频,直播等)
  • 分组首部开销小,TCP首部20字节,UDP首部8字节。
  • UDP 支持一对一、一对多、多对一和多对多的交互通信。
  • UDP大小受限:UDP协议首部中有一个16位的最大长度,也就是说一个UDP能传输的数据的最大长度是64K(包含了UDP的首部)。也就是说UDP无法直接表示一个比较大的数据报。

端口号

数据链路和 IP 中的地址,分别指的是 MAC 地址和 IP 地址。前者用来识别同一链路中不同的计算机,后者用来识别 TCP/IP 网络中互连的主机和路由器。在传输层也有这种类似于地址的概念,那就是端口号。

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

通过IP地址可以确定一台主机,但是这个主机上运行同时运行着很多的程序,比如 qq、浏览器。当这个主机收到一个具体的数据的时候,那么它怎么知道要把这个数据交给哪个程序来处理?就是通过端口号来区分。

每个访问网络的进程都需要有一个不同的端口号,比如MySQL默认的端口号 3306。端口号是一个整数(2个字节,一共16比特位,取值范围0~65535)。

一台主机上,不能有两个进程尝试关联(绑定)同一个端口号。如果第一个进程绑定了端口号 1102,第二个进程也尝试绑定这个端口号 1102的时候,就会失败。

源端口号:发送方的端口号;

目的端口号:接收方的端口号。

详细端口号可搜索:常见端口号。

注:

如有错误、侵权,请联系作者更改删除!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三九笔墨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值