01.Python修炼之路【01-网络】(2018.04.20)

关键字:TCP/IP协议、OSI七层模型、TCP/IP四层模型、端口、三次握手、四次挥手

1、TCP/IP:传输控制协议/因特网协议

2、模型分层:TCP/IP(5层):数据链路层、网络层、传输层、应用层。
OSI( 7层):物理层、数据链路层、网络层、传输层、会话层、传输层、应用层。

3、端口:
(0)含义:面向连接服务和无连接服务的通信协议端口;端口其实就是队,操作系统为各个进程分配了不同的队,数据报按照目的端口被推入相应的队中,等待被进程取用;不光接受数据报的进程需要开启它自己的端口,发送数据报的进程也需要开启端口,这样,数据报中将会标识有源端口,以便接受方能顺利的回传数据报到这个端口。“端口就好一个房子的门,是出入这间房子的必经之路。”

(1)作用:
(a)用来区分进程;【pid用来区分一台电脑上的端口号,在多台电脑上不适用】
(b)使用方式:IP地址+端口号
(c)端口并不是一一对应的例如:服务器的端口:80,客户机:任意

(2)分类:
(a)按协议类型分TCP端口和UDP端口
从端口的分配来看:分为固定端口(0-1023),**80端口分配给HTTP服务
21端口分配给FTP服务;
(b)动态端口(1024-65536)动态分配指当一个系统进程或应用程序进程需要网络通信时,它向主机申请一个端口,主机从可用的端口号中分配一个供它使用。
当这个进程关闭时,同时也就释放了所占用的端口号。

(3)端口是通过端口号来标记的,端口号只有整数,范围是从0到65535

(4)怎样查看端口 ? 用“netstat -an”查看端口状态

注:
1、端口是随机分配的

在一个OS中,当运行某个进程时,OS会为其分配一个端口,在该进程运行结束后,会释放该端口,在下次再次运行该进程时,OS又会重新为其分配一个端口。

2、端口不能相同

如果某个端口被占用了,那么在这个进程释放这个端口前,其他的进程不能使用该端口。
原因:端口是用来区分不同的进程的。若端口号相同,则会造成数据不能够发送到正确的进程之上。因此,不允许相同。

———————————————–UDP、TCP————————————————

TCP:
TCP 传输控制协议(Transmission Control Protocol)

是一种面向连接的、可靠的、基于字节流的传输层通信协议。是专门为了在不可靠的互联网络上提供一个可靠的端到端字节流而设计的,面向字节流。

UDP:
UDP 用户数据报协议(User Datagram Protocol)
是iso参考模型中一种无连接的传输层协议,提供面向操作的简单不可靠的非连接传输层服务,面向报文。

区别:

1、tcp是基于连接的,可靠性高;udp是基于无连接的,可靠性较低;

2、由于tcp是连接的通信,需要有三次握手、重新确认等连接过程,会有延时,实时性差;同时过程复杂,也使其易于被攻击;而udp无连接,无建立连接的过程,因而实时性较强,也稍安全;

3、在传输相同大小的数据时,tcp首部开销20字节;udp首部开销只有8个字节,tcp报头比udp复杂,故实际包含的用户数据较少。tcp无丢包,而udp有丢包,故tcp开销大,udp开销较小;

4、每条tcp连接只能是点到点的;udp支持一对一、一对多、多对一、多对多的交互通信。

应用:

如果对实时性要求高和高速传输的场合下需要使用udp;如果需要传输大量数据且对可靠性要求高的情况下应该使用tcp;在可靠性要求较低,追求效率的情况下应该使用udp。

对于tcp来说,既然需要面向连接,就会涉及到三个阶段:连接建立、数据传送、连接释放三个过程;而“三次握手”就发生在连接建立这个阶段,下面对三次握手和四次挥手解释一下:

TCP三次握手:

第一次握手:客户端发送一个TCP的SYN标志位置为1的包(连接请求),指明客户打算连接服务器的端口;

第二次握手:当服务器收到连接请求之后,返回确认包(ACK)应答,即将SYN和ACK标志位同时致为1(授予连接),并为这次连接分配资源;

第三次握手:客户端收到服务器的授予连接请求之后,再次发送确认包(ACK)(SYN标志位为0,ACK标志位为1),并分配资源,这样TCP就建立连接了。

TCP四次挥手:

中断连接端可以是客户端也可以是服务端

假设是客户端发起的中断连接请求,则客户端发送fin报文,服务端接收到客户端发送的fin报文后,意思是说:“客户端已经没有数据要发送给你了”,但是这时候如果服务端有数据没有发送完成,则不必着急关闭socket,可以继续发送数据,所以服务端先发送ack,告诉客户端,收到了客户端刚才的关闭连接请求,但是服务端还没有准备好,还有数据没有发送完,所以请客户端继续等我的消息,这个时候客户端就进入了fin_wait状态,继续等待服务端的fin报文;当服务端确定已经发送完数据后,则想客户端发送fin报文,告诉客户端已经发送完数据,可以关闭连接了;当客户端接收到服务端的fin报文后,就知道可以关闭连接了,但是还是不相信网络,怕服务端不知道要关闭,所以客户端发送ack给服务端后进入了time_wait状态,如果服务端没有收到ack则可以重传;服务端收到ack后,就知道可以关闭连接了;当服务端等待了2msl后依然没有收到回复,则证明服务端已经正常关闭了,那客户端也会关闭连接了,就这样,tcp连接就完成了关闭。
TCP十种状态
TCP十种状态

当一端收到一个FIN,内核让read返回0来通知应用层另一端已经终止了向本端的数据传送
发送FIN通常是应用层对socket进行关闭的结果

这里写图片描述
TCP与UDP的区别

TCP中,如果一方收到了对方的数据,那么它一定会发送ACK确认包给发送方
然而UDP中,却没有这个过程,因此导致了TCP稳定,UDP不稳定

补充:TCP超时重传

超时重传指的是,发送数据包在一定的时间周期内没有收到相应的ACK,等待一定的时间,超时之后就认为这个数据包丢失,就会重新发送。这个等待时间被称为RTO.

TCP丢包原因:
TCP协议本身是保证传输的数据完整性不会丢数据的。
如果通信中发现缺少数据或者丢包,
那么,最大的可能在于程序发送的过程或者接收的过程出现问题。

例如服务器给客户端发大量数据,Send的频率很高,
那么就有可能在Send时发生错误(原因可能是又多种,可能是程序处理逻辑问题,多线程同步问题,缓冲区溢出问题等等)
如果没有对Send失败做处理重发数据,那么客户端收到的数据就会比理论应该收到的少,就会造成丢数据,丢包的现象。

猜你喜欢

转载自blog.csdn.net/youyouwuxin1234/article/details/80014536
01-