传输层协议

目录

前言

传输层

TCP 协议介绍

TCP三次握手

TCP四次挥手

UDP协议介绍

 1.UDP协议介绍

常见协议及其端口


前言

一、传输层

传输层是OSI参考模型中的第四层,传输层协议为网络端点主机上的进程之间提供了可靠、有效的报文传送服务。

传输层的服务一般要经历传输连接建立阶段,数据传送阶段,传输连接释放阶段3个阶段才算完成一个完整的服务过程。

而在数据传送阶段又分为一般数据传送和加速数据传送两种形式。

传输层中最为常见的两个协议分别是传输控制协议(TCP)和用户数据报协议(UDP)。

传输层提供逻辑连接的建立、传输层寻址、数据传输、传输连接释放、流量控制、拥塞控制、多路复用和解复用、崩溃恢复等服务。

二、TCP 协议

2.1 TCP协议

TCP是全面连接、可靠的进程到进程通信的协议。
TCP提供全双工的服务,数据在同一时间双向传输。
每个TCP都有发送缓存数据和接收数据,用于临时储存数据的功能。

特性:1、工作在传输层 ;2、面向连接协议; 3、全双工协议; 4、半关闭; 5、错误检查;

 6、将数据打包成段,排序;7、确认机制数据恢复,重传;8、流量控制,滑动窗口

2.2 TCP 报文格式 

TCP报文段的首部


1.源端口号(16):发送方进程的端口号(0~65535)
2.目标端口号(16):接受端进程的端口号(0~65535)
分片,编号。发送端为每个字节进行编号,便于接收端正确重组

3.序号(32):Seq序号,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。

4.确认号(32):Ack序号对发送端的确认信息,确定两台主机目前在什么状态,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1


5.首部长度(4):确定TCP首部数据结构的字节长度,20字节到60字节。
6.保留(6) (空白)


