TCP:传输控制协议。是一种面向连接的协议,提供可靠的双全工的字节流,TCP套接口是流套接口的一种,关心确认、超时和重传等具体细节。

TCP提供客户和服务器连接,跨该连接与服务器交互数据。提供可靠的双全工的字节流,TCP必须跟踪每个方向数据流的状态信息,

TCP提供可靠性,当TCP向另一端发送数据时,要求另一端返回确认。TCP不是100%可靠,它提供的是数据的可靠投递或故障的可靠通知。

TCP通过给所发送数据的每一个字节关联一个序列号进行排序,并可以判定重复。

TCP提供流量控制。TCP总是告诉对端它能够接受多少字节的数据,这称为通告窗口。该窗口在任何时刻都住处接受缓冲区的可用空间,从而确保发送端发送的数据不会溢出接受缓冲区。缓冲区满,必须等待应用进程从这个缓冲区读取数据从能接受从发送端来的数据。

TCP连接的建立和终止

三次握手

0.前提,服务方必须准备好接受外来的链接,可通过socket、bind和listen函数来完成。

1. 客户端向服务器发出连接请求报文,这时报文首部中的同部位SYN=1,同时随机生成初始序列号 seq=x,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。这个三次握手中的开始。表示客户端想要和服务端建立连接。

2. 客户端向服务器发出连接请求报文,这时报文首部中的同部位SYN=1,同时随机生成初始序列号 seq=x,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。这个三次握手中的开始。表示客户端想要和服务端建立连接。

3. TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。这里客户端表示我已经准备好。

TCP选项,每个SYN可以含有若干个TCP选项:

MSS选项:最大分节大小MSS即能接受的每个TCP分节中的最大数据量。

窗口规模选项:动态改变窗口大小

时间戳选项:防止失而复得的分组可能造成的数据损坏。

四次挥手

1. TCP发送一个FIN(结束),用来关闭客户到服务端的连接。客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1)

2. 服务端收到这个FIN,他发回一个ACK(确认),确认收到序号为收到序号+1,和SYN一样,一个FIN将占用一个序号。 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。

3. 服务端发送一个FIN(结束)到客户端,服务端关闭客户端的连接。服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。

4. 客户端发送ACK(确认)报文确认,并将确认的序号+1,这样关闭完成。

TIME-WAIT状态的理由:

1.可靠的事项TCP双全工连接的终止。

最终的ACK丢失,服务端将重发最终的FIN,客户端必须未婚状态信息以允许他重发最终的ACK。

2.允许老的重复分节在网络中消失。

防止同一个IP新建的链接,不使用相同的端口号,让来自之前链接的消息在网络中消逝(某个方向上的分组最多存货MSL秒即被丢弃)。

常用的netstat命令的输出包括TCP状态轮换图中的这些状态

TCP缓冲区

每一个TCP套接口有一个发送缓冲区,当应用进程调用write时,内核应用进程的缓冲区中拷贝所有数据到套接口的发送缓冲区。如果发送缓冲区容不下所有数据(应用进程缓冲区大于发送缓冲区或发送缓冲区中有其他数据),应用进程被挂起(假设是阻塞的),内核将不从write系统调用返回,直到应用进程缓冲区中的所有数据都拷贝到发送缓冲区。TCP套接口的write调用成功返回仅仅表示我们可以重新使用应用进程缓冲区,并不是对端的TCP已经接收到数据。

对端TCP必须确认收到的数据,只有收到对端的ACK,本端才能删除套接口发送缓冲区中已确认的数据。TCP必须保留数据拷贝直到对端确认为止。

TCP以MSS大小的或更小的快把数据传递给IP,同时给每个数据按上一个TCP头部以构成TCP分节。

欢迎关注订阅微信公众号,程序员的压哨绝杀,一起分享生活工作中的见闻趣事。

