网络编程相关文章
网络编程–TCP和UDP
网络编程–HTTP和HTTPS
网络编程-Socket
一、OSI七层协议
先上图,TCP和UDP在传输层
二、TCP
先上TCP头部结构图,看不懂无所谓,下面慢慢了解
我们只需要了解三个参数、序列号和确认号就可以了,TCP三次握手的场景会用到(重点理解)
- ACK -----
确认接收到的数据
TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1
- **SYN(SYNchronization) ** ----
创建一个连接
在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1,因此, SYN置1就表示这是一个连接请求
或连接接受报文。
- FIN (finis)
终结一个连接(4次握手的时候用到)
终结的意思, 用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。
- 序列号和确认号
TCP会话的每一端都包含一个32位(bit)的序列号,该序列号被用来跟踪该端发送的数据量
。每一个包中都包含序列号,在接收端则通过确认号用来通知发送端数据成功接收
1、 三次握手
- 定义
三次握手的目的是建立可靠的通信信道,主要的目的就是双方确认自己与对方的发送与接收机能正常
1.1、 握手流程
还是先上流程图,先上车再解释
客户端(Client) 服务器(Server)
- 第一次握手 ----Client发出请求连接
Client将SYN置1,ACK=0,随机产生一个初始序列号seq=x发送给Server,进入SYN_SENT
状态(SYN=1,ACK=0,seq=x)
- 第二次握手 ------Server 进行回复确认
Server收到Client的SYN=1之后,知道客户端请求建立连接,将自己的SYN置1,ACK
置1,产生一个acknowledge number=sequence number+1( 就是确认号ack=x+1
),并随机产生一个自己的初始序列号seq=x,发送给客户端;进入SYN_RCVD
状态(SYN=1,ACK=1,seq=y,ack=x+1)
- 第三次握手 -----Client 再进行一次确认
客户端检查acknowledge number是否为序列号+1(ack=x+1),ACK是否为1,检查正确之后将自己的ACK置为1,产生一个acknowledge number=服务器发的序列号+1(ack=y+1),发送给服务器;进入ESTABLISHED
状态;服务器检查ACK为1和acknowledge number为序列号+1ack=y+1)之后,也进入ESTABLISHED
状态;完成三次握手,连接建立
- 简单理解三次握手流程
- 客户端向服务端发送SYN
- 服务端返回SYN,ACK
- 客户端发送ACK
- 用现实理解三次握手的具体细节
- 你打电话给你朋友
- 你朋友接了,朋友:你好,我是惠惠,请问你是?
- 你:我是丢丢,最近还好吗?
1.2、建立连接为什么要三次握手,不可以两次握手
-
原因
可能会出现已失效的连接请求报文段又传到了服务器端 -
重点理解
-
假设不采用 “三次握手”,那么只要 server 发出确认,新的连接就建立了
- client 发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server
- 本来这是一个早已失效的报文段。但 server 收到此失效的连接请求报文段后,就误认为是 client 再次发出的一个新的连接请求
- 于是就向 client 发出确认报文段,同意建立连接
- 由于现在 client 并没有发出建立连接的请求,因此不会理睬 server 的确认,也不会向 server 发送数据。但 server 却以为新的运输连接已经建立,并一直等待 client 发来数据。这样,server 的很多资源就白白浪费掉了
-
采用 “三次握手” 的办法可以防止上述现象发生。例如刚才那种情况,client 不会向 server 的确认发出确认。server 由于收不到确认,就知道 client 并没有要求建立连接。两次握手无法保证Client正确接收第二次握手的报文(Server无法确认Client是否收到),也无法保证Client和Server之间成功互换初始序列号
1.3、 第三次握手中,如果客户端的ACK未送达服务器的情况
-
Server端
由于Server没有收到ACK确认,因此会每隔 3秒 重发之前的SYN+ACK(默认重发五次,之后自动关闭连接进入CLOSED
状态),Client收到后会重新传ACK给Server -
Client端
- 在Server进行超时重发的过程中,如果Client向服务器发送数据,数据头部的ACK是为1的,所以服务器收到数据之后会读取 ACK number,进入 establish 状态
- 在Server进入CLOSED状态之后,如果Client向服务器发送数据,服务器会以RST包应答
1.4、 已经建立了连接,但客户端出现了故障的情况
服务器每收到一次客户端的请求后都会重新复位一个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
1.5 初始序列号
TCP连接的一方A,随机选择一个32位的序列号(Sequence Number)作为发送数据的初始序列号(Initial Sequence Number,ISN),,比如为1000,以该序列号为原点,对要传送的数据进行编号:1001、1002…三次握手时,把这个初始序列号传送给另一方B,以便在传输数据时,B可以确认什么样的数据编号是合法的;同时在进行数据传输时,A还可以确认B收到的每一个字节,如果A收到了B的确认编号(acknowledge number)是2001,就说明编号为1001-2000的数据已经被B成功接受。
2、 四次挥手
废话不说,还是先上流程图
-
第一次挥手
Client将FIN置为1,发送一个序列号seq=x给Server;进入FIN_WAIT_1
状态 -
第二次挥手
Server收到FIN之后,发送一个ACK=1,acknowledge number=收到的序列号seq+1(ack=x+1);进入CLOSE_WAIT
状态。此时客户端已经没有要发送的数据了,但仍可以接受服务器发来的数据 -
第三次挥手
Server将FIN置1,发送一个序列号seq=y给Client;进入LAST_ACK
状态 -
Client收到服务器的FIN后,进入
TIME_WAIT
状态;接着将ACK置1,发送一个acknowledge number=序列号+1给服务器(ack=y+1);服务器收到后,确认acknowledge number后,变为CLOSED
状态,不再向客户端发送数据。客户端等待2*MSL(报文段最长寿命)时间后,也进入CLOSED状态。完成四次挥手
- 用现实理解四次挥手的具体细节
四次挥手断开连接是因为要确定数据全部传书完了
- 你跟你女朋友通话中,你:宝贝,我要睡觉了,挂了哦!!!
- 你女朋友:好呀,我也要睡觉了,你可以挂了
- 电话粥煲的差不多了,女朋友也没话题了,你女朋友:那我挂了哦!
- 你:好!,女朋友挂了电话,你才敢挂手机睡觉
2.2、 为什么不能把服务器发送的ACK和FIN合并起来,变成三次挥手(CLOSE_WAIT状态意义是什么)?
因为服务器收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复ACK,表示接收到了断开连接的请求。等到数据发完之后再发FIN,断开服务器到客户端的数据传送
2.3、 如果第二次挥手时服务器的ACK没有送达客户端的情况
客户端没有收到ACK确认,会重新发送FIN请求。
2.4、 客户端TIME_WAIT状态的意义
第四次挥手时,客户端发送给服务器的ACK有可能丢失,TIME_WAIT状态就是用来重发可能丢失的ACK报文。如果Server没有收到ACK,就会重发FIN,如果Client在2*MSL的时间内收到了FIN,就会重新发送ACK并再次等待2MSL,防止Server没有收到ACK而不断重发FIN。 MSL(MaximumSegment Lifetime),指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。
三、TCP 与 UDP 区别
对比 | TCP | UDP |
---|---|---|
可靠性 | 可靠 | 不可靠 |
连接性 | 面向链接 | 无连接 |
报文 | 面向字节流 | 面向报文 |
传说效率 | 效率低 | 效率高 |
传输速度 | 慢 | 快 |
双工性 | 一对一 | 一对一,一对多,多对一,多对多 |
流量控制 | 有 | 无 |
应用场合 | 对效率要求相对较低,对准确性的要求相对较高,或者要求有连接的场景 | 对效率要求相对较高,对准确性的要求相对较低的场景 |
协议 | FTP,Telnet,SMTP,POP3,HTTP ,HTTPS | DNS,SNMP,TFTP |
- 连接
- TCP是面向连接的协议,发送数据前要先建立连接,TCP提供可靠的服务,也就是说,通过TCP连接传输的数据不会丢失,没有重复,并且按顺序到达
- UDP是无连接的协议,发送数据前不需要建立连接,是没有可靠性
- TCP通信类似于于要打个电话,接通了,确认身份后,才开始进行通行。UDP通信类似于学校广播,靠着广播播报直接进行通信
- TCP只支持点对点通信,UDP支持一对一、一对多、多对一、多对多
- TCP是面向字节流的,UDP是面向报文的; 面向字节流是指发送数据时以字节为单位,一个数据包可以拆分成若干组进行发送,而UDP一个报文只能一次发完
- TCP首部开销(20字节)比UDP首部开销(8字节)要大
- UDP 的主机不需要维持复杂的连接状态表
1、TCP 或UDP的应用层协议分析
1.1、运行在TCP协议上的协议
- HTTP(Hypertext Transfer Protocol,超文本传输协议),主要用于普通浏览
- HTTPS(HTTP over SSL,安全超文本传输协议),HTTP协议的安全版本
- FTP(File Transfer Protocol,文件传输协议),用于文件传输
- POP3(Post Office Protocol, version 3,邮局协议),收邮件用
- SMTP(Simple Mail Transfer Protocol,简单邮件传输协议),用来发送电子邮件
- TELNET(Teletype over the Network,网络电传),通过一个终端(terminal)登陆到网络
- SSH(Secure Shell,用于替代安全性差的TELNET),用于加密安全登陆用
1.2、 运行在UDP协议上的协议
- BOOTP(Boot Protocol,启动协议),应用于无盘设备
- NTP(Network Time Protocol,网络时间协议),用于网络同步
- DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),动态配置IP地址
1.3、运行在TCP和UDP协议上
- DNS(Domain Name Service,域名服务),用于完成地址查找,邮件转发等工作
- ECHO(Echo Protocol,回绕协议),用于查错及测量应答时间(运行在TCP和UDP协议上)
- SNMP(Simple Network Management Protocol,简单网络管理协议),用于网络信息的收集和网络管理
- DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),动态配置IP地址
- ARP(Address Resolution Protocol,地址解析协议),用于动态解析以太网硬件的地址