TCP/IP协议栈

01、TCP/IP标准

  • TCP/IP:Transmission Control Protocol/Internet Protocol 传输控制协议/因特网互联协议

  • TCP/IP是一个协议栈,由众多的协议组成。TCP和IP是最重要的两个协议,所以用来作为协议栈的名字。

  • 最早的时候这个协议是在互联网上面使用,局域网里面使用的最广泛的是IPX、SPX协议。

以太网工作在数据链路层和物理层

02、TCP/IP 分层

03、TCP/IP 工作逻辑

数据包发送的时候,需要添加每层的头,对方收到之后再进行解封装

04、传输层

传输层的功能由两个协议实现:tcp和udp。可以实现可靠和快速通信

05、TCP/UDP

TCP
  • 可靠性高、性能低、

  • 面向连接、

  • 有序列的

  • 重传、

  • 半关闭(四次挥手)、

  • 确认机制(发一个包就确认一个包)、

  • 滑动窗口(根据网络情况控制数据包的发送,一次能处理多少数据包是变化的)、

  • 拥塞控制。

主要用于:邮件通信、文件共享、下载

UDP

  • 高性能、

  • 可靠性差、

  • 无序列的

主要用于:语音、视频通信、直播

06、TCP:传输控制协议

TCP特性

传输层协议、确认机制、全双工、面向连接

TCP包头结构
第一行: 源端口、目的端口(各占16位)
第二行: 序号,表示数据报文的编号
第三行: 确认号,确认对方发过来的包已收到
第四行:
数据偏移:表示头的长度。
URG、ACK、PSH、RST、SYN、FIN:TCP的6个状态标记位,重点:ACK、SYN、FIN
ACK:请求通信标记位
SYN:消息确认标记位
FIN:分手的状态标记位

07、TCP协议port

08、TCP端口号通信过程

三次握手
TCP协议位于 传输层,作用是 提供可靠的字节流服务,为了准确无误地将数据送达目的地,TCP协议采纳 三次握手策略。
三次握手的原理:
  • 第一次:客户端发送一个带有SYN(synchronize)标志的数据包给服务端

  • 第二次:服务端接收成功后,回传一个带有SYN/ACK标志的数据包传递确认信息,表示我收到了;

  • 第3次:客户端再回传一个带有ACK标志的数据包,表示我知道了,握手结束。

其中:SYN标志位数置1,表示建立TCP连接;ACK标志表示验证字段。

四次挥手
由于 TCP连接是全双工的,因此 每个方向都必须单独进行关闭原理是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动, 一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
四次挥手的原理
  • 第1次:客户端发送一个FIN,用来关闭客户端到服务端的数据传送,客户端进入FIN_WAIT_1状态;

  • 第2次:服务端收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),服务端进入CLOSE_WAIT状态

  • 第3次:服务端发送一个FIN,用来关闭服务端到客户端的数据传送,服务端进入LAST_ACK状态;

  • 第4次:客户端收到FIN后,客户端t进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,服务端进入CLOSED状态,完成四次挥手。

其中:FIN标志位数置1,表示断开TCP连接。

09、状态名词解释

LISTEN:等待从任何远端TCP 和端口的连接请求。
 
SYN_SENT:发送完一个连接请求后等待一个匹配的连接请求。
 
SYN_RECEIVED:发送连接请求并且接收到匹配的连接请求以后等待连接请求确认。
 
ESTABLISHED:表示一个打开的连接,接收到的数据可以被投递给用户。连接的数据传输阶段的正常状态。
 
FIN_WAIT_1:等待远端TCP 的连接终止请求,或者等待之前发送的连接终止请求的确认。
 
FIN_WAIT_2:等待远端TCP 的连接终止请求。
 
CLOSE_WAIT:等待本地用户的连接终止请求。
 
CLOSING:等待远端TCP 的连接终止请求确认。
 
LAST_ACK:等待先前发送给远端TCP 的连接终止请求的确认(包括它字节的连接终止请求的确认)
 
TIME_WAIT:等待足够的时间过去以确保远端TCP 接收到它的连接终止请求的确认。
TIME_WAIT 两个存在的理由:
          1.可靠的实现tcp全双工连接的终止;
          2.允许老的重复分节在网络中消逝。
 
CLOSED:不在连接状态(这是为方便描述假想的状态,实际不存在)

10、常见面试题

为什么TCP连接的时候是3次?2次不可以吗?

因为需要考虑连接时丢包的问题,如果只握手2次,第二次握手时如果服务端发给客户端的确认报文段丢失,此时服务端已经准备好了收发数(可以理解服务端已经连接成功)据,而客户端一直没收到服务端的确认报文,所以客户端就不知道服务端是否已经准备好了(可以理解为客户端未连接成功),这种情况下客户端不会给服务端发数据,也会忽略服务端发过来的数据。

如果是三次握手,即便发生丢包也不会有问题,比如如果第三次握手客户端发的确认ack报文丢失,服务端在一段时间内没有收到确认ack报文的话就会重新进行第二次握手,也就是服务端会重发SYN报文段,客户端收到重发的报文段后会再次给服务端发送确认ack报文。

为什么TCP连接的时候是3次,关闭的时候却是4次?

因为只有在客户端和服务端都没有数据要发送的时候才能断开TCP。而客户端发出FIN报文时只能保证客户端没有数据发了,服务端还有没有数据发客户端是不知道的。而服务端收到客户端的FIN报文后只能先回复客户端一个确认报文来告诉客户端我服务端已经收到你的FIN报文了,但我服务端还有一些数据没发完,等这些数据发完了服务端才能给客户端发FIN报文(所以不能一次性将确认报文和FIN报文发给客户端,就是这里多出来了一次)。

为什么客户端发出第四次挥手的确认报文后要等2MSL的时间才能释放TCP连接?

这里同样是要考虑丢包的问题,如果第四次挥手的报文丢失,服务端没收到确认ack报文就会重发第三次挥手的报文,这样报文一去一回最长时间就是2MSL,所以需要等这么长时间来确认服务端确实已经收到了。

如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP设有一个保活计时器,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值