tcp序列号为什么是随机的_TCP学习笔记相关推荐

  1. tcp序列号为什么是随机的_TCP与UDP

    Hofe's blog​hofe.work 里面有最新的版本 这篇介绍了下TCP与UDP面试题常考内容,并做了延伸,解释了原理. 面试题 tcp和udp的区别 tcp如何实现可靠性 怎么实现拥塞控制 ...

  2. tcp序列号为什么是随机的_每个开发人员都应该掌握的TCP知识

    为什么需要将服务器在地理位置上靠近用户? 原因之一是获得较低的延迟. 当您发送应尽快传送的短数据突发时,这很有意义. 但是,大文件(例如视频)呢? 接收第一个字节肯定会带来延迟损失,但是在那之后难道不 ...

  3. tcp序列号为什么是随机的_译文:每个开发人员应了解的 TCP 知识

    为什么要把服务器放在离用户很近的地理位置上?其中一个原因是为了实现更低的延迟.当您发送的数据是短的.应该尽可能快的传输数据时,这很有意义.但如果是大文件,比如视频等大文件呢?当然,在接收第一个字节时肯 ...

  4. 05决策树与随机森林(学习笔记)

    参考: 袁春老师<大数据机器学习公开课>:https://www.xuetangx.com/course/THU08091001026/10333105 李航老师<统计学习方法> ...

  5. 决策树随机森林GBDTXGBoost学习笔记以及代码实现

    文章目录 1. 引入 1.1 决策树 1.2 随机森林 1.3 GBDT(Gradient Boosting Decision Tree)梯度提升决策树 1.4 XGBoost(eXtreme Gra ...

  6. python基本随机生成函数_Python学习笔记(三):随机生成函数方法

    本文是在Python2下总结! Python中的random模块用于生成随机数,如果想生成随机数需要先导入random的模块然后才能使用其中的方法,下面简单介绍一下常用的结果函数方法: 1·.rand ...

  7. TCP/IP详解 卷1:协议 学习笔记 第十六章 BOOTP:引导程序协议

    一个无盘系统在不知道自身IP地址情况下,进行系统引导时能通过RARP协议获取它的IP地址,使用RARP会有两个问题:(1)IP地址是返回的唯一结果:(2)RARP使用链路层广播,RARP请求不会被路由 ...

  8. Android Studio --- [学习笔记]RadioButton、CheckBox、ImageView、ListView、TCP的三次握手

    说明 源代码 在2.x里有TCP的三次挥手与四次握手,先对它进行简单的回答(百度).预计在下一篇里,会继续说明TCP 接上一篇: Android Studio - > [学习笔记]Button. ...

  9. 关于《Python绝技:运用Python成为顶级黑客》的学习笔记

    本篇文章主要把<Python绝技:运用Python成为顶级黑客>中的代码敲一遍,学学Python安全相关的编程与思路,然后根据具体的情况修改一下代码. 第一章--入门 1.准备开发环境 安 ...

最新文章

  1. python中等高线填充颜色_Python matplotlib使用colormap更改contourf plot中指定值的颜色...
  2. 批量修改在索引中增加字段
  3. 面试 -- Java基础(一)
  4. application time for the banking industry
  5. 不要为框架作过多的假设
  6. 【循序渐进学Python】14.数据库的支持
  7. WPF中显示任意目录的图片或其他资源文件
  8. (45)FPGA面试题格雷码特点及其应用
  9. 判断本地和云端通讯录是否一致
  10. 06-08 Jenkins 自动化测试持续集成
  11. 宜信PaaS平台基于Calico的容器
  12. 第四天:制作网页的基本操作
  13. Java输出表格格式_在Java的System.out中以表格式输出
  14. 鼠标左键长按功能的实现
  15. 撩课-Web大前端每天5道面试题-Day4
  16. 阿里云云计算 5 阿里云的基础架构
  17. digester java_Java XML解析之Digester的使用
  18. 【简单】字符串中最长元音字符串的长度
  19. 802.1Q帧的格式 与 VLAN的类型
  20. JavaScript基础知识总结 18:dom基本操作

热门文章

  1. 倪震华教授版《振动力学》学习(二)
  2. BBC micro:bit 学习资源汇总(最近更新2019年1月6日....)
  3. pyqt5 布局 layout 收集
  4. java dao层编写及注释_JAVA代码注释规范
  5. MBR60200PT-ASEMI肖特基二极管常见型号MBR60200PT
  6. mysql的左右连接_MySQL之左连接与右连接
  7. 2022-3-4 Lab 2: Memory Management | Part 1: Physical Page Management
  8. 恋与制作人元旦服务器,恋与制作人2018元旦活动有什么_恋与制作人2018元旦活动介绍_游戏堡...
  9. 网页提示此站点不安全解决方案
  10. VsCode 运行后终端没有结果