计算机网络学习笔记 ---- TCP三次握手、四次挥手

1 TCP 三次握手与四次挥手面试题

1.1 TCP基础认识

1.1.1 头格式

在这里插入图片描述
序列号:在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题

确认应答号:指下一次「期望」收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。用来解决丢包的问题

控制位

· ACK:该位为 1 时,「确认应答」的字段变为有效,TCP 规定除了最初建立连接时的 SYN 包之外该位必须设置为 1 。
· RST:该位为 1 时,表示 TCP 连接中出现异常必须强制断开连接。
· SYN:该位为 1 时,表示希望建立连接,并在其「序列号」的字段进行序列号初始值的设定。
· FIN:该位为 1 时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换 FIN 位为 1 的 TCP 段。

1.1.2 什么是TCP?

TCP 是面向连接的可靠的、基于字节流的传输层通信协议。是一个工作在传输层的可靠数据传输的服务,它能确保接收端接收的网络包是无损坏无间隔非冗余按序的。

什么是连接:用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括 Socket、序列号和窗口大小称为连接。

建立一个 TCP 连接是需要客户端与服务端达成下面三个信息的共识。

Socket:由 IP 地址和端口号组成
序列号:用来解决乱序问题等
窗口大小:用来做流量控制

TCP四元组可唯一确定一个连接。
在这里插入图片描述

源地址和目的地址的字段(32 位)是在 IP 头部中,作用是通过 IP 协议发送报文给对方主机。

源端口和目的端口的字段(16 位)是在 TCP 头部中,作用是告诉 TCP 协议应该把报文发给哪个进程。

服务端通常固定在某个本地端口上监听,等待客户端的连接请求。
在这里插入图片描述

对 IPv4,客户端的 IP 数最多为 2 的 32 次方,客户端的端口数最多为 2 的 16 次方,也就是服务端单机最大 TCP 连接数,约为 2 的 48 次方。

服务端最大并发 TCP 连接数远不能达到理论上限,会受以下因素影响:

· 文件描述符限制,每个 TCP 连接都是一个文件,如果文件描述符被占满了,会发生 Too many open files。Linux 对可打开的文件描述符的数量分别作了三个方面的限制:
		· 系统级:当前系统可打开的最大数量,通过 cat /proc/sys/fs/file-max 查看;
		· 用户级:指定用户可打开的最大数量,通过 cat /etc/security/limits.conf 查看;
		· 进程级:单个进程可打开的最大数量,通过 cat /proc/sys/fs/nr_open 查看;
· 内存限制,每个 TCP 连接都要占用一定内存,操作系统的内存是有限的,如果内存资源被占满后,会发生 OOM。

1.1.3 TCP与UDP区别

UDP 不提供复杂的控制机制,利用 IP 提供面向「无连接」的通信服务。头部只有 8 个字节(64 位),UDP 的头部格式如下:
在这里插入图片描述

· 目标和源端口:主要是告诉 UDP 协议应该把报文发给哪个进程。
· 包长度:该字段保存了 UDP 首部的长度跟数据的长度之和。
· 校验和:校验和是为了提供可靠的 UDP 首部和数据而设计,防止收到在网络传输中受损的 UDP 包
  1. 连接

     TCP 是面向连接的传输层协议,传输数据前先要建立连接。
     UDP 是不需要连接,即刻传输数据。
    
  2. 服务对象

     TCP 是一对一的两点服务,即一条连接只有两个端点。
     UDP 支持一对一、一对多、多对多的交互通信
    
  3. 可靠性

     TCP 是可靠交付数据的,数据可以无差错、不丢失、不重复、按序到达。
     UDP 是尽最大努力交付,不保证可靠交付数据。但基于 UDP 传输协议实现一个可靠的传输协议,比如 QUIC 协议。
    
  4. 拥塞控制、流量控制

     TCP 有拥塞控制和流量控制机制,保证数据传输的安全性。
     UDP 则没有,即使网络非常拥堵了,也不会影响 UDP 的发送速率。
    
  5. 首部开销

     TCP 首部长度较长,会有一定的开销,首部在没有使用「选项」字段时是 20 个字节,如果使用了「选项」字段则会变长的。
     UDP 首部只有 8 个字节,并且是固定不变的,开销较小。
    
  6. 传输方式

     TCP 是流式传输,没有边界,但保证顺序和可靠。
     UDP 是一个包一个包的发送,是有边界的,但可能会丢包和乱序。
    
  7. 分片不同

     TCP 的数据大小如果大于 MSS 大小,则会在传输层进行分片,目标主机收到后,也同样在传输层组装 TCP 数据包,如果中途丢失了一个分片,只需要传输丢失的这个分片。
     
     UDP 的数据大小如果大于 MTU 大小,则会在 IP 层进行分片,目标主机收到后,在 IP 层组装完数据,接着再传给传输层。
    

