C#网络编程(学习笔记)
我学习的时候总是喜欢将别人的文章或者程序从头到尾敲一遍,感觉这样比较有耐心,学习的积极性较高,现在我换一种"做笔记"的学习方式,就是把学习时遇到的关键点列出来,然后针对重要的概念进行补充说明。
本文是学习笔记,原文请看:http://www.cnblogs.com/JimmyZhang/archive/2008/09/07/1286300.html
1 TCP是面向连接的。
下面讲解一下TCP的三次握手是如何建立的:
(1)第一次握手,建立连接时,客户端发送syn包(syn=j)到服务器,并进入syn_send状态,等待服务器确认。(SYN是TCP/IP建立连接时使用的握手信号。)
(2)第二次握手,服务器收到syn,必须确认客户端的syn(ack=j+1),然后发送syn+ack(ack=k)包,进入syn_recv状态,等待客户端确认。
(3)第三次握手,客户端收到syn+ack包,发送确认syn(ack=k+1),客户端与服务器端同时进入established状态。
2 TCP是全双工的
下面讲解一下什么是全双工、半双工、单工通信,假设有主机A和B。
(1)单工:只能从主机A向B发送数据。
(2)半双工:A向B发送数据,或者B向A发送数据,但是不能同时进行。
(3)全双工:可以A向B发送数据,同时B向A发送数据。
3 TCP是点对点通信
也就是说我们只能在主机a和主机b之间通信,而不能将a的数据发送给多个接收者。
4 套接字socket
套接字是用来标识不同的应用程序使用相同TCP或UDP服务的,套接字既可以使用可靠地tcp连接,也可以使用不可靠的udp连接,socket = (主机号+tcp或udp+端口号).
要通过互联网进行通信,必须建立一对套接字,一个运行在客户端叫ClientSocket,一个运行在服务器端叫ServerSocket,建立套接字的过程分为三步:
(1)服务器监听,服务器什么都不干,就坐在那里等电话。
(2)客户端请求,客户端需要知道服务器的电话号码(服务器端套接字的主机号和端口号),然后向对方拨打电话。
(3)连接确认,服务器收到请求后,建立一个新的线程,把服务器套接字信息发送给客户端,继续监听其他的客户端请求。
5 端口
两个主机a和b,他们有多个应用程序需要通信,那么使用端口标识这些应用程序,就可以知道哪个应用程序在通信了。
6 TcpListener和TcpClient
这两个类是.net专门针对网络编程提供的,使用这两个类就可以对套接字编程。
TcpListener是一个监听对象,当有请求的时候,它创建一个TcpClient和对方通信,然后自己继续监听。TcpClient既可以发送数据也可以接收数据。
摘录:我们考虑这样一种情况:两台主机,主机A和主机B,起初它们谁也不知道谁在哪儿,当它们想要进行对话时,总是需要有一方发起连接,而另一方则需要对本机的某一端口进行侦听。而在侦听方收到连接请求、并建立起连接以后,它们之间进行收发数据时,发起连接的一方并不需要再进行侦听。因为连接是全双工的,它可以使用现有的连接进行收发数据。而我们前面已经做了定义:将发起连接的一方称为客户端,另一段称为服务端,则现在可以得出:总是服务端在使用TcpListener类,因为它需要建立起一个初始的连接。