【计网】TCP的三次握手和四次挥手
来源:互联网 发布:淘宝少女前线初始号 编辑:程序博客网 时间:2024/05/16 18:27
昨天被360的笔试虐到了。。。= =。。。。辣么多道C++。。。。引号还不能好好打,用中文的,我还以为选项是错的。。TAT
不过考了几道前端题也发现TCP的过程还是不大了解。。这么经典的题目。。
几个字段:
SYN(synchronize)=> 在创建连接的时候用
ACK(acknowledge number)=> 用于确认序号
SEQ(sequence number)=> 用于识别序号
FIN => 在结束连接的时候发送(没找到全称。。。)
TCP的报文分成两块,头部块和数据块。头部一般是20字节(UDP的头部是八个字节),包含了源端口号,目的端口号和其他的字段。传送数据的大小一般根据本地的最大链路层帧长度(就是看网络层最多能传输的数据大小,MSS)。如果传输的数据比较大,TCP会把它分成data_size/(每个报文携带的数据大小)这么多个报文段发送,并且会为每个报文分配相应的序号来使对方可以识别顺序。由于接收方(B)需要根据先后收到的数据来把文件拼接起来,所以判断报文的顺序很重要。
在传输的时候,对于任何一端,ACK表示自己要发送的数据的对应序号,SEQ表示期望从对方那里收到的序号。
上图客户端发送序号为42的数据,等待序号为79的数据。服务器返回序号为79的数据,并且刚刚收到了序号为42的数据,所及期待序号问43的数据。
这样来回来确认自己收到的数据是有序的。
在这个基础上来看TCP连接刚刚建立的时候。
三次握手:(isn是起始的序号)
TCP的三次握手的报文是特殊的报文,成为SYN报文。因为要建立连接,所以头部的SYN字段设为1,并且发送客户端的起始序号ACK(随机选取,减少和之前的连接序号冲撞)。服务器接收到后同意建立连接,就把他的报文头部的SYN设为1,返回服务器端的起始序号ACK(随机),并且返回客户端的ACK+1,表示期望接收下一个数据。客户端收到之后,就把SYN设为0,确认服务器刚刚发送的报文。
四次挥手:
任意一方都可以关闭连接,要把报文报头的FIN字段设为1表示要关闭连接,另一方收到了就发送ACK报文表示确认,然后再发送一个FIN报文(FIN设为1)表示自己要关闭连接了,然后初始方再发送ACK报文表示自己知道对方关闭了。
为什么需要三次握手:
因为如果在第一次请求的时候延时了或者丢包了,后来可能包又发送到了服务器上,服务器就发送SYN报文,开启连接了。然而这时候客户端又不需要这个连接了,会导致服务器的这个连接无响应,浪费资源
为什么需要四次挥手:
在A发送FIN给B后,B表示收到了关闭连接,如果这个时候B的资源还没有传送完成,可以继续发送。发送结束后,像A发送FIN报文,表示自己要关闭连接了。如果只有三次,在最后B发送FIN的时候丢包了,A就不知道B是否关闭了,这样连接就不安全。因此A还要发送一个ACK确认报文确认自己知道了对方要关闭。这样双方都可以关闭连接了。B在等待A最后的ACK报文,如果超时了就重传FIN报文,来保证A知道了B要关闭连接。
- 【计网】TCP的三次握手和四次挥手
- 【计网】TCP的三次握手及四次挥手详解
- TCP的三次握手和四次挥手
- TCP的三次握手和四次挥手
- TCP的三次握手和四次挥手
- TCP的三次握手和四次挥手
- TCP的三次握手和四次挥手
- TCP的三次握手和四次挥手
- tcp的三次握手和四次挥手
- TCP的三次握手和四次挥手
- TCP的三次握手和四次挥手
- TCP的三次握手和四次挥手
- TCP的三次握手和四次挥手
- TCP的三次握手和四次挥手
- TCP的三次握手和四次挥手
- TCP的三次握手和四次挥手
- TCP的三次握手和四次挥手
- TCP的三次握手和四次挥手
- ubuntu下搭建nfs服务器
- Code Forces 652D Nested Segments(离散化+树状数组)
- PHP常用正则表达式汇总
- 干货分享:让你分分钟学会 javascript 闭包
- 闪回归档:
- 【计网】TCP的三次握手和四次挥手
- Android App 沉浸式状态栏解决方案
- http://www.codeceo.com/article/8-java-search-engine.html
- MFC工程上创建SOUI环境并生成一个窗口
- 苦逼程序猿的求职经历
- SVN——版本控制,团队合作
- 树状数组
- Code Forces 149DColoring Brackets(区间DP)
- 【注意事项】