应用场景的不同

由于 TCP 是面向连接,能保证数据的可靠性交付,因此经常用于:

· FTP 文件传输;
· HTTP / HTTPS;

由于 UDP 面向无连接,它可以随时发送数据,再加上 UDP 本身的处理既简单又高效,因此经常用于:

· 包总量较少的通信,如 DNS 、SNMP 等;
· 视频、音频等多媒体通信;
· 广播通信;

为什么 UDP 头部没有「首部长度」字段,而 TCP 头部有「首部长度」字段呢?

原因是 TCP 有可变长的「选项」字段,而 UDP 头部长度则是不会变化的,无需多一个字段去记录 UDP 的首部长度。

为什么 UDP 头部有「包长度」字段,而 TCP 头部则没有「包长度」字段呢?

在这里插入图片描述
其中 IP 总长度 和 IP 首部长度,在 IP 首部格式是已知的。TCP 首部长度,则是在 TCP 首部格式已知的,所以就可以求得 TCP 数据的长度。

至于UDP包长度字段:

第一种说法:因为为了网络设备硬件设计和处理方便,首部长度需要是 4 字节的整数倍。
如果去掉 UDP 的「包长度」字段,那 UDP 首部长度就不是 4 字节的整数倍了,可能是为了补全 UDP 首部长度是 4 字节的整数倍,才补充了「包长度」字段。

第二种说法:如今的 UDP 协议是基于 IP 协议发展的,而当年可能并非如此,依赖的可能是别的不提供自身报文长度或首部长度的网络层协议,因此 UDP 报文首部需要有长度字段以供计算。

1.1.4 TCP 和 UDP 可以使用同一个端口吗?

可以。

在数据链路层中,通过 MAC 地址来寻找局域网中的主机。
在网际层中,通过 IP 地址来寻找网络中互连的主机或路由器。
在传输层中,需要通过端口进行寻址,来识别同一计算机中同时通信的不同应用程序。

传输层的「端口号」的作用,是为了区分同一个主机上不同应用程序的数据包。

当主机收到数据包后,可以在 IP 包头的「协议号」字段知道该数据包是 TCP/UDP,所以可以根据这个信息确定送给哪个模块(TCP/UDP)处理,送给 TCP/UDP 模块的报文根据「端口号」确定送给哪个应用程序处理。因此,TCP/UDP 各自的端口号也相互独立,如 TCP 有一个 80 号端口,UDP 也可以有一个 80 号端口,二者并不冲突.

在这里插入图片描述

1.1.4.1 多个 TCP 服务进程可以绑定同一个端口吗?

如果两个 TCP 服务进程同时绑定IP 地址端口相同,那么执行 bind() 时候就会出错,错误是“Address already in use”。

如果两个 TCP 服务进程绑定的 IP 地址不同,而端口相同的话,是可以绑定成功的。

注意,如果 TCP 服务进程 A 绑定的地址是 0.0.0.0 和端口 8888,而如果 TCP 服务进程 B 绑定的地址是 192.168.1.100 地址(或者其他地址)和端口 8888,那么执行 bind() 时候也会出错。这是因为 0.0.0.0 地址比较特殊,代表任意地址,意味着绑定了 0.0.0.0 地址,相当于把主机上的所有 IP 地址都绑定了。

重启 TCP 服务进程时,为什么会有“Address in use”的报错信息?

当 TCP 服务进程重启时&

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Swing_zzZ

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

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

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

打赏作者

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

抵扣说明:

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

余额充值