1.什么是HTTP连接
http是建立在TCP协议之上的一种应用。
最显著的特点是每次请求,都需要服务器响应,请求结束后,会主动释放连接。
1)在HTTP 1.0中,客户端的每次请求都要建立一次单独的连接,在处理完本次请求后,服务器会主动释放连接。
2)在HTTP 1.1中,一次连接可以处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。
若服务器长时间没有收到客户端的请求,则认为客户端下线,服务器会主动释放连接。

2.什么是socket
套接字(socket)是TCP操作的单元,包含了通信双方的基本信息(连接使用的协议,本地主机的IP地址,端口,远地主机的IP地址,端口)
多个TCP连接可能需要通过同一个TCP协议端口传输数据,scoket可以实现数据传输的并发服务。

建立socket连接需要一对套接字,一个运行于客户端,一个运行于服务端。
建立连接分为三个步骤:服务器监听,客户端请求,连接确认
服务器监听:等待客户端的连接请求
客户端请求:客户端向指定服务器发出连接请求
连接确认:服务器端套接字监听到客户端套接字请求时,响应客户端请求,建立一个新的线程,把服务器端套接字的描述发给客户端,
客户端确认此描述后,正式建立连接,服务端套接字继续监听其他客户端请求。

socket支持多种传输层协议(TCP或UDP),当使用TCP协议连接时,该Socket连接就是一个TCP连接。
TCP连接时,双方可以互发消息,都可以主动关闭连接。
当使用HTTP协议时,在传输层使用的是TCP协议,但HTTP使用的是“请求-响应”模式,需要客户端发出请求,服务器才会主动响应。

3.什么是TCP
1)OSI七层模型

2)TCP头部
20字节的固定首部,加上不固定长度的选项(报文描述等),如下所示:

Source Port源端口,Destination Port目的端口各占2个字节,端口号配上IP首部中的地址,即可确定一个TCP连接。

Sequence Number序号,报文段中的第一个数据字节在数据流中的序号,用来解决报文乱序的问题。

Acknowledgment Numer确认号,确认号为接收端收到的序列号,加1,主要用来解决不丢包的问题

Offset数据偏移,值是由不固定长度的选项决定的

TCP Flags标志位,控制TCP的状态,URG,ACK,PSH,RST,SYN,FIN

Window窗口大小,滑动窗口(待研究)

检验和,检查数据是否有误

紧急指针,URG=1时,该字段有效,指出的是紧急数据在报文段中结束的位置

3)TCP通信示意图

4)三次握手
第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x,然后客户端进入SYN_SEND状态,等待服务器的确认。

第二次握手:服务器收到SYN报文段。服务器收到SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Numer为x+1,同时,自己还要发送SYN请求信息,将SYN置为1,Sequence Number为y,服务端将上述所有信息放到一个报文段(即SYN+ACK报文段),一并发送给客户端,此时服务器进入SYN_RECV状态。

第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Numer为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。

5)四次分手
第一次分手:主机1(可以是客户端,也可以是服务器端)设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文,此时主机1进入FIN_WAIT_1状态,表示主机1没有数据要发送个主机2了。

第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number+1,主机1进入FIN_WAIT_2状态,主机2告诉主机1,我同意你的关闭请求,主机2进入CLOSE_WAIT状态。

第三次分手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态。

第四次分手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态,主机2收到主机1的ACK报文段以后,就关闭连接,此时,主机1等到2MSL后,依然没收到回复,则证明Server端已正常关闭,然后主机1也可以关闭连接了。

6)为什么要三次握手
如果连接已关闭,此时由于网络延迟等原因造成的重复分组到达时,服务端会认为客户端再次发出了连接请求,服务端发送ACK确认,如果不使用三次握手,此时连接会重新建立,并一直等待客户端发送数据,这种情况,服务端资源就白白浪费掉了,而使用三次握手,客户端这种情况是不会向服务端的确认发出确认的,服务端由于收不到确认,就知道客户端并没有要求建立连接。

7)为什么要四次分手
TCP是面向连接,可靠的,基于字节流的运输层通信协议。是全双工的模式,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了,但是,这个时候主机1还是可以接受来自主机2的数据,当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的,当主机2也发送了FIN报文段时,这个时候表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,主机1发送ACK确认报文段,主机2收到该报文段,关闭连接,主机1等待2MSL后关闭。

8)四次分手最后一次为什么要等待2MSL
主机1发送ACK确认报文段后,并不知道主机2有没有收到确认报文段,如果没有收到,超过1MSL,主机2会重发一次FIN请求,如果在2MSL时间,主机1没有收到重发的请求,说明主机2已经成功接收ACK确认报文并关闭,这是主机1也可以安心关闭了。

参考:https://github.com/jawil/blog/issues/14

