Ngày nay với sự phát triển mạnh mẽ của tin học và công nghệ Internet, hầu như mọi người đều thấy rõ lợi ích mà các dịch vụ do mạng Internet mang lại.Dịch vụ thư điện tử gọi tắt là Email là một trong nhưng dịch vụ được sử dụng nhiều nhất trên Internet hiện nay. Dịch vụ này cho phép các cá nhân hay tổ chức trao đổi thư với nhau thông qua mạng Internet. Nhiều người sử dụng Internet chỉ để dùng dịch vụ này.
LỜI NÓI ĐẦU Ngày với phát triển mạnh mẽ tin học công nghệ Internet, người thấy rõ lợi ích mà dòch vụ mạng Internet mang lại Dòch vụ thư điện tử gọi tắt Email dòch vụ sử dụng nhiều Internet Dòch vụ cho phép cá nhân hay tổ chức trao đổi thư với thông qua mạng Internet Nhiều người sử dụng Internet để dùng dòch vụ Thông thường, sử dụng dòch vụ thư tín điện tử, người sử dụng thường quan tâm xem hệ thống bên thực Vì vậy, họ ( người sử dụng) thấy nửa ứng dụng dòch vụ Email phần ứng dụng gọi Mail Client, sử dụng dòch vụ thư tín máy trạm Nhằm mục đích hiểu rõ hoạt động bên ứng dụng Email phần cung cấp dòch vụ mà thường gọi Mail Server, đồ án xin trình bày cách hệ thống phục vụ việc truyền thư tín điện tử sở tìm hiểu mô hình truyền thông thư tín, giao thức truyền thông chuẩn, hoạt động hệ Mail Server Vì thời gian có hạn có nhiều vấn đề có liên quan, đồ án trình bày vấn đề dòch vụ thư tín điện tử cài đặt chương trình mang tính thử nghiệm dòch vụ thư tín điện tử mà Trang PHẦN : CƠ SỞ LÝ THUYẾT CHƯƠNG : GIỚI THIỆU CHUNG VỀ INTERNET VÀ MỘT SỐ GIAO THỨC TRUYỀN THÔNG TRÊN INTERNET 1.1 GIỚI THIỆU CHUNG VỀ INTERNET M¹ng Internet lµ mét tËp hỵp gåm hµng v¹n hƯ m¹ng trªn kh¾p thÕ giíi, ®ỵc ph¸t triĨn vµo thËp kû b¶y m¬i Sè lỵng m¸y tÝnh nèi m¹ng vµ sè lỵng ngêi truy cËp vµo m¹ng Internet trªn toµn thÕ giíi ®ang ngµy cµng t¨ng lªn nhanh chãng, ®Ỉc biƯt tõ n¨m 1993 trë ®i M¹ng Internet kh«ng chØ cho phÐp chun t¶i th«ng tin nhanh chãng mµ cßn gióp cung cÊp th«ng tin, nã còng lµ diƠn ®µn vµ lµ th viƯn toµn cÇu ®Çu tiªn M¹ng Internet cã xt xø n¨m 1969 tõ m¹ng m¸y tÝnh toµn cơc ARPANET c¬ quan qu¶n lý c¸c dù ¸n nghiªn cøu c¸c c«ng tr×nh nghiªn cøu khoa häc tiªn tiÕn thc Bé Qc phßng Mü (US Defense’s Advance Research Projects Agency - gäi t¾t lµ DARPA) tµi trỵ Tõ gi÷a n¨m 1970, trung t©m DARPA híng tíi m¹ng Internet víi kü tht chun m¹ch gãi qua m¹ng v« tun vµ th«ng tin vƯ tinh N¨m 1980, DARPA thư nghiƯm dïng giao thøc TCP/IP vµ ®· ®ỵc c¸c trêng ®¹i häc ë Mü ghÐp nèi víi hƯ ®iỊu hµnh UNIX BSD (Berkely Software Distribution) HƯ ®iỊu hµnh UNIX lµ hƯ ph¸t triĨn m¹nh víi rÊt nhiỊu c«ng hç trỵ vµ ®¶m b¶o c¸c phÇn mỊm øng dơng cã thĨ chun qua l¹i trªn c¸c hä m¸y kh¸c (m¸y mini, m¸y tÝnh lín vµ hiƯn lµ m¸y vi tÝnh) Bªn c¹nh ®ã hƯ ®iỊu hµnh UNIX BSD cßn cung cÊp nhiỊu thđ tơc Internet c¬ b¶n, ®a kh¸i niƯm Socket vµ cho phÐp ch¬ng tr×nh øng dơng th©m nhËp vµo Internet mét c¸ch dƠ dµng CÊu tróc m¹ng Internet gåm cã: ♦ TÇng øng dơng: TELNET, FTP, SMTP; ♦ TÇng giao vËn: TCP, UDP; ♦ TÇng Internet: Internet Protocol; ♦ TÇng m¹ng: X.25, Ethernet, FDDI .; ♦ TÇng vËt lý: lµ c¸c m«i trêng trun tin kh¸c 1.2 HỌ GIAO THỨC TCP/IP TCP/IP lµ hä cđa c¸c giao thøc ®ỵc sư dơng cho viƯc trun th«ng m¸y tÝnh C¸c ch÷ c¸i ®ỵc viÕt t¾t bëi c¸c tõ (Transmission Control Protocol/Internet Protocol), hai giao thøc nµy cã c¸ch biĨu diƠn kh¸c nhau, ngêi ta Ýt sư dơng víi c¸i tªn ®Çy ®đ cđa hai giao thøc nµy Thêng c¸c giao thøc ®ỵc nhãm l¹i thµnh c¸c hä (®«i cßn ®ỵc gäi lµ c¸c suites hay c¸c stacks) C¸c giao thøc nµo ®ỵc nhãm l¹i víi thêng ®ỵc x¸c ®Þnh bëi c¸c bé cµi ®Ỉt cđa giao thøc Trang Hä giao thøc TCP/IP bao gåm c¸c giao thøc nh lµ IP (Internet Protocol) , ARP (Address Resolution Protocol), ICMP (Internet Control Message Protocol), UDP (User Datagram Protocol), TCP (Transport Control Protocol), RIP (Routing Information Protocol), Telnet, SMTP (Simple Mail Transfer Protocol), DNS (Domain Name System) vµ mét sè c¸c giao thøc kh¸c H×nh bªn díi m« t¶ kiÕn tróc cđa m¹ng TCP/IP cã so s¸nh víi m« h×nh tham chiÕu OSI ®Ĩ chóng ta h×nh dung ®ỵc sù t¬ng øng vỊ chøc n¨ng cđa c¸c tÇng OSI Model Layers Application Layer Presentation Layer Session Layer Transport Layer TCP/IP Protocol Architecture Layers Application Layer Telnet Host-to-Host Transport Layer Network Layer Internet Layer Data Link Layer Network Interface Layer Physical Layer TCP/IP Protocol Suite FTP SMTP DNS TCP SNMP UDP IP ARP Ethernet RIP Token Ring IGMP ICMP Frame Relay ATM So s¸nh c¸c kiÕn tróc ISO vµ TCP/IP TCP/IP thùc chÊt lµ mét hä giao thøc cïng lµm viƯc víi ®Ĩ cung cÊp ph¬ng tiƯn trun th«ng liªn m¹ng Trong phÇn nµy chóng ta sÏ xem xÐt giao thøc IP, giao thøc TCP vµ mét sè øng dơng ë tÇng trªn nh Telnet, FTP, DNS, SMTP 1.3 GIAO THỨC LIÊN MẠNG IP Mơc ®Ých chÝnh cđa IP lµ cung cÊp kh¶ n¨ng kÕt nèi c¸c m¹ng thµnh liªn m¹ng ®Ĩ trun d÷ liƯu Vai trß cđa IP t¬ng tù vai trß cđa giao thøc tÇng m¹ng m« h×nh OSI IP lµ mét giao thøc kiĨu ”kh«ng liªn kÕt” (connectionless) cã nghÜa lµ kh«ng cÇn cã giai ®o¹n thiÕt lËp liªn kÕt tríc trun d÷ liƯu §¬n vÞ d÷ liƯu dïng IP ®ỵc gäi lµ datagram, cã khu«n d¹ng chØ h×nh bªn díi ý nghÜa cđa c¸c tham sè nh sau: • VER (4 bits): chØ version hiƯn hµnh cđa IP ®ỵc cµi ®Ỉt Trang • IHL (4 bits): chØ ®é dµi phÇn ®Çu (Internet Header Length) cđa datagram, tÝnh theo ®¬n vÞ tõ (word = 32 bits) §é dµi tèi thiĨu lµ tõ (20 bytes) VE R 34 IH L 78 15 16 Type of Service Indentification Time to live Header Total Length Fla gs Protocol 31 Fragment offset Header Checksum Source Address Destination Address Options + Padding Data (max: 65.535 bytes) Khu«n d¹ng cđa IP datagram • Type of service (8 bits): ®Ỉc t¶ c¸c tham sè vỊ dÞch vơ, cã d¹ng thĨ nh sau: Preceden ce D T R Reser ved ®ã: Precedence (3 bits): chØ thÞ vỊ qun u tiªn gưi datagram, thĨ lµ: 111 - Network Control (cao nhÊt) 011 - Flash 110 - Internetwork Control 010 - Immediate 101 - CRITIC/ECP 001 - Priority 100 - Flas Override 000 - Routine (thÊp nhÊt) D (Delay) (1 bit): chØ ®é trƠ yªu cÇu D = ®é trƠ b×nh thêng D = ®é trƠ thÊp T (Throughput) (1 bit): chØ th«ng lỵng yªu cÇu T = th«ng lỵng b×nh thêng T = th«ng lỵng cao R (Reliability) (1 bit): chØ ®é tin cËy yªu cÇu R = ®é tin cËy b×nh thêng R = ®é tin cËy cao • Total Length (16 bits): chØ ®é dµi toµn bé datagram, kĨ c¶ phÇn header (tÝnh theo ®¬n vÞ bytes) Trang • Indentification (16 bits): cïng víi c¸c tham sè kh¸c (nh Source Address vµ Destination Address) tham sè nµy dïng ®Ĩ ®Þnh danh nhÊt cho mét datagram kho¶ng thêi gian nã vÉn cßn trªn liªn m¹ng • Flags (3 bits): liªn quan ®Õn sù ph©n ®o¹n (fragment) c¸c datagram, thĨ lµ: 0 D F M F Bit 0: reserved - cha sư dơng , lu«n lÊy gi¸ trÞ Bit (DF) = (May Fragment) = (Don’t Fragment) Bit (MF) = (Last Fragment) = (More Fragment) • Fragment Offset (13 bits): chØ vÞ trÝ cđa ®o¹n (fragment) ë datagram, tÝnh theo ®¬n vÞ 64 bits, cã nghÜa lµ mçi ®o¹n (trõ ®o¹n ci cïng) ph¶i chøa mét vïng d÷ liƯu cã ®é dµi lµ béi sè cđa 64 bits • Time to live (8 bits): qui ®Þnh thêi gian tån t¹i (tÝnh b»ng gi©y) cđa datagram liªn m¹ng ®Ĩ tr¸nh t×nh tr¹ng mét datagram bÞ qn trªn liªn m¹ng Thêi gian nµy ®ỵc cho bëi tr¹m gưi vµ ®ỵc gi¶m ®i (thêng qui íc lµ ®¬n vÞ) datagram ®i qua mçi router cđa liªn m¹ng • Protocol (8 bits): chØ giao thøc tÇng trªn kÕ tiÕp sÏ nhËn vïng d÷ liƯu ë tr¹m ®Ých (hiƯn t¹i thêng lµ TCP hc UDP ®ỵc cµi ®Ỉt trªn IP) • Header Checksum (16 bits): m· kiĨm so¸t lçi 16 bits theo ph¬ng ph¸p CRC, chØ cho vïng header • Source Address (32 bits): ®Þa chØ cđa tr¹m ngn • Destination Address (32 bits): ®Þa chØ cđa tr¹m ®Ých • Options (®é dµi thay ®ỉi): khai b¸o c¸c options ngêi gưi yªu cÇu • Padding (®é dµi thay ®ỉi): vïng ®Ưm, ®ỵc dïng ®Ĩ ®¶m b¶o cho phÇn header lu«n kÕt thóc ë mét mèc 32 bits • Data (®é dµi thay ®ỉi): vïng d÷ liƯu, cã ®é dµi lµ béi sè cđa bits, vµ tèi ®a lµ 65535 bytes S¬ ®å ®Þa chØ ho¸ ®Ĩ ®Þnh danh c¸c tr¹m (host) liªn m¹ng ®ỵc gäi lµ ®Þa chØ IP 32 bits (32- bit- IP address) Mçi ®Þa chØ IP cã ®é dµi 32 bits ®ỵc t¸ch thµnh vïng (mçi vïng byte), cã thĨ ®ỵc biĨu thÞ díi d¹ng thËp ph©n, b¸t ph©n, thËp lơc ph©n hc nhÞ ph©n C¸ch viÕt phỉ biÕn nhÊt lµ dïng ký ph¸p thËp ph©n cã dÊu chÊm (dotted decimal notation) ®Ĩ t¸ch c¸c vïng Mơc ®Ých cđa ®Þa chØ IP lµ ®Ĩ ®Þnh danh nhÊt cho mét host bÊt kú trªn liªn m¹ng Do tỉ chøc vµ ®é lín cđa c¸c m¹ng (subnet) cđa liªn m¹ng cã thĨ kh¸c nhau, ngêi ta chia c¸c ®Þa chØ IP thµnh líp, ký hiƯu lµ A, B, C, D vµ E, víi cÊu tróc ®ỵc chØ h×nh bªn díi Trang 15 16 23 24 31 Líp A netid Líp B Líp C 1 Líp D 1 Líp E 1 1 hostid netid Hostid netid hostid Multicast address Reserved for future use CÊu tróc cđa c¸c líp ®Þa chØ IP • Líp A cho phÐp ®Þnh danh tíi 126 m¹ng, víi tèi ®a 16 triƯu host trªn mçi m¹ng Líp nµy ®ỵc dïng cho c¸c m¹ng cã sè tr¹m cùc lín • Líp B cho phÐp ®Þnh danh tíi 16384 m¹ng, víi tèi ®a 65534 host trªn mçi m¹ng • Líp C cho phÐp ®Þnh danh tíi triƯu m¹ng, víi tèi ®a 254 host trªn mçi m¹ng Líp nµy ®ỵc dïng cho c¸c m¹ng cã Ýt tr¹m • Líp D dïng ®Ĩ gưi IP datagram tíi mét nhãm c¸c host trªn mét m¹ng • Líp E dù phßng ®Ĩ dïng t¬ng lai VÝ dơ: 00001 010 00000 000 00000 000 00000 000 = 10.0.0.0 (Líp A) netid = 10 10000 000 00000 011 00000 010 00000 011 11000 000 00000 000 00000 001 11111 111 = 128.3.2.3 (Líp B) netid = 128.3 hostid = 2.3 = 192.0.1.255 (Líp C) netid = 192.0.1 hostid = 255 híng ®Õn tÊt c¶ c¸c host Mét ®Þa chØ cã hostid (host identifier) b»ng ®ỵc dïng ®Ĩ híng tíi m¹ng ®Þnh danh bëi vïng netid (network identifier) Ngỵc l¹i, mét ®Þa chØ cã vïng hostid gåm toµn sè ®ỵc dïng ®Ĩ híng tíi tÊt c¶ c¸c host nèi vµo m¹ng netid, vµ nÕu vïng netid còng gåm toµn sè th× nã híng tíi tÊt c¶ c¸c host liªn m¹ng Trong nhiỊu trêng hỵp, mét m¹ng cã thĨ ®ỵc chia thµnh nhiỊu m¹ng (subnet), lóc ®ã cã thĨ ®a thªm c¸c vïng subnetid ®Ĩ ®Þnh danh c¸c m¹ng Vïng subnet ®ỵc lÊy tõ hostid, thĨ ®èi víi líp A, B, C nh sau (h×nh bªn díi) Trang Netid Subnetid Hostid 15 16 Netid Subnetid (Líp A) 23 24 15 16 31 Hostid 23 24 Netid Subn etid (Líp B) 31 Host id (Líp C) Bỉ sung vïng subnetid CÇn lu ý r»ng c¸c ®Þa chØ IP ®ỵc dïng ®Ĩ ®Þnh danh c¸c host vµ m¹ng ë tÇng m¹ng cđa M« h×nh OSI, vµ chóng kh«ng ph¶i lµ c¸c ®Þa chØ vËt lý (hay ®Þa chØ MAC Media Access Control) cđa c¸c tr¹m ®ã trªn mét m¹ng cơc bé (Ethernet,Token Ring ) Trªn mét m¹ng cơc bé nh vËy, hai tr¹m chØ cã thĨ liªn l¹c víi nÕu chóng biÕt ®Þa chØ vËt lý cđa Nh vËy, vÊn ®Ị ®Ỉt lµ ph¶i thùc hiƯn ¸nh x¹ gi÷a ®Þa chØ IP (32 bits) vµ ®Þa chØ vËt lý (48 bits) cđa mét tr¹m Giao thøc ARP (Address Resolution Protocol) ®· ®ỵc x©y dùng ®Ĩ chun ®ỉi tõ ®Þa chØ IP sang ®Þa chØ vËt lý cÇn thiÕt Ngỵc l¹i, giao thøc RARP (Reverse Address Resolution Protocol) ®ỵc dïng ®Ĩ chun ®ỉi tõ ®Þa chØ vËt lý sang ®Þa chØ IP Chó ý r»ng c¶ ARP vµ RARP ®Ịu kh«ng ph¶i lµ bé phËn cđa IP IP sÏ dïng ®Õn chóng cÇn Mét giao thøc kh¸c còng liªn quan trùc tiÕp ®Õn IP, ®ã lµ ICMP (Internet Control Message Protocol) Giao thøc nµy thùc hiƯn trun c¸c th«ng b¸o ®iỊu khiĨn (b¸o c¸o vỊ c¸c t×nh tr¹ng lçi trªn m¹ng, ) gi÷a c¸c gateway hc tr¹m cđa liªn m¹ng T×nh tr¹ng lçi cã thĨ lµ: mét datagram kh«ng thĨ tíi ®ỵc ®Ých cđa nã, hc mét router kh«ng ®đ bé nhí ®Ưm ®Ĩ lu vµ chun mét datagram, Mét th«ng b¸o ICMP ®ỵc t¹o vµ chun cho IP IP sÏ ”bäc” (encapsulate) th«ng b¸o ®ã víi mét IP header vµ trun ®Õn cho router hc tr¹m ®Ých Chóng ta cã thĨ tãm t¾t c¸c bíc thùc hiƯn bëi mét thùc thĨ IP nh sau: • §èi víi thùc thĨ IP ë tr¹m ngn, nhËn ®ỵc mét primitive SEND tõ tÇng trªn , nã thùc hiƯn c¸c bíc sau ®©y: T¹o mét IP datagram dùa trªn c¸c tham sè cđa primitive SEND TÝnh checksum vµ ghÐp vµo header cđa datagram Ra qut ®Þnh chän ®êng: hc lµ tr¹m ®Ých n»m trªn cïng m¹ng hc mét gateway sÏ ®ỵc chän cho chỈng tiÕp theo Chun datagram xng tÇng díi ®Ĩ trun qua m¹ng • §èi víi gateway, nhËn ®ỵc mét datagram qu¸ c¶nh, nã thùc hiƯn c¸c ®éng t¸c sau: TÝnh checksum, nÕu bÊt cËp th× lo¹i bá datagram Gi¶m gi¸ trÞ cđa tham sè Time-to-Live NÕu thêi gian ®· hÕt th× lo¹i bá datagram Ra qut ®Þnh chän ®êng Ph©n ®o¹n datagram, nÕu cÇn KiÕn t¹o l¹i IP header, bao gåm gi¸ trÞ míi cđa c¸c vïng Time-to-Live, Fragmentation vµ Checksum Trang Chun datagram xng tÇng díi ®Ĩ trun qua m¹ng • Ci cïng, mét datagram ®ỵc nhËn bëi thùc thĨ IP ë tr¹m ®Ých, nã sÏ thùc hiƯn c¸c c«ng viƯc sau: TÝnh checksum NÕu bÊt cËp th× lo¹i bá datagram TËp hỵp c¸c ®o¹n cđa datagram (nÕu cã ph©n ®o¹n) Chun d÷ liƯu vµ c¸c tham sè ®iỊu khiĨn lªn tÇng trªn b»ng c¸ch dïng primitive DELIVER 1.4 GIAO THỨC ĐIỀU KHIỂN TRUYỀN TCP bit 15 16 Source Port 31 Destination Port Sequence Number Acknowledgment Number D a t a o f f s e t UR AC PS RSSY FIN G K H TN Reser ved Window Checksum Urgent Pointer Options Padding TCP data Khu«n d¹ng cđa TCP segment TCP lµ mét giao thøc kiĨu ”cã liªn kÕt” (connection - oriented), nghÜa lµ cÇn ph¶i thiÕt lËp liªn kÕt (logic) gi÷a mét cỈp thùc thĨ TCP tríc chóng trao ®ỉi d÷ liƯu víi §¬n vÞ d÷ liƯu sư dơng TCP ®ỵc gäi lµ segment (®o¹n d÷ liƯu), cã khu«n d¹ng m« t¶ h×nh bªn díi C¸c tham sè khu«n d¹ng trªn cã ý nghÜa nh sau: • Source Port (16 bits): sè hiƯu cỉng cđa tr¹m ngn • Destination Port (16 bits): sè hiƯu cỉng cđa tr¹m ®Ých • Sequence Number (32 bits): sè hiƯu cđa byte ®Çu tiªn cđa segment trõ bit SYN ®ỵc thiÕt lËp NÕu bit SYN ®ỵc thiÕt lËp th× Sequence Number lµ sè hiƯu tn tù khëi ®Çu (ISN) vµ byte d÷ liƯu ®Çu tiªn lµ ISN+1 Tham sè nµy cã vai trß nh tham sè N(S) HDLC Trang • Acknowledgment Number (32 bits): sè hiƯu cđa segment tiÕp theo mµ tr¹m ngn ®ang chê ®Ĩ nhËn NgÇm ý b¸o nhËn tèt (c¸c) segment mµ tr¹m ®Ých ®· gưi cho tr¹m ngn - Tham sè nµy cã vai trß nh tham sè N(R) HDLC • Data offset (4 bits): sè lỵng tõ - 32 bit (32 bit words) TCP header (tham sè nµy chØ vÞ trÝ b¾t ®Çu cđa vïng d÷ liƯu) • Reserved (6 bits): dµnh ®Ĩ dïng t¬ng lai • Control bits (c¸c bit ®iỊu khiĨn): T tr¸i sang ph¶i: URG: vïng trá khÈn (Urgent Pointer) cã hiƯu lùc ACK: vïng b¸o nhËn (ACK number) cã hiƯu lùc PSH: chøc n¨ng PUSH RST: khëi ®éng l¹i (reset) liªn kÕt SYN: ®ång bé ho¸ c¸c sè hiƯu tn tù (sequence number) FIN: kh«ng cßn d÷ liƯu tõ tr¹m ngn • Window (16 bits): cÊp ph¸t credit ®Ĩ kiĨm so¸t lng d÷ liƯu (c¬ chÕ cưa sỉ) §©y chÝnh lµ sè lỵng c¸c byte d÷ liƯu, b¾t ®Çu tõ byte ®ỵc chØ vïng ACK number, mµ tr¹m ngn ®· s½n sµng ®Ĩ nhËn • Checksum (16 bits): m· kiĨm so¸t lçi (theo ph¬ng ph¸p CRC) cho toµn bé segment (header + data) • Urgent Pointer (16 bits): trá nµy trá tíi sè hiƯu tn tù cđa byte ®i theo sau d÷ liƯu khÈn, cho phÐp bªn nhËn biÕt ®ỵc ®é dµi cđa d÷ liƯu khÈn Vïng nµy chØ cã hiƯu lùc bit URG ®ỵc thiÕt lËp • Options (®é dµi thay ®ỉi): khai b¸o c¸c Options cđa TCP, ®ã cã ®é dµi tèi ®a cđa vïng TCP data mét segment • Padding (®é dµi thay ®ỉi): PhÇn chÌn thªm vµo header ®Ĩ b¶o ®¶m phÇn header lu«n kÕt thóc ë mét mèc 32 bits PhÇn thªm nµy gåm toµn sè • TCP data (®é dµi thay ®ỉi): chøa d÷ liƯu cđa tÇng trªn, cã ®é dµi tèi ®a ngÇm ®Þnh lµ 536 bytes Gi¸ trÞ nµy cã thĨ ®iỊu chØnh b»ng c¸ch khai b¸o vïng options Mét tiÕn tr×nh øng dơng mét host truy nhËp vµo c¸c dÞch vơ cđa TCP cung cÊp th«ng qua mét cỉng (port) Mét cỉng kÕt hỵp víi mét ®Þa chØ IP t¹o thµnh mét socket nhÊt liªn m¹ng DÞch vơ TCP ®ỵc cung cÊp nhê mét liªn kÕt logic gi÷a mét cỈp socket Mét socket cã thĨ tham gia nhiỊu liªn kÕt víi c¸c socket ë xa kh¸c Tríc trun d÷ liƯu gi÷a hai tr¹m cÇn ph¶i thiÕt lËp mét liªn kÕt TCP gi÷a chóng vµ kh«ng cßn nhu cÇu trun d÷ liƯu th× liªn kÕt ®ã sÏ ®ỵc gi¶i phãng Còng gièng nh ë c¸c giao thøc kh¸c, c¸c thùc thĨ ë tÇng trªn sư dơng TCP th«ng qua c¸c hµm dÞch vơ nguyªn thủ (service primitives), hay cßn gäi lµ c¸c lêi gäi hµm (function calls) Trang CHƯƠNG : CƠ SỞ VỀ LẬP TRÌNH MẠNG TRÊN MÔ HÌNH CLIENT/SERVER 2.1 LẬP TRÌNH GIAO TIẾP MẠNG VỚI WINDOWS SOCKETS Windows NT lµ mét hƯ ®iỊu hµnh m¹nh, cho phÐp tËn dơng tèi ®a kh¶ n¨ng cđa m¸y tÝnh lo¹i 32 bit, cung øng hµng lo¹t c¸c dÞch vơ m¹ng trªn m«i trêng Intranet vµ Internet HiƯn Windows NT ®ỵc sư dơng t¬ng ®èi phỉ biÕn ë c¸c c¬ quan; doanh nghiƯp ViƯt Nam Giao thøc trun th«ng TCP/IP ®· ®ỵc dïng bëi hƯ ®iỊu hµnh UNIX vµ m¹ng Internet, ®Ĩ c¸c m¸y trªn m¹ng NT cã thĨ giao tiÕp víi c¸c m¸y trªn m¹ng kh¸c, Windows NT còng cung cÊp giao thøc nµy Ngoµi mét sè lƯnh dïng giao thøc TCP/IP ®· ®ỵc viÕt s½n nh: ftp, telnet, finger , Windows NT cho phÐp ngêi lËp tr×nh ph¸t triĨn c¸c øng dơng khai th¸c kü tht TCP/IP th«ng qua mét th viƯn tªn lµ Windows Sockets Cã ba lý chÝnh ®Ĩ ngêi lËp tr×nh sư dơng kü tht TCP/IP: • Cã thĨ viÕt c¸c øng dơng trªn Windows NT ®Ĩ nèi vµo m¹ng UNIX vµ khai th¸c c¸c dÞch vơ cã s½n trªn ®ã • T¹o c¸c dÞch vơ trªn m¸y Windows NT ®Ĩ c¸c m¸y UNIX cã thĨ khai th¸c nh÷ng dÞch vơ nµy • ViÕt c¸c ch¬ng tr×nh cho phÐp c¸c m¸y Windows NT giao tiÕp trªn hƯ thèng m¹ng Internet 2.2 MỘT SỐ KHÁI NIỆM CƠ BẢN 2.2.1.Đòa Internet Trong hƯ thèng m¹ng Internet, mçi m¸y ®Ịu cã mét tªn vµ mét ®Þa chØ IP (còng gäi lµ ®Þa chØ Internet) VÝ dơ nh, mét m¸y NT cã tªn lµ ntsvr.csc.hcmu.vn vµ ®Þa chØ lµ 192.48.94.200 Tªn hay ®Þa chØ IP ®Ịu x¸c ®Þnh nhÊt mét m¸y hƯ thèng m¹ng Internet Khi lËp tr×nh, chóng ta cã c¸c hµm ®Ĩ chun ®ỉi tõ tªn sang ®Þa chØ IP vµ ngỵc l¹i 2.2.2 Khái niệm socket port Mét socket lµ mét thiÕt bÞ trun th«ng hai chiỊu t¬ng tù nh tËp tin, chóng ta cã thĨ ®äc hay ghi lªn nã, nhiªn mçi socket lµ mét thµnh phÇn mét mèi nèi nµo ®ã gi÷a c¸c m¸y trªn m¹ng m¸y tÝnh vµ c¸c thao t¸c ®äc/ghi chÝnh lµ sù trao ®ỉi d÷ liƯu gi÷a c¸c øng dơng trªn nhiỊu m¸y kh¸c Trong giao thøc trun th«ng TCP, mçi mèi nèi gi÷a hai m¸y tÝnh ®ỵc x¸c ®Þnh bëi mét port, kh¸i niƯm port ë ®©y kh«ng ph¶i lµ mét cỉng giao tiÕp trªn thiÕt bÞ vËt lý mµ chØ lµ mét kh¸i niƯm logic c¸ch nh×n cđa ngêi lËp tr×nh, mçi port ®ỵc t¬ng øng víi mét sè nguyªn d¬ng Trang 10 } protected long getMessagesSize() { if (messages == null) return 0; Enumeration enum = messages.elements(); long size = 0; while (enum.hasMoreElements()) { Message message = (Message)enum.nextElement(); if (!message.isDeleted()) size += message.getSize(); } return size; } protected void processDELE(StringTokenizer arguments) { if (!arguments.hasMoreTokens()) { out.println("-ERR must supply message number"); } else { Message message = getMessage(arguments.nextToken()); if (message == null) { out.println("-ERR no such message"); } message.setDeleted(true); out.println("+OK"); } } /** * Xử lý lệnh PASS kiểm tra password */ protected void processEnterPassword(String command, StringTokenizer arguments) { if (command.equalsIgnoreCase("QUIT")) { stopRequested = true; out.println("+OK Signing off"); } else if (command.equalsIgnoreCase("PASS")) { if (!arguments.hasMoreTokens()) { out.println("-ERR must supply password"); return; } String password = arguments.nextToken(); Trang 70 if (arguments.hasMoreTokens()) { out.println("-ERR only one argument to PASS, your password"); return; } // Kiểm tra quyền đăng nhập user = Server.storage.login(userName, password); if (user == null) { out.println("-ERR invalid user or password"); state = ENTER_USER; } else { // user đăng nhập – trả danh sách mail có hộp thư messages = Server.storage.getMessages(user); out.println("+OK mailbox open, " + countMessages() + " messages"); state = TRANSACTION; } } else { out.println("-ERR Only use PASS or QUIT commands"); } } /** * Xử lý lệnh USER */ protected void processEnterUser(String arguments) { command, StringTokenizer if (command.equalsIgnoreCase("QUIT")) { stopRequested = true; out.println("+OK Signing off"); return; } if (command.equalsIgnoreCase("USER")) { if (!arguments.hasMoreTokens()) { out.println("-ERR must supply user name"); return; } userName = arguments.nextToken(); if (arguments.hasMoreTokens()) { out.println("-ERR only one argument to USER, the user name"); return; Trang 71 } state = ENTER_PASSWORD; out.println("+OK use PASS command to send password"); return; } out.println("-ERR Only use USER or QUIT commands"); } /** * Xử lý lệnh LIST */ protected void processLIST(StringTokenizer arguments) { if (!arguments.hasMoreTokens()) { out.println("+OK " + countMessages() + " " + getMessagesSize()); for (int i = 1; i = 1) { if (line.substring(0, 1).equals(".")) line = "." + line; } // Gửi liệu trình khách out.println(line); } } catch (IOException e) { System.err.println("POPConnection.processRETR()"); e.printStackTrace(System.err); } try { reader.close(); } catch (IOException e) { System.err.println("POPConnection.processRETR() - reader.close()"); e.printStackTrace(System.err); } out.println("."); } } /** * Xử lý lệnh RSET */ protected void processRSET(StringTokenizer arguments) { Enumeration enum = messages.elements(); while (enum.hasMoreElements()) { Message message = (Message)enum.nextElement(); if (message.isDeleted()) message.setDeleted(false); } out.println("+OK"); } /** * Xử lý lệnh STAT */ protected void processSTAT(StringTokenizer arguments) { Trang 74 out.println("+OK " + countMessages() + " " + getMessagesSize()); } /** * Xử lý lệnh TOP – trả trình khách mail header */ protected void processTOP(StringTokenizer arguments) { if (!arguments.hasMoreTokens()) { out.println("-ERR syntax: TOP "); return; } String messageNumber = arguments.nextToken(); if (!arguments.hasMoreTokens()) { out.println("-ERR syntax: TOP "); return; } int lines = 0; try { lines = Integer.parseInt(arguments.nextToken()); } catch (NumberFormatException e) { out.println("-ERR bad number of lines"); return; } Message message = getMessage(messageNumber); if (message == null) { out.println("-ERR no such message"); return; } out.println("+OK " + message.getSize() + " octets"); StringBuffer buffer = Server.storage.getMessageData(message); BufferedReader reader StringReader(buffer.toString())); boolean done = false; Trang 75 = new BufferedReader(new boolean inBody = false; int count = 0; try { while (reader.ready() && (!done) && (count = 1) { if (line.substring(0, 1).equals(".")) line = "." + line; } else { inBody = true; } if (inBody) { count++; } out.println(line); } } catch (IOException e) { System.err.println("POPConnection.processTOP()"); e.printStackTrace(System.err); } try { reader.close(); } catch (IOException e) { System.err.println("POPConnection.processTOP() reader.close()"); e.printStackTrace(System.err); } out.println("."); } /** * Xử lý lệnh giao thức POP3 */ protected void processTransaction(String command, StringTokenizer arguments) { if (command.equalsIgnoreCase("STAT")) { Trang 76 processSTAT(arguments); } else if (command.equalsIgnoreCase("LIST")) { processLIST(arguments); } else if (command.equalsIgnoreCase("RETR")) { processRETR(arguments); } else if (command.equalsIgnoreCase("DELE")) { processDELE(arguments); } else if (command.equalsIgnoreCase("NOOP")) { processTOP(arguments); } else if (command.equalsIgnoreCase("TOP")) { processTOP(arguments); } else if (command.equalsIgnoreCase("UIDL")) { processUIDL(arguments); } else if (command.equalsIgnoreCase("RSET")) { processRSET(arguments); } else if (command.equalsIgnoreCase("QUIT")) { processQUIT(arguments); } else { out.println("-ERR Unknown command " + command); } } protected void processUIDL(StringTokenizer arguments) { if (!arguments.hasMoreTokens()) { out.println("+OK " + countMessages() + " " + getMessagesSize()); for (int i = 1; i