TCP,UDP协议

 刚开始进入网络部分,首先需要了解协议是什么以及有哪些作用和各个协议的格式和约定等等的内容.为了方便和简化对协议的理解和介绍,本文先由简到难依次对 UDP,TCP,Http和Https协议做出较为详细的说明和比较.

1协议的作用

由于计算机之间的通信是通过网络来进行通信的.计算机通信时需要有内容的传输,为了规定咱们是如何建立连接和传输什么格式的内容,以及有各种各样的硬件厂商和操作系统,此时引入了协议,双方都按照协议来进行传输和建立连接,就避免了不同硬件和操作系统间无法传输内容的问题.
本文只介绍传输层TCP和UDP协议

2  UDP和TCP协议

2.1  UDP和TCP协议是什么

因为网络通信本身是一个极为复杂的过程在通信过程中我们可以人为的将网络通信划分为5个板块,组成TCP/IP协议簇.(TCP/IP协议簇有多重表示方式 7层 5层 4层) 本文这里介绍的是将该协议划分为4层时的一种情况.

TCP,UDP协议_第1张图片

       其中应用层一般是程序猿写代码进行一个项目内部规定的。传输层就是将应用层的数据进行出发点的目的地的规划,网络层就是具体规划出发点和目的地的传输路径了,数据链路层则是负责各个路由器节点直接的通信传输,物理就是咱们得光纤和路由器之类的.例如我是重庆的一个程序猿写了一个聊天室,我规定我传输的内容是一个加密字符串,然后我写代码将这个加密字符串发送到传输层此时就是应用层的作用. 传输层收到我发送的数据之后通过传输层协议看到我发送的数据目的地是南昌,然后传输层就将重庆到南昌这个行程告诉网络层,网络层就知道了,本次的出发地和目的地然后 ,就可以来规划我到底要怎么走才能从重庆去往南昌,是先由重庆到武汉在到南昌还是,由重庆先到长沙在到南昌,次时传输层就主要负责规划网络传输中具体的路线,规划好路线后,网络层就讲我要由重庆去长沙在到南昌的过程告诉数据链路层,然后数据链路层就知道了具体的路线,然后数据链路层就开始考虑我该怎么从重庆去往长沙,是做汽车还是高铁,以及到长沙了该怎么去往南昌,是飞机还是火车,此时数据链路层就具体负责了通信时各个节点的传输情况,最后都规划好以后物理层也就是咱们具体的交通工具了,在网络传输中也就是光纤和路由器等等了.

在查阅相关资料文献后,大部分将TCP/IP协议簇划分为了4个部分,其中将上述过程的数据链路层和物理层进行了结合,结合后名字有多种(我也不清楚怎么叫才正确)大体的叫法为链路层,或者网络接口层,物理接口层.

        而本来要介绍的UDP和TCP协议则是传输层中要遵守的协议。

下图也能很好的形容TCP与UDP的差别(网图看着好看拿的 有侵权就删了)

TCP,UDP协议_第2张图片

2.2 UDP协议和TCP协议的特点

(这里暂时先做一个简单的介绍,后面要是有时间的话 ,单独写一个模块详解TCP协议和UDP协议,以及用socket手搓一个小服务器出来)

UDP协议是数据传输层的协议其特点为

  • 无连接
  • 面向数据报
  • 不可靠传输
  • 大小受限

TCP协议也是数据传输层的协议其特点是

  • 有连接
  • 面向字节流
  • 可靠传输
  • 全双工传输

因为TCP建立连接的过程较为复杂所以此处先由UDP协议开始介绍.

2.2.1  UDP 无连接

无连接指的就是咱们在通信的过程中不会建立连接,就是只要我知道了你的ip地址我就可以给你发一条请求过来.而不需要经过你的同意.

2.2.2  UDP 面向数据报

UDP协议在发送数据请求的过程中,发送的数据格式是一个一个的报文,此过程被称为面向数据报.

2.2.3  UDP 不可靠传输

不可靠传输是建立在无连接的情况下的,大概可以表述为就是我通过UDP协议发送了一条信息过后要是该条信息在传输过程中意外丢失了,或者这条信息因为某种原因对面并没有接收,此时站在我也就是发送方的角度来讲,我是并不知情的,也就是并不清楚对方是否收到了我发送的信息,这也被称为不可靠传输.但也因为这个机制,所以UDP协议的传输速度远远大于TCP的可靠传输的速度.

