在说这个问题之前,先说说IP协议和TCP协议

问题:IP协议能做什么?不能做什么?

我们都知道IP协议是无连接的通信协议,它不会占用两个正在通信的计算机的通信线路,这样就降低了IP对网络传输中的需求,每条线路都能同时满足许多不同的计算机需要,通过IP、消息、或者其他数据,会被分割为较小的独立的包,并通过因特网在计算机中传送,IP负责将每个包路由到它的目的地,但IP协议呢,没有做任何事情去确保数据包是按顺序发送或是否被破坏,所以IP数据包是不可靠的。需要由它的上层协议,来做出控制------》TCP协议

传输控制协议TCP简介

---》

1、面向连接的、可靠的、基于字节流的传输层通信协议

2、将应用层的数据流分割成报文段并发送给目标节点的TCP层(将数据打散)

(数据传输时,应用层向TCP发送数据流,然后TCP把数据流分割成适当长度的报文段,报文段的长度呢是受该计算机连接的网络的网路层的最大连接单元限制的,则MTU的限制。TCP把结果包,传给IP层,由它来通过网络传输给对方的TCP层)

3、数据包都有序号,对方收到则发送ACK确认,未收到则重传(怎样保证数据的有序性)

(TCP为了保证不丢失包,就给每个包一个序号,则sequence number,这个序号就保证了数据包的按序处理,对方接受到按照这个序列来按顺序来处理数据包。接收端实体对已成功接受到的包的话,就发回一个确认,则ACK确认。如果发送端实体在合理的往返时延,则TRR内未收到的话,则认为该数据已经丢失,并且会对其重传)

4、使用校验和来检验数据在传输过程中是否有误(怎样保证数据的正确性?)

(TCP用一个奇偶校验和函数来检验数据,是否有错误,在发送和接受时呢,都要计算校验和)

我们知道两个进程在计算机内部进行通信的话,有哪些方式?

1、管道

2、内存共享

3、信号量

4、消息队列等

而两个进程进行通信的前提是唯一标识一个进程,通过这个唯一标识,找到对应的进程,在本地进程通信中呢,我们可以使用pid ,但用个id的话,只是在本地是唯一而已。如果把两条进程放到两台不同的计算机上,而他们要进行通信的话呢,pid就不够用了,这样的话,就需要另外的手段了,解决的方法就是在传输层中使用协议端口号,我们知道ip地址可以唯一标识主机,而ip地址+端口可以唯一标识主机中的一个进程,这样子的话,我们可以利用ip地址+协议+端口号,去标识网络中的一个进程。在一些场景下,我们称这种模式为套节字(则socket),虽然通信的重点是应用进程,但我们只要把要传输的报文交到目的主机的某一个合适的端口,剩下的工作就由TCP来完成了。

Source Port :本机端口

Desination Port : 目标端口

Sequence Number : 序列号  4个字节  (例如:一段报文的序列号值是107,而携带的字段有100个字段,那么还有下一个报文的话,那么它的序列号是107+100=207)

Acknowledgment number :确认号  4个字节(期望收到对方收到下一个报文,第一个数据字节的序号   ,例如,B收到A发送过来的报文,其序列号是301,而数据长度为200,这表明了B正确收到了A发送的到序号为500的数据,301+200-1=500,因此B期望A下次发送过来的报文的序号是501,所以B收到了A第一次报文之后,会返回ACK为501的序号的报文给B)

Offset : 数据偏移,由于头部有可选字段,长度不固定,因此他就是指出TCP报文的数据与TCP的起始处相差多远。

Reserved:一般为0,保留域

TCP Flags: 标记位,控制位,8个标志位,每个都代表一种功能

  1、URG --->紧急指针标记,当他为1的是紧急指针有效。为0的话,可以忽略

  2、ACK--->确认序号标志,1有效,0报文中不含确认信息,忽略确认号字段

  3、PSH--->push 标志,1带有push标志数据,如果接受方接受到这个信息,应该尽快交给应用程序处理,而不是一直停留在缓冲区

  4、RST---->重置连接标志,由于主机崩溃,或者拒绝非法的报文段,或者非法连接请求

  5、SYN---->同步序列号,用于建立连接过程。在连接请求中,SYN=1,ACK=0,表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认 SYN=1和ACK=1

  6、FIN---->finish标志,用于释放连接。为1的时候,就代表发送方没有数据发送了,则关闭本方数据流

Window : 滑动窗口的大小,用来告知发送端和接受端的缓存大小,以此控制发送端的发送速率,从而达到流量控制

CheckSum : 奇偶和校验,检验TCP报文段(包括TCP数据和TCP头部),以16位计算所的,由发送端计算和存储。并由接受端进行验证。

Urgent Pointer : 紧急指针,当TCP FLAGS 为URG的时候,才有效,会显示本段报文的紧急数据的字节数

TCP Option : 可选项,长度可变,定义一些可选参数

1、为什么需要三次握手才能建立起连接呢?

为了初始化Sequence number的初始值

通信的双方都要通知对方自己的sequence number。也就是图上的x和y,这个要作为以后通信的序号,保证应用层接受到的数据不会因为网络的问题,导致数据的乱序。就是TCP会用这个序号来拼接数据。那么服务回发信息给客户端的时候(第二次握手的时候),告诉客户端知道服务器已经知道你的seq序号了。

此外在第一次握手的时候,有一个隐患。SYN的超时问题。

首次握手的隐患-----SYN超时

问题起因分析

1、Server收到Client的SYN,回复SYN-ACK的时候未收到ACK确认

2、Server不断重试直到超时,LInux默认等待63秒才断开连接(重试5次,2,4,8,16,32 共63秒)

