【计算机网络】TCP协议与UDP协议

news/2024/5/18 14:26:49 标签: tcp/ip, udp, 网络

三次握手

图形展示

在这里插入图片描述

形象的比喻

在这里插入图片描述

为啥需要三次?

在这里插入图片描述
成功建立连接通道之后,客户端就和服务器进行数据传输了。在数据传输的过程中,客户端与服务器都是通过数据包进行传送。通过数据包进行传送就会产生一些问题。比如说传输过程中出现数据包丢失或者发送的数据包的顺序与接收的数据包的顺序不一样。
TCP/IP在数据传输过程中就起到了很不错的作用。
当客户端与服务器建立连接之后,TCP/IP协议就会建立一个发送缓冲,为每个字节创建一个序列号(起初建立的时候序列号从0开始)

  • 发送的内容会占用发送缓冲里的字节序列,发送的报文包括起始序列号和数据内容长度以及数据内容本身;接收端则回复ACK=序列号+长度=下一包的起始序列号;这样对于连续的数据包接收端只需要回复一个ACK即可。
  • 因此有这样的技术,对于数据就可以切割分块进行发送了。接收端只需要对发送报文里的序列号和长度对接收到的数据包进行重组(这样就解决了数据包接收乱序问题)
  • 如果有丢失的数据包,接收端只需要向发送端回复ACK的内容(即丢失数据包的起始序列号)让发送端重发即可

四次挥手

在这里插入图片描述
当客户端想要断开连接的时候,客户端就向服务端发送FIN包
客户端发送完成后进入等待状态FIN-WAIT-1(第一次挥手)
服务端接收到FIN包,就向客户端发送ACK包,服务端进入CLOSE-WAIT(第二次挥手)
但是此时客户端和服务单还可以接收和发送数据包。待服务端
发送完未发送的数据包给客户端后,再发送一个Fin包进入最后确认状态(第三次挥手)
接收到服务端发送过来的FIN包,客户端回复ACK包确认关闭连接后,客户端
进入延时等待关闭状态。而接收到客户端发过来ACK包的服务端时
直接关闭服务端的连接
为什么要延时等到关闭?
如果服务端没有接收到客户端发送过来的ACK时,就会继续发一个FIN包
此时客户端接收到FIN包后重新向服务端发送ACK包并刷新等待时间

客户UDP协议就直接将数据包进行打包经过网卡传输

TCP稳定可靠文件传输邮件传输网页浏览
UDP速度快(实时性强)域名查询电话视频直播

参考

B站


http://www.niftyadmin.cn/n/826772.html

相关文章

PAT A 1107 AC代码

考察并查集的题目 利用hobby来存储需要合并的元素 最后用Count统计根节点下的元素个数 ans1 ans2分别存储需要的答案 #include<iostream> #include<vector> #include<algorithm> using namespace std; int father[1001]; int Count[1001]{0}; vector<…

PAT A 1108 AC代码

坑很多 需要细致小心 #include<iostream> #include<vector> #include<algorithm> using namespace std; int main(){int N;double sum0;int Count0;cin>>N;for(int i0;i<N;i){bool legaltrue;string x;cin>>x;int countpoint0;int pos_point…

PAT A 1109 AC代码

注意结构体的cmp函数的写法 先将所有人在v1中排好序&#xff08;根据身高升序&#xff0c;同身高根据字母ASCLL码降序&#xff09;&#xff0c;实现v1中要先站位的人在后面 根据站行规则在v2[]中对应行插入结点&#xff0c;每插入一个&#xff0c;v1 pop_back()一个 #includ…

PAT A 1112 AC代码(记录好键的思路)

我认为此题应采取的算法思路为记录好键而不是记录坏键&#xff0c;因为只有检测为好键才肯定是好键&#xff0c;检测为坏键却可能在其他地方被确定为好键 如果记录坏键反而需要再加一个标记容器来辅助判断 注意一下对字符串首尾的处理情况 s1记录检测出的好键&#xff0c;s…

PAT A 1113 AC代码

用一个vector然后再sort一下 秒杀题 #include<iostream> #include<vector> #include<algorithm> using namespace std; vector<int> v; int N; int main(){cin>>N;for(int i0;i<N;i){int x;scanf("%d",&x);v.push_back(x);}s…

PAT A 1114 AC 代码

并查集题目 最好直接写好findfather()和Union()函数 sort函数不能排set #include<iostream> #include<vector> #include<set> #include<algorithm> using namespace std; struct node{int sets0;int area0; }Node[10000]; struct sum_node{int sum_…

PAT A 1116 AC 代码

熟记一下素数判断的写法 其余逻辑非常简单 #include<iostream> #include<set> #include<unordered_map> #include<math.h> using namespace std; unordered_map<int,string> award; set<int> checked; int isprime(int x){int K(int)sqr…

PAT A 1117 AC 代码

采用一个数组m记录每个距离出现的次数 &#xff08;有一个测试点应该使用了超过100000的非常大的数据&#xff0c;所以对于超大的数据直接用m[100001]计数&#xff0c;因为E小于等于N&#xff0c;考虑不到100001之上的各种情况&#xff0c;并且这个测试点最终答案好像等于N&am…