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. navigationItem.rightBarButtonItem 设置背景图片,颜色更改解决的方法

    self.navigationItem.rightBarButtonItem=[[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@& ...

  2. ACM退役前2个月总结

    这个时候是该好好地反省一下自己了!曾经的时候为了队伍能打出很多其它的题,我硬是看了ACM的非常多模块!也会了非常多的模板!可是如今我痛苦地发现比赛还是我一人单挑的局面!如今我也遇见了一个瓶颈了,那就是 ...

  3. 关于Ubantu下使用cshell的问题解决

    在一个新创建的目录下使用cshell,直接在/etc/passwd 下对应的用户后 bash改为csh; 之后运行发现报错,后来查找发现/bin下没有csh执行脚本,之后安装csh;; 参考了http ...

  4. 工程部署从tomcat6.0迁移到jboss6.0错误总结

    2014-11-08 内容存档在evernote,笔记名"工程部署从tomcat6.0迁移到jboss6.0错误总结"

  5. wcf 中客户端调用之死 感悟 wcf与原来的webservice2.0 的客户端调用区别(wcf调用完不关闭的话那就把web服务搞死了)

    说到wcf,本人也是刚刚使用所以不是很熟悉 在做项目的时候采用webservice+客户端程序架构 写了一个wcf中的webservice之后,又写了很多的客户端exe程序,有的是轮询调用这个webs ...

  6. hibernate 注释 唯一键约束 uniqueConstraints

    @Table 注解包含一个schema和一个catelog 属性,使用@UniqueConstraints 可以定义表的唯一约束. 如果是联合约束就用下面这种 @Table(name="tb ...

  7. <welcome-file>index.action</welcome-file>直接设置action,404和struts2中的解决方案

    这几天的项目页面的访问全部改为.action访问,在修改首页时遇到了问题.将web.xml文件中<welcome-file>index.action</welcome-file> ...

  8. Oracle2MySQL注意事项

    在Oracle切换成MySQL时,会碰到如下注意事项: Oracle中的sysdate在MySQL中是不支持的: Oracle中的分布方案在MySQL中的实现: Oracle中的SQL语句是大小写不敏 ...

  9. mysqldump脚本crontab执行失败,但是手动执行成功

    检查备份时发现,cron中定时备份mysql的脚本备份失败,但是手动自行mysql备份脚本却能正常成功 检查cron的环境变量: # cat /etc/crontab ... SHELL=/bin/s ...

  10. SharePoint 2013混合模式登陆中 使用 自定义登陆页

    接前一篇博客<SharePoint 2013自定义Providers在基于表单的身份验证(Forms-Based-Authentication)中的应用>,当实现混合模式登陆后,接着我们就 ...