TCP三次握手,四次分手的更多相关文章

  1. 对TCP三次握手四次分手还不清楚的速度进,超简单解析,明白了就很好记!

    关于TCP三次握手四次分手,之前看资料解释的都很笼统,很多地方都不是很明白,所以很难记,前几天看的一个博客豁然开朗,可惜现在找不到了.现在把之前的疑惑总结起来,方便一下大家. 先上个TCP三次握手和四 ...

  2. 对TCP三次握手四次分手还不清楚,超简单解析

      关于TCP三次握手四次分手,之前看资料解释的都很笼统,很多地方都不是很明白,所以很难记,前几天看的一个博客豁然开朗,可惜现在找不到了.现在把之前的疑惑总结起来,方便一下大家. 先上个TCP三次握手 ...

  3. TCP三次握手四次分手—简单详解

    关于TCP三次握手四次分手,之前看资料解释的都很笼统,很多地方都不是很明白,所以很难记,前几天看的一个博客豁然开朗,可惜现在找不到了.现在把之前的疑惑总结起来,方便一下大家. 疑问一,上图传递过程中出 ...

  4. Tcp 三次握手 四次分手

    看了 余晟以为的 “tcp没那么难吧”,算是对三次握手,四次分手有了一点点理解,记录下来以方便自己以后的查看. 原文链接:https://mp.weixin.qq.com/s?__biz=MzA3MD ...

  5. TCP三次握手四次分手

    TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标 ...

  6. [转]Linux服务器上11种网络连接状态 和 TCP三次握手/四次挥手详解

    一.Linux服务器上11种网络连接状态: 图:TCP的状态机 通常情况下:一个正常的TCP连接,都会有三个阶段:1.TCP三次握手;2.数据传送;3.TCP四次挥手. 注:以下说明最好能结合”图:T ...

  7. TCP三次握手四次断开

    今天被问到三次握手了,当时只是脑子里有印象,却忘了一些SYN细节,手动微笑. 这么下去还怎么混...赶紧复习个... 三次握手是什么? TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双 ...

  8. (转)TCP三次握手四次挥手

    转自:http://www.jellythink.com/archives/705 参考:http://blog.csdn.net/whuslei/article/details/6667471 [注 ...

  9. Tcp三次握手四次挥手个人学习

    最近想跳槽,学习了tcp中的三次握手与四次挥手,特意记录下,加深记忆 SYN 代表请求创建连接 FIN 表示请求关闭连接 ACK 代表确认接受,不管是三次握手还是四次分手,在回应的时候都会加上ACK= ...

  10. TCP三次握手/四次挥手详解

    一. TCP/IP协议族 TCP/IP是一个协议族,通常分不同层次进行开发,每个层次负责不同的通信功能.包含以下四个层次: 1. 链路层,也称作数据链路层或者网络接口层,通常包括操作系统中的设备驱动程 ...

随机推荐

  1. java开发微信模板消息推送

    发布时间:2018-12-12   技术:springboot+maven   概述 该demo主要涉及微信模板消息推送功能, 详细 代码下载:http://www.demodashi.com/dem ...

  2. ELK 实现 Java 分布式系统日志分析架构

    日志是分析线上问题的重要手段,通常我们会把日志输出到控制台或者本地文件中,排查问题时通过根据关键字搜索本地日志,但越来越多的公司,项目开发中采用分布式的架构,日志会记录到多个服务器或者文件中,分析问题 ...

  3. linux解决“XXX is not in the sudoers file”错误

    问题:我想在我的Linux系统上使用sudo来运行一些特权命令,然而当我试图这么做时,我却得到了"[我的用户名] is not in the sudoers file. This incid ...

  4. ceph iscsi (SCST)

    ceph结合iscsi iscsi Target 安装 1.安装SCST tar -jxf scst-3.0.1.tar.bz2 cd scst-3.0.1 make && make ...

  5. wxml

    <template name="objectCombine"> <view> <text> {{for}} </text> < ...

  6. Docker 构建Hadoop环境

    参考如下文章: Docker安装Hadoop Docker在本地搭建Hadoop分布式集群 Docker快速搭建Hadoop测试环境 从0开始用docker搭建 hadoop分布式环境 Docker- ...

  7. Git 获取仓库(分布式版本控制系统)

    1.在现有目录中初始化仓库 如果你打算使用 Git 来对现有的项目进行管理,你只需要进入该项目目录并输入以下命令. # 初始化仓库 $ git init 该命令将创建一个名为 .git 的子目录,这个 ...

  8. SQL临时表

    临时表就是那些名称以井号 (#) 开头的表.如果当用户断开连接时没有除去临时表,SQL Server 将自动除去临时表.临时表不存储在当前数据库内,而是存储在系统数据库 tempdb 内.  临时表有 ...

  9. numpy的生成网格矩阵 meshgrid()

    numpy模块中的meshgrid函数用来生成网格矩阵,最简单的网格矩阵为二维矩阵 meshgrid函数可以接受 x1, x2,..., xn 等 n 个一维向量,生成 N-D 矩阵. 1 基本语法 ...

  10. easyui刷新指定tab页里面的数据

    主页Home/Index中使用tab管理,在主页中设置一个刷新的方法. /** * 刷新指定的tab里面的数据 * @param title 选项卡标题 * @param refreshTabFunc ...