Contents
  1. 1. 三次握手 四次挥手
    1. 1.1. TCP三次握手四次挥手中的状态位
  2. 2. OSI计算机网络通信架构
  3. 3. 功能和原理
  4. 4. TCP与UDP区别总结:
  5. 5. TCP与UDP的区别与适用场景
  6. 6. 长连接、短连接
  7. 7. 阻塞控制
  8. 8. 重传机制

车神干货简练
https://www.zhihu.com/question/51074319

https://www.cnblogs.com/roverliang/p/5176456.html

https://zhuanlan.zhihu.com/p/21957820

  • TCP为了维护连续请求数据的有序性,SYN链接的时候随机本地生成一个 seq=x,后续第二次seq=x+1,第三次seq=x+2,这样可以发现是否有数据丢失了。

三次握手 四次挥手

seq:请求序列号,AB之间交互,每次都有随机的一个序列号,确认号就是请求号+1
ack:请求确认号,用来标志回应的是哪一个请求,ack=seq+1
SYN:请求连接,完整握手只有2次,A请求连接B,B请求连接A,SYN=1,其他的时候SYN=0
ACK:确认码,同意或者拒绝连接
FIN:请求断开连接,和SYN相反

  • 三次握手:客户端向服务端发起请求,服务端确认收到请求确认是否能接收,客户端确认能接收并反馈给服务端。通信通道建立。 socket.connect()
    A –> B, seq=x,SYN=1,A请求和服务器B进行连接,并发送请求序列号x
    B –> A, ACK=1,ack=x+1,SYN=1,seq=y, B收到并同意A的链接x请求,确认码是x+1,;然后服务器B请求和A进行连接,SYN=1.请求码是y
    A –> B, ACK=1,ack=y+1,seq=x+1;A同意B的编号为y的链接请求,并标志该次的序列号为x+1

  • 发送消息 发送之后服务器会发送确认已经收到。2个数据包。 socket.send()

  • 四次挥手:客户端向服务端发起断开请求,服务端确认收到请求并且把缓存的数据全部返回给客户端,服务端发送同意终止,客户端收到2次请求后确认断开并告知服务器 socket.close()
    A –> B, seq=x,FIN=1,A请求和服务器B断开连接,并发送请求序列号x
    B –> A, ACK=1,ack=x+1,seq=u, B同意seq为x的断开请求
    B –> A, FIN=1,seq=v,ack=x+1,B请求和A断开连接,请求码v,这是针对seq为x的断开连接的最终同意
    A –> B, ACK=1,ack=v+1,seq=x+1,A确认收到了B的通知,再见

    TCP三次握手四次挥手中的状态位

    https://zhuanlan.zhihu.com/p/22095090

  • LISTEN: Server监听在知名端口上,等待远端连接请求的抵达;
  • SYN_SENT:Client(主动方)发起TCP同步,等待对端返回ACK;
  • SYN_RECV:收到对端的SYN包,返回SYN+ACK,等待对端ACK;
  • ESTABLISHED:Client(主动方)发送完三次握手的ACK后,进入到此状态;Server(被动方)在接收ACK后,进入此状态;两者的差异

四次挥手

  • FIN_WAIT_1:客户端应用主动断开连接(发送FIN),等待对端ACK
  • CLOSE_WAIT:服务器收到FIN,响应ACK,等待本机应用断开连接;
  • FIN_WAIT_2:客户端收到ACK,等待远端应用断开连接(FIN);
  • LAST_ACK: 服务器本机应用断开连接(发送FIN),等待ACK;
  • TIME_WAIT: 客户端收到FIN,响应ACK,等待2*MSL;(解决ACK丢失的情况,有时间再发送一次ACK,此时该IP的端口号被占用,不能用作新的连接)
  • CLOSING: 同时关闭时出现
  • CLOSED: 连接关闭

OSI计算机网络通信架构

OSI模型把网络通信的工作分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

  • 应用层:面向用户的一层,比如用户上网(http协议)、用户发邮件(SMTP)协议
  • 表示层:数据格式转化、加密(比如编码格式、加密操作)
  • 会话层:负责建立、管理和终止表示层实体之间的通信会话。该层的通信由不同设备中的应用程序之间的服务请求和响应组成。
  • 传输层:建立了主机端到端的链,端就是端口,TCP UDP就是这一层
  • 网络层:本层通过IP寻址来建立两个节点之间的连接,为源端的运输层送来的分组,选择合适的路由和交换节点,正确无误地按照地址传送给目的端的运输层
  • 数据链路层 :字节、比特、流转换
  • 物理层:物理介质相关

功能和原理

提供数据可靠完整(TCP)且在全球局域网(IP)中数据传输的机制。
封装了Scoket接口来实现TCP/UPD传输。
TCP属于传输层,提供可靠的字节流服务,将大块数据分割成以报文段(segment)为单位的数据包进行管理。TCP 协议为了更容易传送大数据才把数据分割,而且 TCP 协议能够确认数据最终是否送达到对方。

TCP与UDP区别总结:

http://blog.csdn.net/xiaobangkuaipao/article/details/76793702

  • TCP面向连接(如打电话要先拨号建立连接)确认信号互相通畅;UDP是无连接的,即发送数据之前不需要建立连接

  • TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达,发送有个确认的过程;UDP尽最大努力交付,即不保证可靠交付

  • Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。

  • UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。

  • 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信

  • TCP对系统资源要求较多,UDP对系统资源要求较少。

TCP与UDP的区别与适用场景

  • TCP协议栈本身是可靠,不会丢包,不会乱序,失败会重发。UDP需要应用层做协议来保证可靠性。视频可以用UDP。
  • 必须使用udp的场景:广播。

长连接、短连接

  • http1.0默认短连接,每次交互都需要三次握手收到消息后四次挥手,而且加载 js、css文件的时候也要重新重复创建链接。http1.1支持设置允许长连接。

  • 长连接:连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接(一个TCP连接通道多个读写通信); 这就要求长连接在没有数据通信时,定时发送数据包(心跳),以维持连接状态;

  • 长连接多用于操作频繁(读写),点对点的通讯,而且连接数不能太多情况。一般web请求都是短链接,游戏都是长连接,QQ

阻塞控制

为了保护Server端的带宽,TCP采用了滑动窗口机制,由server动态调整窗口容量,分批确认,从而实现控流,发送方和接收方各有一个活动窗口缓存,为了准备重传。
控流方式:

  • 慢启动:启动时限制可发送包大小,然后指数增长到阈值,ack确认一个增长一些,再线性增长,防止一连接就大量包
  • Nagle算法:发送端缓存满一个ack包时再发送,避免小包
  • Cork算法:当滑动窗口值小于某值时,停止发送,一直到接收端调整到该阈值时才允许发送

重传机制

  • 超时重传(超过一段时间未收到ack的话,再一定次数范围内不停的重传)
  • 快速重传 当接收方收到的数据包是不正常的序列号,那么接收方会重复把应该收到的那一条ACK重复发送,这个时候,如果发送方收到连续3条的同一个序列号的ACK,那么就会启动快速重传机制,把这个ACK对应的发送包重新发送一次。
  • 选择重传(通过报文记录信息补发丢失的包)
Contents
  1. 1. 三次握手 四次挥手
    1. 1.1. TCP三次握手四次挥手中的状态位
  2. 2. OSI计算机网络通信架构
  3. 3. 功能和原理
  4. 4. TCP与UDP区别总结:
  5. 5. TCP与UDP的区别与适用场景
  6. 6. 长连接、短连接
  7. 7. 阻塞控制
  8. 8. 重传机制