网络协议
2017-02-14 00:00
92 查看
基础加固:
tcp/ip 协议(四层):
TCP:传输控制协议(Transmission Control Protocol, TCP)是一种面向连接的、可靠的、基于字节流的运输层(Transport layer)通信协议。
IP:网络层协议。跨越多种数据链路传输数据包,提供路由和寻址功能。
ok,划出关键点:面向连接,可靠,基于字节流,传输层协议。
有几个疑问:
1.啥叫面向连接?
面向连接举例:两个人之间通过电话进行通信。
面向无连接举例:邮政服务,用户把信函放在邮件中期待邮政处理流程来传递邮政包裹。显然,不可达代表不可靠。
从程序实现的角度解析面向连接、面向无连接如下:
TCP面向连接,UDP面向无连接(在默认的阻塞模式下):
在TCP协议中,当客户端退出程序或断开连接时,TCP协议的recv函数会立即返回不再阻塞,因为服务端自己知道客户端已经退出或断开连接,证明它是面向连接的;
而在UDP协议中,recvfrom这个接收函数将会始终保持阻塞,因为服务端自己不知道客户端已经退出或断开连接,证明它是面向无连接的)。
说白了,面向 就是指 “知道,了解,针对于,基于”的含义。
2.怎么保证可靠?
交互:
建立连接:三次握手。
描述:
第一次握手
client(客户端)发送一个SYN(seq=x)包给server(服务器),然后“期待”server的ACK回复。p.s: seq为sequence(序列)的缩写,ACK为acknowledge(通知)的缩写。
第二次握手
server(服务器)接收到SYN(seq=x)包后就返回一个ACK(ack=x+1)包,意思是告诉client(客户端):我已经成功接收到你的SYN包。
并且自己也发送一个SYN(seq=y)包,然后”期待“client(客户端)的ACK回复。
第三次握手
client(客户端)接收到server(服务器)发回的ACK(ack=x+1)包后,然后就把自己的状态设置为ESTABLISHED(已建立连接)。
然后根据server(服务端)发回的SYN(seq=y)包,返回给”期待”中的server一个ACK(ack=x+1)包。期待中的server收到ACK回复,也把自己的状态设置为ESTABLISHED(已建立连接)。到此TCP三次握手完成,client与server可以正常进行通信了。
为什么需要三次握手?
这个问题的本质是, 前提就是信道不可靠, 但是通信双发需要就某个问题达成一致。而要解决这个问题, 无论你在消息中包含什么信息, 三次通信是理论上的最小值。 所以三次握手不是TCP本身的要求, 而是为了满足"在不可靠信道上可靠地传输信息"这一需求所导致的. 请注意这里的本质需求,信道不可靠, 数据传输要可靠。三次达到了, 那后面你想接着握手也好, 发数据也好, 跟进行可靠信息传输的需求就没关系了。 因此,如果信道是可靠的, 即无论什么时候发出消息, 对方一定能收到, 或者你不关心是否要保证对方收到你的消息, 那就能像UDP那样直接发送消息就可以了.”。
很简单:
就像两个人说话,A 对 B 发消息(第一次握手),B 读懂消息并且回复应答(第二次握手),A读懂消息并且回复应答(第三次握手)。确保两者可以互相交流,三次是最小值。
关闭连接:四次挥手
tcp/ip 协议(四层):
TCP:传输控制协议(Transmission Control Protocol, TCP)是一种面向连接的、可靠的、基于字节流的运输层(Transport layer)通信协议。
IP:网络层协议。跨越多种数据链路传输数据包,提供路由和寻址功能。
ok,划出关键点:面向连接,可靠,基于字节流,传输层协议。
有几个疑问:
1.啥叫面向连接?
面向连接举例:两个人之间通过电话进行通信。
面向无连接举例:邮政服务,用户把信函放在邮件中期待邮政处理流程来传递邮政包裹。显然,不可达代表不可靠。
从程序实现的角度解析面向连接、面向无连接如下:
TCP面向连接,UDP面向无连接(在默认的阻塞模式下):
在TCP协议中,当客户端退出程序或断开连接时,TCP协议的recv函数会立即返回不再阻塞,因为服务端自己知道客户端已经退出或断开连接,证明它是面向连接的;
而在UDP协议中,recvfrom这个接收函数将会始终保持阻塞,因为服务端自己不知道客户端已经退出或断开连接,证明它是面向无连接的)。
说白了,面向 就是指 “知道,了解,针对于,基于”的含义。
2.怎么保证可靠?
交互:
建立连接:三次握手。
描述:
第一次握手
client(客户端)发送一个SYN(seq=x)包给server(服务器),然后“期待”server的ACK回复。p.s: seq为sequence(序列)的缩写,ACK为acknowledge(通知)的缩写。
第二次握手
server(服务器)接收到SYN(seq=x)包后就返回一个ACK(ack=x+1)包,意思是告诉client(客户端):我已经成功接收到你的SYN包。
并且自己也发送一个SYN(seq=y)包,然后”期待“client(客户端)的ACK回复。
第三次握手
client(客户端)接收到server(服务器)发回的ACK(ack=x+1)包后,然后就把自己的状态设置为ESTABLISHED(已建立连接)。
然后根据server(服务端)发回的SYN(seq=y)包,返回给”期待”中的server一个ACK(ack=x+1)包。期待中的server收到ACK回复,也把自己的状态设置为ESTABLISHED(已建立连接)。到此TCP三次握手完成,client与server可以正常进行通信了。
为什么需要三次握手?
这个问题的本质是, 前提就是信道不可靠, 但是通信双发需要就某个问题达成一致。而要解决这个问题, 无论你在消息中包含什么信息, 三次通信是理论上的最小值。 所以三次握手不是TCP本身的要求, 而是为了满足"在不可靠信道上可靠地传输信息"这一需求所导致的. 请注意这里的本质需求,信道不可靠, 数据传输要可靠。三次达到了, 那后面你想接着握手也好, 发数据也好, 跟进行可靠信息传输的需求就没关系了。 因此,如果信道是可靠的, 即无论什么时候发出消息, 对方一定能收到, 或者你不关心是否要保证对方收到你的消息, 那就能像UDP那样直接发送消息就可以了.”。
很简单:
就像两个人说话,A 对 B 发消息(第一次握手),B 读懂消息并且回复应答(第二次握手),A读懂消息并且回复应答(第三次握手)。确保两者可以互相交流,三次是最小值。
关闭连接:四次挥手
相关文章推荐
- Java网络编程 - 基于UDP协议 实现简单的聊天室程序
- 计算机网络协议层次
- Unity3D 网络通信_HTTP协议:获取网络图片、内容
- 要理解路由和交换的含义就一定要了解OSI七层协议,它是现在主流网络
- 视频播放相关的网络协议
- 通过分析网络数据包来理解DCOM协议(一)
- 常用三个网络协议
- 【网络】(三)流协议粘包问题
- 不错的网络协议栈测试工具 — Packetdrill
- 网络之RTSP协议
- Linux网络编程【六】:TCP协议高性能服务器(http)模型之I/O多路转接epoll
- NGN网络核心协议 - SIP 协议详解
- 【Linux网络编程】无连接和面向连接协议的区别
- 网络协议之三(ARP、RAPR)
- 网络常用协议名称解释
- linux kernel 网络协议栈之GRO(Generic receive offload)
- (网络层)路由协议
- 网络七层各种协议
- Java_网络编程_使用UDP协议发送及接收数据
- 网络协议MPL(3):RFC2606--The Trickle Algorithm文档翻译