TCP特性

1、工作在传输层

2、面向连接的协议

3、全双工协议

4、半关闭

5、错误检查

6、将数据打包成段,排序

7、确认机制

8、数据恢复、重传

9、流量控制、滑动窗口

10、拥塞控制,慢启动和拥塞避免算法

常见端口号

http80 https443 ftp20/21 dns53 tftp69

smtp25 pop110 imap143 telnet23 ssh 22

mysql3306 oracle1521

三次握手

————————————————

当一台主机(客户端)想要通过TCP协议向另一台主机(服务器)发送数据时,需要建立三次握手

第一次握手,客户端主动打开TCP连接通道,发送TCP请求报文,在该报文中SYN(同步位,代表连接请求或连接请求的接受报文)置为1,seq(序列号)为随机数x。

第一次握手过程中,客户端由CLOSED状态,即没有任何连接的状态,变为SYN-SENT状态,即发送连接请求后等待匹配的连接请求状态。代表请求连接,不会传输数据。

第二次握手,当服务器端收到了TCP连接请求(即SYN置为1的报文。注:此处应该是不携带ACK为1的报文),服务器被动打开连接通道,根据服务器自身策略向客户端发送TCP回复报文,在该报文中SYN置为1,ACK(确认位,置为1代表确认,置为0代表...代表不确认呗)置为1,ack(确认序列号)为TCP请求报文中的seq+1即x+1,seq(序列号)为另一个随机数y。

在第二次握手过程中,服务器在收到TCP请求报文时,被动的由CLOSED状态与LISTEN状态变为SYN-RECEIVED状态,即收到和发送一个连接请求后等待对方对连接请求确认的状态,同时准备好缓存空间以及一些涉及到的变量。代表允许连接,不会传输数据。

第三次握手,当客户端收到服务器的TCP连接请求的回复报文后,会向服务器端发送一个报文携带ACK置为1,ack为TCP连接请求的回复报文中seq+1即y+1,seq为最开始的x+1,也就是TCP连接请求的回复报文中ack的值,SYN置为0。

在第三次握手过程中,当客户端收到了TCP连接请求的回复报文(允许连接)时,客户端由SYN-SENT状态变为ESTAB-LISHEN状态,代表一个打开的连接,同时客户端为TCP连接准备好缓存空间以及一些涉及到的变量。该报文代表向服务器端确认的确认报文,可以携带数据。

————————————————

LISTEN:侦听来自远方的TCP端口的连接请求

SYN-SENT:再发送连接请求后等待匹配的连接请求(客户端)

SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认(服务器)

ESTABLISHED:代表一个打开的连接

FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认

FIN-WAIT-2:从远程TCP等待连接中断请求

CLOSE-WAIT:等待从本地用户发来的连接中断请求

CLOSING:等待远程TCP对连接中断的确认

LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认

TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认

CLOSED:没有任何连接状态

四次挥手

————————————————

参与一条TCP连接的两个“进程”中的任何一个都能终止该连接,连接结束后,主机中的“资源”(缓存和变量)都将被释放。

第一次挥手,客户端向服务器发送关闭连接请求报文,即连接释放报文,关闭TCP连接,该报文中FIN(结束位)置为1,seq置为u(报文段第一个字节的序号,可以标识这个报文段)。

在第一次挥手过程中,客户端由ESTABLISHED状态变为FIN-WAIT-1,等待远程TCP连接中断请求,或先前的连接中断请求的确认。此时客户端已经释放了发送连接。

第二次挥手,服务端收到客户端发送的关闭请求,回复一个确认报文段,该确认报文中ACK置为1,ack为u+1,seq为v(最后一个TCP数据报文中的最后一个字节+1)。

在第二次挥手过程中,服务器由ESTABLISHED状态变为CLOSE-WAIT状态,等待足够的时间以确保远程TCP接收到连接中断请求的确认。此时服务器端释放了接受连接。由于客户端关闭了发送连接,服务器端关闭了接受连接,所有此时整个TCP连接处于一种半关闭状态。

第三次挥手,服务器发送确认关闭报文后需要向客户端发送一个释放连接报文,关闭TCP发送连接,由于是释放连接报文,所以FIN置为1,ACK置为1,ack为u+1(由于上一挥手报文也是由服务器发送,所有客户端等待的报文需要有ACK位,同时确认号依旧为上一个报文的确认号),

最新文章

  1. Python: 处理mongodb文档,怎么让UTC时间转换为本地时间?
  2. java中switch、while、do...while、for
  3. 02Spring_Ioc和DI介绍
  4. webstorm添加vue插件支持
  5. ul+li标签制作表格
  6. Slip.js(移动端跟随手指滑动组件,零依赖)
  7. 获取某个Group中所有对象的DisplayName
  8. string(Integer)类的equals和==区别和联系(验证密码的时候用得到)
  9. js_day14
  10. Keil C51编译及连接技术
  11. 基于Visual C++2013拆解世界五百强面试题--题2-输出和为一个给定整数的所有组合
  12. Codeforces Round #277 (Div. 2) 题解
  13. .htaccess重写URL讲解
  14. 本人开发的JavaWeb急速框架Blast上线了
  15. 吐血记录微信小程序授权获取Unionid及linux下使用bouncycastle解密用户数据 遇到的坑
  16. iOS里的crc校验问题
  17. 谷歌、火狐浏览器 缩放为80% 时,margin值才正确
  18. JavaScript -- Window-Resize
  19. WEB服务器搭建–IIS
  20. tornado-简单的服务器非阻塞

热门文章

  1. FAQ Selenium中提示can not connect to the service chromedriver 的解决方法
  2. javaWeb03-请求转发和请求重定向【包含浏览器与响应编码格式不一致的解决方法】
  3. Javaweb-Tomcat(安装+配置环境)
  4. C语言的输入格式
  5. TCP/IP协议(1): IP 地址和寻址方式 —— IP 协议的基础
  6. [NOIP2018 提高组] 保卫王国
  7. js循环判断创建新对象放数组中
  8. PostgreSQL的10进制与16进制互转
  9. 模拟浏览器与服务器交互(简易TomCat框架)
  10. 支持管道、重定向、*匹配的miniShell