OSI七层
物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
物理层涉及信道上传输的比特流。
数据链路层的主要任务是加强物理层传输原始比特流的功能,是指对应的网路层显现为一条无错线路。发送包把数据封装在数据帧,按顺序传送出去并处理接收方会送的确认帧。
网络层关系到子网的运行控制,其中一个关键问题是确认从源端到目的算如何选择路由。
传输层的基本功能是从会话层接收数据而且把其分成较小的单元传递给网络层。
会话层允许不同机器上的用户建立会话关系。
表示层用来完成某些特定的功能。
应用层包含着大量人们普遍需要的协议。
TCP和UDP
TCP是传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须现在双方,之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发、丢弃重读数据、检验数据、流量控制等功能,保证数据能从一端传到另一端。
UDP是用户数据报协议,是一个简单地面向数据报的运输协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不保证它们能够到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度快。
TCP就像是打电话,两者之间必须有一条不间断的通路,数据不到达对方,对方就一直在等待,除非对方直接挂电话。先说的话先到,后说的话后到,有顺序。
UDP就像寄一封信,发现者只管发,不管到。但是你的新风尚必须写明对方的资质。发现者和收信者之间没有通路,靠邮电局联系。信发到时可能已经过了很久,也可能根本没有发到。先发的信未必先到,后发的信也未必后到。
Socket套接字
Socket相当于进行网络通信两端的插座,只要对方的Socket和自己的Socket有通信联接,双方就可以发送和接收数据了。其定义类似于文件句柄的定义。如果你要编写的是一个服务程序,那么先调用socket()创建一个套接字,调用bind()绑定IP地址和端口号,然后启动一个死循环,循环中调用accept()接受连接。对于每个接受的链接,可以启动多线程方式进行处理,在线程中调用send()、recv()发送和接收数据。
如果要编写的是一个客户端程序,那么久简单多了,先调用socket()创建一个套接字,然后调用connect()链接服务器,之后就是调用send()、recv()发送和接受数据了。
服务器端程序编写:
1. 调用ServerSocket(int port)创建一个服务器端套接字,并绑定到制定端口上。
2. 调用accept(),监听连接请求,则接收连接,返回通信套接字。
3. 调用Socket类的getOutStream()和getInputStream()获取输出流和输入流,开始网络数据的发送和接收。
4. **关闭通信套接字**Socket.close()。
客户端程序编写:
1. 调用Socket()创建一个流套接字,并连接到服务器端。
2. 调用Socket类的getOutStream()和getInputStream()获取输出流和输入流,开始网络数据的发送和接收。
3. **关闭通信套接字**Socket.close()。
TCP三次握手四次握手
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用3次握手建立一个连接。
第1次握手:建立连接时,客户端发送SYN包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认。
第2次握手:服务器收到SYN包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。
第3次握手:客户端和服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此时发送完毕,客户端和服务器进入ESTABLISHED状态,完成3次握手。
完成3次握手,客户端与服务器开始传送数据。在上述过程中,还有一些概念。
未连接队列:在3次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待的客户的确认包。这些条目所标识的链接在服务器处于Syn_RECV状态,当服务器收到客户的确认保湿,删除该条目,服务器进入ESTABLISHED状态。
Backlog参数:标识未连接队列的最大容纳数目。
SYN-ACK重传次数:服务器发送完SYN_ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次冲床,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。
半连接存活时间:是指半连接队列的条目存活的最长时间,即服务从收到SYN包到确认这个报文无效的最长时间,该时间值是左右重传请求包的最长等待时间总和。有时我们也成办理按揭存活时间为Timeout时间、SYN_RECV存活时间。