TCP的含义与基本原理(重温TCP)

一、TCP的含义(面试必考,需深入理解)

面向连接的,可靠的传输协议。

二、TCP的连接管理全过程

  1. 客户端与服务端,服务端等待客户端的连接,客户端去主动连接服务端。;
  2. 网络设备:网卡来收发我们的数据–》唯一的IP地址
  3. 网络数据包的传送,一个IP地址传送给另一个IP地址
  4. 端口:每个网卡有多个端口,供不同的app使用,所以收发数据需要 IP地址+端口号(虚拟端口数目6W多个)
  5. 游戏服务器多玩家同时在线,不意味着需要占用同数目的端口去一一对应。
    游戏服务器端口分析:
    step1:服务器创建一个固定端口号的socket,用于监听客户端的请求。
    step2:客户端找一个没有使用的端口号,用于放服务器的监听端口号请求连接。
    step3:服务器收到客户端的请求数据包,给这个客户端创建一个“新的socket”(用的端口还是监听端口),与这个客户端进行专属连接。
    step4:有了专门的数据通道,服务器和客户端就建立起了数据收发通道。服务器的socket对象保存了与它连接的客户端的socket信息(客户端IP + 客户端端口号)向客户端socket发送数据包(服务器IP+端口号)
    step5:客户端收到新的端口号,就已经建立起连接了。
    step6:客户端主动关闭:客户端底层会发送一个关闭请求,服务器底层同意,回应OK,服务器底层也发送一个请求关闭,客户端发送OK,那么这个时候才会关闭这个连接。(断开以后,要释放socket资源)
    step7:服务器利用TCP管理成千上万个客户端,实际是管理成千上万个socket的数据收发。

三、可靠的网络传输原理

存在问题(网络传送的不可靠):

  1. 丢包
  2. 收到的数据顺序被打乱
    TCP解决了这些不可靠的问题,所以TCP是可靠的。
    OS底层实现了TCP的可靠网络传送协议:TCP/IP协议栈
    底层每发送一个数据包,会等待,等接收方回复确认收到以后,在发送一个数据包,假设一段时间没有等到回复,我们会重发这个数据包,直到收到确认这个数据包。

四、TCP传送可靠的代价

  1. 我们每发送一个数据包,都要经过确认以后,才会发送下一个数据包。
  2. 每次TCP我们都要确认,所以TCP为了搞笑,尽可能等更多的数据一起传送,引发了一个经典问题:粘包问题;如果数据过大,又会引发一个新的问题经典问题:半包问题
    解决办法:
    TCP封包与拆包。
    做一个盒子[大小,数据内容]
    OR
    分割符号,hello\r\nworld–>hello world
    (TCP对于应用层来说是不可能出现“丢包”,“顺序”问题)

MMO+Java:一、Java服务器相关基础知识:3、TCP的核心意涵与基本原理相关推荐

  1. web服务器相关基础知识

    快捷键:window+r:注册表 1.Web服务器概述 Web服务器用于: (1)接收客户端的请求 (2)理解请求,找到客户端需要的文件 (3)把客户端请求的文件输出给客户端 Web服务器的分类:   ...

  2. JAVA学习笔记(1)【基础知识】

    JAVA学习笔记DAY_1 提示:关于java系列的内容只是本人在老师的指导下和自学过程中的一些学习笔记,如果存在错误敬请批评指正! 文章目录 JAVA学习笔记DAY_1 前言 一.Java语言未来的 ...

  3. JAVA面试题之JVM基础知识

    JAVA面试题总结-JVM的基础知识 JAVA面试题之JVM基础知识 说一下JVM的主要组成部分及作用 说一下 jvm 运行时数据区? 说一下堆和栈的区别? 队列和栈是什么?有什么区别? 什么是双亲委 ...

  4. 作为一名Java开发者应该掌握的基础知识汇总!

    Java语言作为热门编程语言之一,受到了更多的欢迎.今天小千就为大家介绍一下作为一名Java开发者应该掌握的基础知识. 一.修饰符 java语言中提供了一些修饰符,这些修饰符可以修饰类,变量和方法. ...

  5. Java开发者需要掌握的基础知识

    Java语言作为热门编程语言之一,受到了更多的欢迎.今天小千就为大家介绍一下作为一名Java开发者应该掌握的基础知识. 一.修饰符 java语言中提供了一些修饰符,这些修饰符可以修饰类,变量和方法.以 ...

  6. Java中易忽略的基础知识

    欢迎关注我的公众号[软件大爆炸] Java学习中的碎碎念 Java中易忽略的基础知识 Java面向对象基础 Java中的核心类 Java抽象类和接口 Java中的异常 Java中的泛型与集合 Java ...

  7. 【RAC】RAC相关基础知识

    [RAC]RAC相关基础知识 1.CRS简介    从Oracle 10G开始,oracle引进一套完整的集群管理解决方案--Cluster-Ready Services,它包括集群连通性.消息和锁. ...

  8. 黑马程序员_JAVA相关基础知识

    ------- android培训.java培训.期待与您交流! -------- JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便 ...

  9. 【C++后台开发面经】面试总结第三波:针对后台开发相关基础知识分类总结

    前言 面试总结第三波,关于后台开发面试相关基础知识,数据结构.算法.linux操作系统.计算机网络.C++.数据库进行分类总结. 后端面试总结 目录 后端面试总结 1.数据结构 链表和数组的区别 树的 ...

最新文章

  1. Java项目:医院分诊挂号住院管理系统(java+SpringBoot+FreeMarker+Mysql)
  2. 学习 慕课网 PHP工程师学习计划--我的笔记汇总
  3. 灰度图像--图像增强 双边滤波 Bilateral Filtering
  4. 049_汉字Unicode编码范围
  5. Linux和optee双系统中1020-1023号的中断号的使用
  6. 题目1005:Graduate Admission(结构体排序)
  7. 去除DataTable重复数据的三种方法(转)
  8. 学好单片机编程设计的方法和3个步骤
  9. 【WEB搜索技术】课程学习大纲与学习感悟
  10. WIN7下Virtualbox虚拟Ubuntu共享文件夹设置
  11. 什么是天灾人祸,天灾是智商比较低,什么是人祸,人祸就是自己还不努力
  12. 凑个热闹 谈谈网红沈大师
  13. 如何把wps随机数据固定_WPS Excel:巧用随机函数rand和randbetween生成各种数据
  14. 学服务端(git高级)的第3天
  15. OpenType字库文件
  16. 51单片机 8*8点阵贪吃蛇
  17. 【自动化测试】自动化测试框架那些事儿
  18. MongoDB最新最佳连接工具:Robo 3T
  19. 17joys用户管理 添加用户
  20. 晶振01——晶振分类和无源晶振的设计

热门文章

  1. Django templete学习
  2. Angular2 @Input 和 @Input 用法
  3. 最优化方法——QR分解
  4. 公司企业怎么做一个网站?
  5. java获取新浪天气预报代码
  6. 每天你应该养成的习惯
  7. [AndroidR][ADB][Go]如何默认打开USB调试,去掉USB调试确认弹窗
  8. 配水果龙眼的朋友圈文案,龙眼水果宣传文案模版
  9. css 随着屏幕大小字体随之变化
  10. 关于前端将一个集合传递到后端