计算机网络(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)快重传

(2)快恢复

快恢复算法的实现过程如图所示,作为对比,虚线为慢开始的处理过程。

注意: 发送方发送窗口的实际大小流量控制拥塞控制共同决定。
因此,当题目中同时出现接收端窗口(rwnd) 和拥塞窗口(cwnd) 时,发送方实际的发送窗口大小是由rwnd和cwnd中较小的那一个确定的。

参考链接:https://blog.csdn.net/weixin_43914604/article/details/104722679

计算机网络(1)TCP和UDP相关推荐

  1. 计算机网络 之 TCP和UDP的端口号解析

    前言:今天了解一下tcp和udp报文的端口.发现一直以来都只是知道端口用于区分同一IP的服务器的不同服务,已经端口的大小.在查找traceroute的资料的时候,才了解到一些之前没注意到的东西. (一 ...

  2. 计算机网络:TCP和UDP的对比

    1. 什么是TCP? TCP(Transmission Control Protocol,传输控制协议)是面向连接的.可靠的字节流服务,也就是说,在收发数据前,必须和对方建立可靠的连接.这一过程和打电 ...

  3. 宁波大学计算机网络,宁波大学计算机网络TCP与UDP题目

    波大计算机网络home work3 问题及解答: 1.端口(port)和套接字(socket)的区别是什么? 2.是否TCP和UDP都需要计算往返时间RTT? 3.在TCP传送数据时,有没有规定一个最 ...

  4. 温州大学计算机网络,数据通信与计算机网络(温州大学)实验四 - 运输层TCP和UDP协议分析.doc...

    温州大学 WENZHOU UNIVERSITY 实 验 报 告 学 期2016-2017学年第一学期课 程数据通信与计算机网络专 业电子信息科学与技术班 级14电科1学生姓名徐炜学 号14211111 ...

  5. 【计算机网络】比较TCP与UDP

    TCP vs UDP 计算机网络传输层有两种重要的协议:TCP和UDP. TCP提供了一种面向连接的可靠数据传输:UDP则提供了一种无连接的不可靠数据传输. 乍一看,我们选TCP不就完事了?何必使用U ...

  6. 计算机网络实验二抓包协议分析,计算机网络实验-使用Wireshark分析TCP和UDP协议...

    <计算机网络实验-使用Wireshark分析TCP和UDP协议>由会员分享,可在线阅读,更多相关<计算机网络实验-使用Wireshark分析TCP和UDP协议(6页珍藏版)>请 ...

  7. 的udp的接收端如何看速率_计算机网络 TCP与UDP

    本文记录了阅读<图解TCP/IP>的<TCP与UDP>章节的笔记. 一.传输层的作用 当IP协议根据IP地址发送数据到了目标计算机上,但是具体要发给哪个应用程序还没有确定.传输 ...

  8. 计算机网络实验 ——wireshark抓包简要分析TCP、UDP协议

    [计算机网络实验 --wireshark抓包简要分析TCP.UDP协议] (1)分析 TCPheader: Source Port:16bit源端口,数据发起者的端口号: Destination Po ...

  9. 【亡羊补牢】计算机网络灵魂之问 第8期 tcp和udp区别

    这是博主面向腾讯学习的面试题大整理系列,可以在如下github仓库Issues中通过 Labels 标签分类查看相关内容,同时欢迎大家指正可能的错误并且提出自己的解答,希望大家学的鱼块,春秋招顺利! ...

最新文章

  1. 通过设置Ionic-Cli代理解决ionic serve跨域调试问题
  2. linux消息队列非亲缘,linux进程
  3. Node.js的核心与红利
  4. 【python教程】IO文件操作的常见用法
  5. oracle date类型,oracle 日期时间数据类型
  6. Building JavaScript Games for Phones Tablets and Desktop(3)-创造一个游戏世界
  7. oracle rtrim(),Oracle ltrim() rtrim() 函数详细用法
  8. 全网最好懂的Spring AOP原理
  9. rust最低什么显卡能游戏_腐蚀Rust配置要求汇总 腐蚀Rust游戏配置要求是什么_游侠网...
  10. 运算符重载——关系运算符重载
  11. kafka计算机专业读法_终于知道Kafka为什么这么快了!
  12. PCL之点云分割算法概述
  13. 【bzoj1712】[Usaco2007 China]Summing Sums 加密 矩阵乘法
  14. Qt5.9生成一个Adroid的apk应用实例
  15. java 模板生成PDF文件 复选框勾选
  16. logback配置控制打印台异常信息_logback 如何配置让异常信息全部记录到日志,而不是只有异常的第一行?...
  17. 【IP协议(一)】——IP数据报格式及其含义,IP数据报的切分
  18. 手把手带你入门深度学习(一):保姆级Anaconda和PyTorch环境配置指南
  19. what is VC维
  20. 情感故事(我替新郎入了洞房)

热门文章

  1. 设计抗住千万级流量的架构思路(转)
  2. React Native工程修改Android包名
  3. TFS创建登录用户并连接TFS
  4. [转]在Windows中安装PhpUnit
  5. python timer 死掉_Python timer定时器两种常用方法解析 Python中如何在一段时间后停止程序...
  6. centos装java配件_CentOS安装JAVA
  7. 的正确使用_如何正确使用安全带 安全带正确系法
  8. 信息学奥赛一本通 2033:【例4.19】阶乘之和
  9. 信息学奥赛一本通 2070:【例2.13】数字对调
  10. 数列分块入门 4(LibreOj-6280)