计算机网络(1)TCP和UDP
计算机网络(1)TCP和UDP
常用的熟知端口号
应用程序 | FTP | TFTP | TELNET | SMTP | DNS | HTTP | SSH | MYSQL |
---|---|---|---|---|---|---|---|---|
熟知端口 | 21,20 | 69 | 23 | 25 | 53 | 80 | 22 | 3306 |
传输层协议 | TCP | UDP | TCP | TCP | UDP | TCP | TCP | TCP |
TCP和UDP作为传输层的两个协议。
1)TCP和UDP的区别
TCP:面向连接、可靠传输、传输字节流、传输效率慢、所需资源多、首部20-60字节、应用场景(如文件传输、邮件传输)
UDP:无连接、不可靠传输、传输报文、传输效率快、所需资源少、首部8字节,应用场景(qq语音、小文件传输等要求通信速度高)
针对面向连接理解:
TCP协议进行数据传输之前是要建立连接的,数据传送之后要断开连接
UDP协议进行数据传输之前不需要建立连接
关于TCP建立连接和断开连接可参考:https://blog.csdn.net/qzcsu/article/details/72861891
2)TCP的连接建立过程即3次握手
最开始的时候客户端和服务器都是处于CLOSED状态。主动打开连接的为客户端,被动打开连接的是服务器。
- 第一步:客户机的TCP首先向服务器的TCP发送一个连接请求报文段。这个特殊的报文段中不含应用层数据,其首部中的SYN标志位被置为1。另外,客户机会随机选择一个起始序号 seq= x(连接请求报文不携带数据,但要消耗一个序号)。
- 第二步:服务器的TCP收到连接请求报文段后,如同意建立连接,就向客户机发回确认,并为该TCP连接分配TCP缓存和变量。在确认报文段中,SYN和ACK位都被置为1,确认号字段的值为x+ 1, 并且服务器随机产生起始序号seq = y(确认报文不携带数据,但也要消耗-一个序号)。确认报文段同样不包含应用层数据。
- 第三步:当客户机收到确认报文段后,还要向服务器给出确认,并且也要给该连接分配缓存和变量。这个报文段的ACK标志位被置1,序号字段为x+1,确认号字段ack=y+ 1。该报文段可以携带数据,若不携带数据则不消耗序号。
成功进行以上三步后,就建立了TCP连接,接下来就可以传送应用层数据。 - SYN泛洪攻击:
为什么要三次握手:
三次握手的目的就是为了确认双方的发送和接收都是正常的。
第一次握手:Client 什么都不能确认;Server 确认了对方发送正常
第二次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己接收正常,对方发 送正常
第三次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己发送、接收正常, 对方发送接收正常
所以三次握手就能确认双发收发功能都正常,缺一不可
为什么TCP客户端最后还要发送一次确认呢?
一句话,主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。
如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。
如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。
3)TCP断开连接(四次挥手)
数据传输完毕后,双方都可释放连接。最开始的时候,客户端和服务器都是处于ESTABLISHED状态,然后客户端主动关闭,服务器被动关闭。
第一步:客户机打算关闭连接时,向其TCP发送一个连接释放报文段, 并停止发送数据,主动关闭TCP连接,该报文段的FIN标志位被置1,
seq=u, 它等于前面已传送过的数据的最后一个字节的序号加1
(FIN报文段即使不携带数据,也要消耗一个序号)。
TCP 是全双工的,即可以想象为一条TCP连接上有两条数据通路。
发送FIN报文时,发送FIN的一端不能再发送数据,即关闭了其中一条数据通路,但对方还可以发送数据。第二步:服务器收到连接释放报文段后即发出确认,
确认号是ack=u+ 1,而这个报文段自己的序号是v,等于它前面已传送过的数据的最后一个字节的序号加1
。
此时,从客户机到服务器这个方向的连接就释放了,TCP连接处于半关闭状态。
但服务器若发送数据,客户机仍要接收,即从服务器到客户机这个方向的连接并未关闭
。第三步:若服务器已经没有要向客户机发送的数据,就通知TCP释放连接,此时其
发出FIN= 1的连接释放报文段
。第四步:
客户机收到连接释放报文段后,必须发出确认
。在确认报文段中,ACK字段被置为1,确认号ack=w+1,序号seq=u+1.此时TCP连接还未释放,必须经过时间等待计时器设置的时间2MSL后,A才进入连接关闭状态
。
为什么客户端最后还要等2MSL
MSL(Maximum Segment Lifetime),TCP允许不同的实现可以设置不同的MSL值。第一,保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。
第二,防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。
为什么建立连接是三次握手,关闭连接是四次挥手呐?
建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。
而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。
如果已经建立了连接,但是客户端突然出现故障怎么办?
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
4)TCP和UDP的头部结构
序号字段的值指的是本报文段所发送的数据的第一个字节的序号。
确认号字段
是期望收到对方的下一个报文段的数据的第一个字节的序号
数据偏移(即首部长度)
紧急位URG
。URG= 1时,表明紧急指针字段有效。它告诉系统报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。但URG需要和紧急指针配套使用
,即数据从第一个字节到紧急指针所指字节
就是紧急数据
。
窗口字段
。它指出现在允许对方发送的数据量,接收方的数据缓存空间是有限的,因此用窗口值作为接收方让发送方设置其发送窗口的依据,
紧急指针字段
。占16 位,指出在本报文段中紧急数据共有多少字节(紧急数据放在本报文段数据的最前面)。
UDP头部
5)TCP的可靠传输体现在检验、序号、确认、重传
检验同UDP的检验
序号
确认
重传
6)TCP的流量控制和拥塞控制
流量控制
在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,这称为接收窗口rwnd
, 即调整TCP报文段首部中的“窗口”字段值
,来限制发送方向网络注入报文的速率。
发送方根据其对当前网络拥塞程序的估计而确定的窗口值,这称为拥塞窗口cwnd
,其大小与网络的带宽和时延密切相关。
例如
,在通信中,有效数据只从A发往B,而B仅向A发送确认报文,这时B可以通过设置确认报文段首部的窗口字段来将rwnd通知给A。- rwnd 即接收方允许连续接收的最大能力,单位是字节。
- 发送方A总是根据最新收到的rwnd值来限制自己发送窗口的大小,从而将未确认的数据量控制在rwnd大小之内,保证A不会使B的接收缓存溢出。
- 当然,
A的发送窗口的实际大小取rwnd和cwnd中的最小值
。
拥塞控制
拥塞控制
是让网络能够承受现有的网络负荷,是一个全局性的过程,涉及所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。流量控制
往往是指点对点的通信量的控制,即接收端控制发送端,它所要做的是抑制发送端发送数据的速率,以便使接收端来得及接收。
(1)慢开始与拥塞避免
(1)慢开始算法
- 在TCP刚刚连接好并开始发送TCP报文段时,先令拥塞窗口cwnd= 1,即一个最大报文段长度MSS.每收到一个对新报文段的确认后,将cwnd加1,即增大一个 MSS.用这样的方法逐步增大发送方的拥塞窗口cwnd,可使分组注入网络的速率更加合理。
例如,A向B发送数据,发送时A的拥塞窗口为2,那么A一次可以发送两个TCP报文段,经过一个RTT后(也称一个
传输轮次
),A收到B对刚才两个报文的确认,于是把拥塞窗口调整为4,下一次发送时就可一次发送4个报文段。
- 使用慢开始算法后,每经过一个传输轮次(即往返时延RTT),拥塞窗口cwnd就会加倍,即cwnd的大小指数式增长。这样,慢开始一直把拥塞窗口cwnd增大到一个规定的
慢开始门限ssthresh(阈值)
,然后改用拥塞避免算法
。
(2)拥塞避免算法
- 拥塞避免算法的做法如下:发送端的拥塞窗口cwnd每经过- -一个往返时延RTT就增加一个MSS的大小,而不是加倍,使cwnd按线性规律缓慢增长(即加法增大),而当出现一次超时(网络拥塞)时,令慢开始门限ssthresh等于当前cwnd的一半(即乘法减小)。
- 根据cwnd的大小执行不同的算法,可归纳如下:
●当cwnd < ssthresh时,使用慢开始算法。
●当 cwnd > ssthresh时,停止使用慢开始算法而改用拥塞避免算法。
●当cwnd = sthresh时,既可使用慢开始算法,又可使用拥塞避免算法(通常做法)。
(3)网络拥塞的处理
- 网络出现拥塞时,无论是在慢开始阶段还是在拥塞避免阶段,只要发送方检测到超时事件的发生(未按时收到确认,重传计时器超时),就要把慢开始门限ssthresh设置为出现拥塞时的发送方的cwnd值的一半(但不能小于2)。
然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。这样做的目的是迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完。 - 拥塞避免并不能完全能避免拥塞。利用以上措施要完全避免网络拥塞是不可能的。
拥塞避免是指在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。
在慢开始和拥塞避免算法中使用了
“乘法减小”和“加法增大”方法
。
“乘法减小”
是指不论是在慢开始阶段还是在拥塞避免阶段,只要出现一次超时(即很可能出现了网络拥塞),就把慢开始门限值ssthresh设置为当前拥塞窗口值的一半。网络频繁出现拥塞时,ssthresh 值就下降得很快,以大大减少注入网络的分组数。“加法增大”
是指执行拥塞避免算法后,在收到对所有报文段的确认后(即经过一个 RTT),就把拥塞窗口cwnd增加一个MSS大小,使拥塞窗口缓慢
增大,以防止网络过早出现拥塞。
(2)快重传和快恢复
快重传和快恢复算法是对慢开始和拥塞避免算法的改进。
(1)快重传
快恢复算法
的原理如下:- 发送端收到连续三个冗余ACK (即重复确认)时,执行
“乘法减小”算法
,把慢开始门限ssthresh 设置为出现拥塞时发送方cwnd的一半。 - 与慢开始(慢开始算法将拥塞窗口cwnd设置为1)的
不同之处
是,它把cwnd的值设置为慢开始门限ssthresh改变后的数值,然后开始执行拥塞避免算法(“ 加法增大”)
,使拥塞窗口缓慢地线性增大。 由于跳过了cwnd从1起始的慢开始过程,所以被称为快恢复
。
快恢复算法的实现过程如图所示,作为对比,虚线为慢开始的处理过程。
- 在
流量控制
中,发送方发送数据的量由接收方决定,而在拥塞控制
中,则由发送方自己通过检测网络状况来决定。 - 实际上,
慢开始、拥塞避免、快重传和快恢复几种算法
应是同时应用在拥塞控制机制之中的 - 当发送方检测到超时的时候,就采用慢开始和拥塞避免,
- 当发送方接收到冗余ACK时,就采用快重传和快恢复。
注意:
发送方发送窗口的实际大小
由流量控制
和拥塞控制
共同决定。
因此,当题目中同时出现接收端窗口(rwnd) 和拥塞窗口(cwnd) 时,发送方实际的发送窗口大小是由rwnd和cwnd中较小的那一个确定的。
参考链接:https://blog.csdn.net/weixin_43914604/article/details/104722679
计算机网络(1)TCP和UDP相关推荐
- 计算机网络 之 TCP和UDP的端口号解析
前言:今天了解一下tcp和udp报文的端口.发现一直以来都只是知道端口用于区分同一IP的服务器的不同服务,已经端口的大小.在查找traceroute的资料的时候,才了解到一些之前没注意到的东西. (一 ...
- 计算机网络:TCP和UDP的对比
1. 什么是TCP? TCP(Transmission Control Protocol,传输控制协议)是面向连接的.可靠的字节流服务,也就是说,在收发数据前,必须和对方建立可靠的连接.这一过程和打电 ...
- 宁波大学计算机网络,宁波大学计算机网络TCP与UDP题目
波大计算机网络home work3 问题及解答: 1.端口(port)和套接字(socket)的区别是什么? 2.是否TCP和UDP都需要计算往返时间RTT? 3.在TCP传送数据时,有没有规定一个最 ...
- 温州大学计算机网络,数据通信与计算机网络(温州大学)实验四 - 运输层TCP和UDP协议分析.doc...
温州大学 WENZHOU UNIVERSITY 实 验 报 告 学 期2016-2017学年第一学期课 程数据通信与计算机网络专 业电子信息科学与技术班 级14电科1学生姓名徐炜学 号14211111 ...
- 【计算机网络】比较TCP与UDP
TCP vs UDP 计算机网络传输层有两种重要的协议:TCP和UDP. TCP提供了一种面向连接的可靠数据传输:UDP则提供了一种无连接的不可靠数据传输. 乍一看,我们选TCP不就完事了?何必使用U ...
- 计算机网络实验二抓包协议分析,计算机网络实验-使用Wireshark分析TCP和UDP协议...
<计算机网络实验-使用Wireshark分析TCP和UDP协议>由会员分享,可在线阅读,更多相关<计算机网络实验-使用Wireshark分析TCP和UDP协议(6页珍藏版)>请 ...
- 的udp的接收端如何看速率_计算机网络 TCP与UDP
本文记录了阅读<图解TCP/IP>的<TCP与UDP>章节的笔记. 一.传输层的作用 当IP协议根据IP地址发送数据到了目标计算机上,但是具体要发给哪个应用程序还没有确定.传输 ...
- 计算机网络实验 ——wireshark抓包简要分析TCP、UDP协议
[计算机网络实验 --wireshark抓包简要分析TCP.UDP协议] (1)分析 TCPheader: Source Port:16bit源端口,数据发起者的端口号: Destination Po ...
- 【亡羊补牢】计算机网络灵魂之问 第8期 tcp和udp区别
这是博主面向腾讯学习的面试题大整理系列,可以在如下github仓库Issues中通过 Labels 标签分类查看相关内容,同时欢迎大家指正可能的错误并且提出自己的解答,希望大家学的鱼块,春秋招顺利! ...
最新文章
- 通过设置Ionic-Cli代理解决ionic serve跨域调试问题
- linux消息队列非亲缘,linux进程
- Node.js的核心与红利
- 【python教程】IO文件操作的常见用法
- oracle date类型,oracle 日期时间数据类型
- Building JavaScript Games for Phones Tablets and Desktop(3)-创造一个游戏世界
- oracle rtrim(),Oracle ltrim() rtrim() 函数详细用法
- 全网最好懂的Spring AOP原理
- rust最低什么显卡能游戏_腐蚀Rust配置要求汇总 腐蚀Rust游戏配置要求是什么_游侠网...
- 运算符重载——关系运算符重载
- kafka计算机专业读法_终于知道Kafka为什么这么快了!
- PCL之点云分割算法概述
- 【bzoj1712】[Usaco2007 China]Summing Sums 加密 矩阵乘法
- Qt5.9生成一个Adroid的apk应用实例
- java 模板生成PDF文件 复选框勾选
- logback配置控制打印台异常信息_logback 如何配置让异常信息全部记录到日志,而不是只有异常的第一行?...
- 【IP协议(一)】——IP数据报格式及其含义,IP数据报的切分
- 手把手带你入门深度学习(一):保姆级Anaconda和PyTorch环境配置指南
- what is VC维
- 情感故事(我替新郎入了洞房)
热门文章
- 设计抗住千万级流量的架构思路(转)
- React Native工程修改Android包名
- TFS创建登录用户并连接TFS
- [转]在Windows中安装PhpUnit
- python timer 死掉_Python timer定时器两种常用方法解析 Python中如何在一段时间后停止程序...
- centos装java配件_CentOS安装JAVA
- 的正确使用_如何正确使用安全带 安全带正确系法
- 信息学奥赛一本通 2033:【例4.19】阶乘之和
- 信息学奥赛一本通 2070:【例2.13】数字对调
- 数列分块入门 4(LibreOj-6280)