什么是tcp/ip协议?UDP与TCP如何选择?

Linux服务器开发 专栏收录该内容
61 篇文章 4 订阅

大家好,

今天给大家分享一下

什么是tcp/ip协议?TCP的三次握手指的是什么,为什么一定要三次握手,而不是四次或者是两次?

 

1.背景介绍

先介绍下背景

TCP/IP是什么?

TCP/IP不是一个协议,而是一个协议族的统称。里面包括了IP协议,IMCP协议,TCP协议等等。同时是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。 TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。

 

2.知识剖析

先来看看今天的主角

TCP/IP协议的四层结构

请看图例

OSI七层参考模型TCP/IP四层的关系:

什么是tcp/ip协议?UDP与TCP如何选择?

 

数据包说明:

IP层传输单位是IP分组,属于点到点的传输;TCP层传输单位是TCP报文段,属于端到端的传输

什么是tcp/ip协议?UDP与TCP如何选择?

 

第一层:链路层

包括操作系统中的设备驱动程序、计算机中对应的网络接口卡

 

第二层:网络层

网络互连层是整个TCP/IP协议栈的核心。它的功能是把分组发往目标网络或主机。同时,为了尽快地发送分组,可能需要沿不同的路径同时进行分组传递。因此,分组到达的顺序和发送的顺序可能不同,这就需要上层必须对分组进行排序。     网络互连层定义了分组格式和协议,即IP协议(Internet Protocol)。  

特别注意:此时的IP包是不安全的,IP协议不会管送没送到

 

第三层:传输层

在TCP/IP模型中,传输层的功能是使远端主机和目标端主机上的对等实体可以进行会话。在传输层定义了两种服务质量不同的协议。即:传输控制协议TCP和用户

 

分享一个在腾讯课堂上tcp/ip的训练营的课程。
详情讲解了工作中 TCP、IP遇到的7大问题:
1. 滑动窗口如何实现?
2. sk_buff是什么?
3. TCP_NODELAY设置,抓包后是N个包?
4. Epoll 检测网络IO,水平触发与边沿触发如何判断?
5. 出现大量的close_wait如何解决?
6. DDOS?
7. UDP广播?

 需要了解的朋友可以加入到群里一起探讨技术交流

数据报协议UDP.

TCP协议是一个面向连接的、可靠的协议。它将一台主机发出的字节流无差错地发往互联网上的其他主机。在发送端, 它负责把上层传送下来的字节流分成报文段并传递给下层。在接收端,它负责把收到的报文进行重组后递交给上层。 TCP协议还要处理端到端的流量控制,以避免缓慢接收的接收方没有足够的缓冲区接收发送方发送的大量数据.

UDP协议是一个不可靠的、无连接协议,主要适用于不需要对报文进行排序和流量控制的场合。

 

第四层:应用层

TCP/IP模型将OSI参考模型中的会话层和表示层的功能合并到应用层实现。这一层主要的代表有DNS域名解析/http协议

运输层: tcp/udp

 

UDP特点

1.面向无连接。发送数据前不需要建立连接

2.尽最大努力交付。即不保证可靠交付

3. 面向报文。对于应用层交下来的报文,既不合并也不拆分,添加首部后直接交付给IP层

4.没有拥塞控制,网络出现拥塞不会使原主机发送速率降低,这对于某些实时应用是很重要的。tcp在网络拥塞时,依靠滑动窗口机制可以告诉发送方减缓发送速率

5.首部开销小,只有八个字节,比tcp的20个字节要短(20-60).

 

首部格式

利用首部格式可以较好的理解协议

什么是tcp/ip协议?UDP与TCP如何选择?

 

TCP主要特点

1.面向面向连接的运输层协议。应用程序在使用tcp协议之前,要先建立tcp连接,数据传输完毕后,也要释放连接。

应用程序间的通信像是,通话前要先拨号建立连接,通话结束后要挂机释放连接。

2. 提供可靠交付。无差错,不丢失,不重复,并按序到达。

3.采用全双工通信。通信双方在任何时候都可以发送和接受数据,且通信双方都设有发送缓存和接受缓存,用来临时存放双向通信的数据。

4.面向字节流。应用程序交下来的是数据块,但tcp把他们看成是无结构无意义的字节流

 

首部格式

利用首部格式可以较好的理解协议

什么是tcp/ip协议?UDP与TCP如何选择?

 

3.常见问题

如何建立TCP/IP连接

到达目标地址的IP包如何检验完整性

 

4.解决方案

 

建立TCP/IP的过程就是要讲的三次握手。

即三次握手就是为了解决连接的问题

建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。

 

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

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

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

IP包有固定的报文格式,报头有所需要参数

如:源端口、目标端口、确认序号和标志域等。

 

5.扩展思考

当短时间大量不存在的IP不断发送SYN包会出现什么情况

在三次握手过程中,Server发送SYN-ACK之后,收到Client的ACK之前的TCP连接称为半连接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。

Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。

SYN攻击是一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了

 

6.更多讨论

1.为什么一定要三次握手

当A想要建立连接时发送一个SYN,然后等待ACK,结果这个SYN因为网络问题没有及时到达B, 所以A在一段时间内没收到ACK后,再发送一个SYN,这次B顺利收到,接着A也收到ACK,这时A发送的第一个SYN终于到了B, 对于B来说这是一个新连接请求,然后B又为这个连接申请资源,返回ACK,然而这个SYN是个无效的请求,A收到这个SYN的ACK后也并不会理会它, 而B却不知道,B会一直为这个连接维持着资源,造成资源的浪费。

两次握手的问题在于服务器端不知道一个SYN是否是无效的,而三次握手机制因为客户端会给服务器回复第二次握手, 也意味着服务器会等待客户端的第三次握手,如果第三次握手迟迟不来,服务器便会认为这个SYN是无效的,释放相关资源。 但这时有个问题就是客户端完成第二次握手便认为连接已建立,而第三次握手可能在传输中丢失,服务端会认为连接是无效的, 这时如果Client端向Server写数据,Server端将以RST包响应,这时便感知到Server的错误。

总之,三次握手可以保证任何一次握手的失败都是可感知的,不会浪费资源

2.UDP作为不可靠的协议,是否一无是处?

udp也有它的用途,在某些对实时性要求较高的场景下,比如ip电话,某些即时战略游戏,视频直播等。

 

3.关于tcp的流量控制和拥塞控制实现?

这个比较复杂,但其实是基于滑动窗口实现的,接收方可以通知自己可用窗口的大小来让发送方调整发送速率等。

 

 

  • 0
    点赞
  • 0
    评论
  • 4
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值