2.2.4 UDP 大小受限 

UDP在传输过程中只能传输有限的数据量,因为这个特性UDP协议通常用来传输比较小的数据.

3 TCP协议

因为TCP协议比较复杂,所以单独设立一个板块.

3.1 TCP 协议建立连接的过程 (三次握手 四次挥手)

在上文中提到了TCP协议的一个特点为有连接协议,所以如何建立连接是我们要掌握的一大难点,同时也是面试最常见的一个问题就是TCP建立连接的过程,也被称为三次握手,四次挥手,为什么要这样命名现在来进行解释.

首先,在了解TCP建立连接的过程中我们需要先对TCP的请求头有个初步了解,下图为TCP协议的请求基本格式(取自网络)

TCP,UDP协议_第3张图片

三次握手(建立连接)

在建立连接的过程中,首先是客户端发送SYN包主动去找服务端,服务端接收到相应的SYN包之后会返回给客户端一个ACK包来确定自己收到了此次请求,同时服务端又会像客户端发送相应的SYN包,客户端收到SYN包之后返回服务端一个ACK,即连接建立的过程完成.

第一次客户端发送SYN请求找服务端,说明我需要建立连接,(因为TCP确认应答的机制)然后服务端收到我的请求后,返回一个ACK说明我们可以进行建立连接了,同时客户端发送SYN请求后并且收到了ACK应答报文,当前客户端具有发送请求和接收请求的能力,但此时站在服务端的角度来讲我只是收到了SYN请求并且发送了一个ACK应答报文回去 ,但我此时并不知道对方收到我的ACK应答报文没,我只知道目前我的能接受请求,所以此时服务端又主动发起SYN请求来确定客户端是否收到我刚发送的请求,然后客户端返回一个ACK确认应答表明我能接受到请求.此时建立连接的过程就完成了.TCP,UDP协议_第4张图片

上述过程中进行了4次通信,为什么还被称为3次握手呢?

原因是第一次客户端收到SYN请求后 返回一个ACK确认应答,同时服务端又会向客户端发送SYN请求为了节省网络资源 服务器会讲确认应答的ACK和下一次发送的SYN请求和并到一起发送

(上图TCP协议的请求头里面

这个部分每个部分都是一个字节,要是对应部分的二进制位为1则表示当前请求携带相应的包和数据,0则表示没有.)一起发送的话表名当前请求 里面的ACK和SYN标志位均为1

所以TCP建立连接的过程可以进行4次握手,但是会浪费网络资源,为了简化就改为了三次握手.

上述过程不难看出,三次握手的过程可以保证传输路径的通畅性,例如在我们平时生活中,在每天地铁工作前都会有一般试运行的地铁来行走一圈以确保当前地铁的通畅运行,这里TCP协议建立连接过程也是如此 在建立连接的过程中通过三次握手来确保建立的连接是畅通的,同时在三次握手的过程中,可以协商参数的传递。

讲完上述三次握手的过程接下来是四次挥手的过程

四次挥手(断开连接)

TCP协议为什么是四次挥手 改为三次挥手可以吗.

TCP四次挥手的过程和三次握手的过程类似。一般有客户端主动发起请求,(服务端也存在主动发起请求的可能但非常小,但三次握手一定是客户端主动发起的请求),客户端向服务器发送带有FIN标志位的请求,同时服务器收到请求后,又发送带有FIN标志位的请求给客户端,客户端返回一个ACK确认应答过后,此时就能正常的断开连接了,

TCP,UDP协议_第5张图片

这里的四次挥手,其中客户端也是发送的ACK和FIN报文 ,此时能将四次挥手改为三次挥手吗?

答案是 基本不能(极少数情况有可能可以)  原因也很简单,因为三次握手建立连接的过程是内核中完成的,不需要我们手动去控制,但是客户端释放连接,是需要主动调用socket.close()方法的所以在大部分的情况下,服务端发送的ACK和FIN请求不在同一个时间段内,所以没办法将标志位合并为同一个请求.所以四次挥手不能改为三次挥手.

不想写了,下一篇博客继续

你可能感兴趣的:(网络协议,java,网络)