会将服务器连接的队列SYN耗尽,让正常的请求不能得到请求(用户就感到网络好卡,没返回)

针对SYN Flood的防护措施

1、linux下,SYN队列满后,通过tcp_syncookies参数回发SYN Cookie(TCP会通过原地址端口,目标地址端口,时间戳,打造一个特别sequence number回发回去,这个seq简称SYN Cookie)

2、若为正常连接则Client会回发SYN Cookie ,直接建立连接

问题:建立连接后,Client出现故障怎么办?

保活机制

  1、向对方发送保活探测报文,如果未收到响应则继续发送(在一段时间,我们成为保活时间,keepalive time ,在这段时间内,连接处于非活动状态,开启保活功能的一段,会向对方发送保活探测报文)

  2、尝试次数达到保活探测仍未收到响应则中断连接

说说TCP的三次握手的更多相关文章

  1. 简析TCP的三次握手与四次分手

    TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文章时,我想你也知道TCP的概念了,想要更深入的了解TCP的工作,我们就继续.它只是一个超级麻烦的协议,而它又是互联网的基础,也 ...

  2. TCP的三次握手(建立连接)和四次挥手(关闭连接)

    参照: http://course.ccniit.com/CSTD/Linux/reference/files/018.PDF http://hi.baidu.com/raycomer/item/94 ...

  3. TCP协议三次握手和四次挥手

    http://www.cnblogs.com/rootq/articles/1377355.html TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对 ...

  4. HTTP协议中TCP的三次握手,四次挥手总结

    建立TCP需要三次握手才能建立,而断开连接则需要四次挥手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资 ...

  5. TCP协议三次握手

    TCP协议三次握手过程分析 TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: ...

  6. 简析TCP的三次握手与四次挥手

    TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文章时,我想你也知道TCP的概念了,想要更深入的了解TCP的工作,我们就继续.它只是一个超级麻烦的协议,而它又是互联网的基础,也 ...

  7. 简析TCP的三次握手与四次分手【转】

    转自 简析TCP的三次握手与四次分手 | 果冻想http://www.jellythink.com/archives/705 TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文 ...

  8. 【转载】简析TCP的三次握手与四次分手

    最近在补习HTTP协议相关知识点,看到这篇讲得不错,所以转载收藏一下,同时也分享给大家.原文地址:http://www.jellythink.com/archives/705,版权归原作者所有. TC ...

  9. TCP协议—三次握手四次挥手的原理<转>

    三次握手四次挥手的原理   TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接.在TCP/IP协议中,TCP 协议提供可靠的连接服务,连接是通过三次握手进行初始化的.三 ...

  10. TCP的三次握手与四次挥手

    TCP的三次握手与四次挥手 一.TCP(Transmission Control Protocol 传输控制协议) TCP是面向对连接,可靠的进程到进程通信的协议 TCP是提供全双工服务,即数据可在同 ...

随机推荐

  1. 3dmax 法线重置

    从一个模型分离部位时,分离出的部分,面法线发生了混乱,左边原始模型,右边分离后 重置法线方法 对模型(比如对分离出的下半身)添加 EditoNormal修改器 选中模型部位 添加Edit Normal ...

  2. IT兄弟连 JavaWeb教程 AJAX常见问题

    1  中文乱码问题 ●  POST提交乱码 乱码原因:所有浏览器对Ajax请求参数都使用UTF-8进行编码,而服务器默认使用ISO-8859-1去解码,所以产生乱码. 解决方法:在服务器接收请求参数前 ...

  3. express解决ajax跨域访问session失效问题

    最近在学习express,就用以前做的项目来进行express前后端分离的练手了,在做登陆注册的时候发现跨域的时候,session的值是会失效的,导致session里面的数据获取为undefined, ...

  4. Nacos深入浅出(三)

    EventDispatcher.fireEvent(new ConfigDataChangeEvent(true, dataId, group, tenant, time.getTime())); 跟 ...

  5. php根据出生日期获取年龄

    /** * @param $birthday 出生年月日(1992-1-3) * @return string 年龄 */ function countage($birthday){ $year=da ...

  6. JavaScript进阶 - 第1章 系好安全带,准备启航

    第1章 系好安全带,准备启航 1-1让你认识JS 你知道吗,Web前端开发师需要掌握什么技术?也许你已经了解HTML标记(也称为结构),知道了CSS样式(也称为表示),会使用HTML+CSS创建一个漂 ...

  7. 学习笔记之a,b=b,a+b与a=b,b=a+b的区别

       兔子序列中用到的常用的计算方法:a,b=b,a+b 当我们真正去运行的时候,会发现它与a=b,b=a+b是有区别的 实例代码如下: def YY(one): a,b,n=0,1,0 while( ...

  8. HTML——传统布局的使用

    传统布局:使用table来做整体页面的布局 总结:这种方式来制作页面现在也不是很多了,感觉并不是很高效. 需要先用photoshop量出页面布局具体的尺寸位置,再将其划分为表格,对每个格子进行编辑. ...

  9. Java编码优化

    Java编码优化 1.尽可能使用局部变量 调用方法时传递的参数以及在调用中创建的临时变量都保存在栈中速度较快,其他变 量,如静态变量.实例变量等,都在堆中创建,速度较慢.另外,栈中创建的变量,随 着方 ...

  10. PHP开发环境及搭建

    自学PHP中,很多东西都不熟悉,在此做个记录,方便以后再次搭建PHP环境.这篇文章基本按照原文  ThinkPHP5开发环境安装和配置 ,在此感谢该作者 一.实验目的 1.掌握ThinkPHP5(简称 ...