socket网络编程笔记(一)

1.       网络应用程序模型
常见的有:
    B/S架构:即使用浏览器请求和执行的网络应用程序。
    C/S架构:即客户端服务器模型。
    客户端/服务器端模型:




客户端和服务器端的应用程序通常使用多层网络协议。
常见的TCP/IP协议族:web客户端和服务器使用TCP(transmission control protocol)协议,TCP使用IP协议与一个数据链路层(datalink layer)通信。

2.       客户端与服务器端使用TCP通信图示:




3.       OSI模型:

OSI模型(open system interconnection )开放式系统互联模型,是一个7层模型,从上往下依次是应用层(最靠近用户的OSI层,为用户应用程序),表示层(使用一张通用格式来实现多种数据格式之间的转换),会话层(通过传输层建立数据传输的通路),传输层(定义一些传输数据的协议和端口号),网络层(在位于不同地理位置的网络中的两个主机系统提供连接和路径选择),数据链路层(定义如何让格式化数据传输),物理层(主要定义物理设备),该模型与internet协议族的映射如下:

OSI模型物理层和数据链路层对应于设备驱动和系统中网络硬件。网络层由IPV4和IPV6协议处理。传输层可以使用UDP或者TCP。
在这,应用程序可以绕过传输层直接使用IPV4或者IPV6,称为原始套接字(raw socket)
OSI模型最上面三层,即应用层。Sockets编程接口位于应用层和传输层之间。
Sockets位于应用层和传输层之间的原因,在应用层中处理用户程序的细节,无需关心通信细节。而下面四层无需关心应用程序,需要处理所有的通信细节。上三层通常由用户进程形成,下四层通常由内核提供。



4.       UDP传输协议(User Datagram Protocol)


当应用程序向UDP socket写消息,消息封装如UDP数据包(datagram),之后UDP数据包被封装成一个IP数据包,发送至目的地。
问题是:缺乏可靠性。表现在,一个数据包到达了最终目的地,但是校验和检测出错,或者在传输过程中丢失,UDP socket将不会接收到数据包也不会自动重发。解决的方法,通常可以通过在应用程序上构建一个特性,对传输过程进行确认,超时设定等等。
每个UDP数据包都有一个长度,这个长度会跟随数据一起传送给应用程序,说明它是存在记录边界的。(TCP以字节流(byte-stream)传递,不存在记录边界)。
UDP提供一个无连接服务(connectionless service)。即一个UDP客户端可以创建socket向不同的服务器端发送数据包,客户端和服务器端不需要长时间保持连接。(区别与下面的TCP协议)

5.       TCP传输协议(Transmission  control protocol)

TCP的可靠性:TCP提供了可靠性。当发送数据至另一端时,TCP需要一个来自另一端的确认(acknowledgment)。如果没有收到确认,TCP自动重新发送数据并等待更长的一段时间(等待确认)。经过多次重新连接后,TCP最终将放弃。

    TCP通过结合每个字节的序列号来顺序化数据。例如,假设一个应用程序向TCP socket写了2048个字节,这使得TCP将发送两个部分(segment),第一部分包含的数据序列号从1-1024,第二部分包含的数据序列号从1025-2048。

注:一个部分(segment)指的是TCP传递给IP的数据单元。如果各部分没有按照次序到达,接收端的TCP将在传递数据给应用程序之前,基于它们的序列号重新排列各部分的次序。如果接收端收到了重复的数据,接收端的TCP可以检测到数据的重复(根据序列号)并且丢弃重复数据。
    TCP提供了流控(flow control)。TCP总会告诉另一端在任何一个时刻,它可以接收多少字节的数据。这称之为advertised window。window指的是接收缓冲区中当前可用的空间大小,这可以保证发送者不会溢出(overflow)接收缓冲区。
(window的尺寸是动态变化的:当接收到发送者的数据时,window尺寸减小;当应用程序从缓冲区中读取数据时,window
尺寸变大。window的尺寸也可以为0,此时表示TCP的缓冲区满了,必须等待应用程序从缓冲区中读取数据,这样才可以继续从另一端接收更多的数据。)


6.       TCP的连接的建立:

(1)       服务器准备接受(accept)一个连接(incoming connection)。Passive open(被动打开),通常调用socket,bind和listen函数。
(2)       客户端通过调用connect发起一个主动打开(active open)。引起客户端TCP发送一个“ synchronize”(SYN)段。SYN段告诉服务器客户端待发送的数据的初始化序列号。
(3)       服务器告诉客户端(acknowledge(ACK))收到了SYN段,并且发送自己的SYN段( 包含待待发送的数据的初始化序列号),服务器在一个segment中发送SYN和客户端SYN的ACK。
(4)       客户端必须确认(acknowledge)服务器的SYN段。

    (SYN是TCP/IP建立连接时使用的握手信号)


7.       TCP的三次握手:(three-way handshake)



 简述:第一次握手,客户端发送syn抱(syn=j)到服务器,并进入SYN_SENT(表示请求连接状态),等待服务器端的确认。(SYN:同步序列编号(synchronize sequence number)。
      第二次握手,服务器收到syn包,必须要确认客户端的syn(ack=j+1),同时发送自己的syn包(syn=k)即向客户端发送syn+ack包,进入SYN_RECV状态.
   第三次握手,客户端收到服务器端的SYN+ACK包,向服务器发送ACK(ACK=K+1),发送完成后,客户端和服务器端进入连接状态,完成三次握手。



8.       TCP链接的终止(四次分手):
(1)        应用程序(客户端)调用close函数(active close),此时TCP向服务器发送一个FIN段,表明发送数据结束。
(2)       另一端接收到FIN段后执行被动关闭(passive close)。这个FIN由服务器端的TCP确认后,也做为一个文件结束标志(end-of-file)发送给接收端的应用进程。
(3)       一段时间后,接收到end-of-file的应用程序将调用close函数关闭socket套接字,使得它的TCP也发送一个FIN。
(4)       系统中的TCP接收到这个最终的FIN后(另一端已经执行了active close)将告知对方(执行主动关闭的那一端)已经收到FIN,因为每个方向需要一个FIN和ACK,通常需要4个段。









 
发布了61 篇原创文章 · 获赞 6 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/shayueqing/article/details/12906863