7.控制位:
URG:紧急位。紧急指针有效位
ACK确认位。(已经连接状态)(只有当ACK=1时,确认序列号字段才有效:当ACK=0时,确认号字段无效
PSH:急迫位。标志位为1时,要求接收方尽快将数据段送达应用层。
RST:重置位。当RST为1时,通知重新建议TCP连接。
SYN同步(连接)位。同步序号位,TCP需要建立连接时将这个值设为1。当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1,带SYN标志的TCP报文段称为同步报文段
FIN断开位。当TCP完成数据传输需要断开连接时,提出断开连接的一方将这个值设为1.


8.窗口大小:说明本地可接收数据段的数目。这个值得大小是可变的,当网络通畅时接收端相应消息会会将这个窗口值变大以加快传输速度,当网络不稳定时减小这个值可保证网络数据的可靠传输,TCP中的流量控制机制就是依靠变化窗口的大小实现的。
比如下载速度从一开始的几KB逐渐提升到几MB的过程。
9.校验和:用来做差错控制。字段检验的范围包括首部和数据这两部分,数据段在发送时和到达目的地时会进行校验和计算,若这两次的校验和一致,则说明数据基本是正确的,否则将认为该数据已被破坏,接收端将丢弃该数据。
10.紧急指针:和URG配合使用,当URG=1时有效。
11.选项:在TCP首部可以有多达40字节的可选信息,例如,最大报文段长度MSS(MaximumSegment Size)。MSS告诉对方TCP:我的缓存所能接收的报文段的数据字段的最大长度是MSS个字

2.3 TCP三次握手

建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发。

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接.

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

SYN:同步序列编号(Synchronize Sequence Numbers)

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

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

三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。实质上其实就是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息。

刚开始客户端处于 Closed 的状态,服务端处于 Listen 状态。
进行三次握手:

第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN。此时客户端处于 SYN_SENT 状态。

首部的同步位SYN=1,初始序号seq=x,SYN=1的报文段不能携带数据,但要消耗掉一个序号。

第二次握手:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(s)。同时会把客户端的 ISN + 1 作为ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_RCVD 的状态。

在确认报文段中SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y。

第三次握手:客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 ESTABLISHED 状态。服务器收到 ACK 报文之后,也处于 ESTABLISHED 状态,此时,双方已建立起了连接。

确认报文段ACK=1,确认号ack=y+1,序号seq=x+1(初始为seq=x,第二个报文段所以要+1),ACK报文段可以携带数据,不携带数据则不消耗序号。

发送第一个SYN的一端将执行主动打开(active open),接收这个SYN并发回下一个SYN的另一端执行被动打开(passive open)。

在socket编程中,客户端执行connect()时,将触发三次握手。

1.1 为什么需要三次握手,两次不行吗?
弄清这个问题,我们需要先弄明白三次握手的目的是什么,能不能只用两次握手来达到同样的目的。

第一次握手:客户端发送网络包,服务端收到了。
这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。
第二次握手:服务端发包,客户端收到了。
这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。
第三次握手:客户端发包,服务端收到了。
这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。
因此,需要三次握手才能确认双方的接收与发送能力是否正常。

试想如果是用两次握手,则会出现下面这种情况:

如客户端发出连接请求,但因连接请求报文丢失而未收到确认,于是客户端再重传一次连接请求。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接,客户端共发出了两个连接请求报文段,其中第一个丢失,第二个到达了服务端,但是第一个丢失的报文段只是在某些网络结点长时间滞留了,延误到连接释放以后的某个时间才到达服务端,此时服务端误认为客户端又发出一次新的连接请求,于是就向客户端发出确认报文段,同意建立连接,不采用三次握手,只要服务端发出确认,就建立新的连接了,此时客户端忽略服务端发来的确认,也不发送数据,则服务端一致等待客户端发送数据,浪费资源。

1.2 什么是半连接队列?
服务器第一次收到客户端的 SYN 之后,就会处于 SYN_RCVD 状态,此时双方还没有完全建立其连接,服务器会把此种状态下请求连接放在一个队列里,我们把这种队列称之为半连接队列。

当然还有一个全连接队列,就是已经完成三次握手,建立起连接的就会放在全连接队列中。如果队列满了就有可能会出现丢包现象。

这里在补充一点关于SYN-ACK 重传次数的问题:
服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传。如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。
注意,每次重传等待的时间不一定相同,一般会是指数增长,例如间隔时间为 1s,2s,4s,8s…

1.3 ISN(Initial Sequence Number)是固定的吗?
当一端为建立连接而发送它的SYN时,它为连接选择一个初始序号。ISN随时间而变化,因此每个连接都将具有不同的ISN。ISN可以看作是一个32比特的计数器,每4ms加1 。这样选择序号的目的在于防止在网络中被延迟的分组在以后又被传送,而导致某个连接的一方对它做错误的解释。

三次握手的其中一个重要功能是客户端和服务端交换 ISN(Initial Sequence Number),以便让对方知道接下来接收数据的时候如何按序列号组装数据。如果 ISN 是固定的,攻击者很容易猜出后续的确认号,因此 ISN 是动态生成的。
 

2.4TCP四次挥手

当我们的应用程序不需要数据通信了,就会发起断开 TCP 连接。建立一个连接需要三次握手,而终止一个连接需要经过四次挥手。

第一次挥手。客户端发起 FIN 包(FIN = 1),客户端进入 FIN_WAIT_1 状态。TCP 规定,即使 FIN 包不携带数据,也要消耗一个序号。

第二次挥手。服务器端收到 FIN 包,发出确认包 ACK(ack = u + 1),并带上自己的序号 seq=v,服务器端进入了 CLOSE_WAIT状态。这个时候客户端已经没有数据要发送了,不过服务器端有数据发送的话,客户端依然需要接收。客户端接收到服务器端发送的ACK 后,进入了 FIN_WAIT_2 状态。

第三次挥手。服务器端数据发送完毕后,向客户端发送 FIN 包(seq=w ack=u+1),半连接状态下服务器可能又发送了一些数据,假设发送 seq 为 w。服务器此时进入了LAST_ACK 状态。

第四次挥手。客户端收到服务器的 FIN 包后,发出确认包(ACK=1,ack=w+1),此时客户端就进入了 TIME_WAIT 状态。注意此时 TCP 连接还没有释放,必须经过 2*MSL后,才进入 CLOSED 状态。而服务器端收到客户端的确认包 ACK 后就进入了 CLOSED状态,可以看出服务器端结束 TCP 连接的时间要比客户端早一些。

为什么建立连接握手三次,关闭连接时需要是四次呢?

答:其实在 TCP 握手的时候,接收端发送SYN+ACK 的包是将一个 ACK 和一个 SYN 合并到一个包中,所以减少了一次包的发送,三次完成握手。

对于四次挥手,因为 TCP 是全双工通信,在主动关闭方发送 FIN 包后,接收端可能还要发送数据,不能立即关闭服务器端到客户端的数据通道,所以也就不能将服务器端的 FIN 包与对客户端的ACK 包合并发送,只能先确认 ACK,然后服务器待无需发送数据时再发送 FIN 包,所以四次挥手时必须是四次数据包的交互。
 

三、UDP协议介绍

2.1 UDP协议


无连接、不保证可靠性的协议,它的可靠性由上一层协议来保证。
数据传输时能实现最小的开支。

UDP特性:1、工作在传输层;2、提供不可靠的网络访问;3、非面向连接协议;

                   4、有限的错误检查;5、传输效率高;6、无数据恢复特性。


 2.2 UDP报文段格式


各字段的含义:
1. 源端口号:标识数据发送端的进程,和tcp的端口号类似。
2. 目标端口号:标识数据接收端的进程,和tcp的端口号类似。
3. UDP长度:指UDP的总长度(首部+数据)。
4. 校验和:对UDP数据的差错查验,计算同TCP的校验类似。是UDP提供的唯一可靠机制。

2.3 TCP和UDP的区别

UDPTCP
是否连接无连接面向连接
是否可靠不可靠传输,不使用流量控制和拥塞控制可靠传输,使用流量控制和拥塞控制
连接对象个数
支持一对一。一对多,多对一和多对多交互通信
只能是一对一通信
传输方式面向报文面向字节流
首部开销首部开销小,仅8字节首部最小20字节,最大60字节
适用场景适用于实时应用(IP电话、视频会议、直播等)适用于要求可靠传输的应用,例如文件传输

 四、常见协议及其端口

协议端口说明
 FTP20 21(TCP)FTP服务器所放开的控制端口
SSH22(TCP)用远程登陆,远程控制管理目标计算机(密文)
TELNET23(TCP)用远程登陆,远程控制管理目标计算机(明文)
SMTP25(TCP)SMTP服务器开端口,用于发送邮件
HTTP80(TCP)超文本传输协议
HTTPS443(TCP)加密的超文本传输协议
DNS53(TCP、UDP)域名解析协议,将IP地址转化成域名
DHCP67/68(UDP)动态主机配置协议        
TFTP69(UDP)简单文件传输协议
RPC111(UDP)远程传输调用
NTP123(UDP)网络传输协议

注:端口号(来区别两个系统之间的进程):

客户端根据需要的服务,从而发送到特定的目的端口

端口划分为三个类别,其范围介于1到65,535之间。

  • 公认端口(服务端用):

约定,不会轻易改变(iana组织)

与通用网络应用程序相关联的目的端口称为公认端口这些端口的范围从0~1023。

  • 注册端口:

端口1024~49151可作为源端口或目的端口使用。组织可使用这些端口注册即时消息等应用程序。

  • 私有端口(客户机用):

端口4915~65535通常作为源端口使用。

总结:服务端端口号小且固定不变;客户端的端口号随机生成,大(上万)且不固定。

服务端通常会默认开启监听状态(开启一个监听进程),当需要为别人提供服务时,就会提供/开启应用满足他人需求。

pid号:

(系统当中 每打开一个进程会配 pid(系统中的编号,方便管理)),区别不了两系统间的进程.

只要运行一程序,系统会自动分配一个标识。

暂时唯一:进程中止后,这个号码就会被回收,并可能被分配给另一个新进程。

只要没有成功运行其他程序,这个PID会继续分配给当前要运行的程序。

如果成功运行一个程序,然后再运行别的程序时,系统会自动分配另一个PID

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值