Thảo luận Bài 5
+34
PhamDuyPhuong87(I11C)
nguyenhoangthinh (I11C)
PhamAnhKhoa(I11C)
lytrannhutlinh i11c
nguyenthingocloan (I11C)
tannamthanh(I11C)
TranTrungTinh(I11C)
tranvantoan83(I11c)
nguyenvulinh_i11c
thanhnam06511c
TranVanDucHieu I11c
DuongKimLong(I111C)
n.t.tuyet.trinh90 (I11C)
nguyenthithuylinh (I11C)
Nguyen Van Phu(I11c)
TranMinhThuc_I11C
DoThiNgocNuong (I11C)
NguyenDongGiang
tranvanhai_21(I11c)
NguyenTrongHuy(I11C)
Duongthithanhhuynh (I11C)
chipphonui
NguyenDinhHop (I11C)
TranVuThuyVan_(I11C)
nguyenthanhphuong(I11C)
Tranvancanh(I11C)
phamngoctan095 (I11C)
TranThanhHoang(I91C)
PhamHuyHoang (I11C)
NguyenQuangLuan44_(102C)
XuanThai_I11C
VoMinhHoang (I11C)
tranphanhieu36_i11c
Admin
38 posters
Trang 2 trong tổng số 3 trang
Trang 2 trong tổng số 3 trang • 1, 2, 3
Re: Thảo luận Bài 5
bạn ơi cái này có rồi mà post len nhiều thế làm đọc chống cả mặt luôn hicchipphonui đã viết:Giao thức TCP hỗ trợ tính toàn vẹn của dữ liệu. Nếu như trong khi gửi, một package nào đó bị drop. bên nhận sẽ request để xin gửi lại. . Thuận lợi của protocol này là dữ liệu ko bị mất hoặc méo mó, khuyết điểm là CHẬM.
Giao thức UDP ko hỗ trợ tính năng này, nó cứ gửi package ko cần biết bên người nhân có nhận được hay ko. Ưu điểm là nhanh chóng, khuyết điểm là ... dữ liệu thường lúc có lúc không.
Duongthithanhhuynh (I11C)- Tổng số bài gửi : 26
Join date : 26/08/2011
Age : 35
Đến từ : Tiền Giang
Re: Thảo luận Bài 5
Duongthithanhhuynh (I11C) đã viết:ủa mình nhớ không lầm là những vấn đề mấy bạn post trong mục này là thuộc về bài 4 mà, mấy bạn post có đúng mục ko nhi? làm mình rối quá mình đi học đầy đủ mà hình như bài 5 "đa luồng" chưa học mà sao có vấn đề để thảo luận?hixhix
Mình đi hoc cũng đầy đủ nên thấy cung kỳ kỳ .tường thầy dạy trước bài Đa Luồng rùi nên co nhiều thắc mắc tính vào hỏi .ai dè không phải. Phần công nghệ Đa Luồng đối với mình là khá hay nên muốn tìm hiều thêm về công nghệ này.
NguyenTrongHuy(I11C)- Tổng số bài gửi : 18
Join date : 19/09/2011
Re: Thảo luận Bài 5
hic hic, sao mà post quá chời thế này chóng mặt quá, mình cũng hoang mang quá! Bài này nằm ở nội dung bài 4 mà, Bài 5 là Da Luồng mà.Hic Thầy chưa dạyDuongthithanhhuynh (I11C) đã viết:bạn ơi cái này có rồi mà post len nhiều thế làm đọc chống cả mặt luôn hicchipphonui đã viết:Giao thức TCP hỗ trợ tính toàn vẹn của dữ liệu. Nếu như trong khi gửi, một package nào đó bị drop. bên nhận sẽ request để xin gửi lại. . Thuận lợi của protocol này là dữ liệu ko bị mất hoặc méo mó, khuyết điểm là CHẬM.
Giao thức UDP ko hỗ trợ tính năng này, nó cứ gửi package ko cần biết bên người nhân có nhận được hay ko. Ưu điểm là nhanh chóng, khuyết điểm là ... dữ liệu thường lúc có lúc không.
tranvanhai_21(I11c)- Tổng số bài gửi : 47
Join date : 25/08/2011
Age : 40
Đến từ : Đồng Nai
Re: Thảo luận Bài 5
Duongthithanhhuynh (I11C) đã viết:ủa mình nhớ không lầm là những vấn đề mấy bạn post trong mục này là thuộc về bài 4 mà, mấy bạn post có đúng mục ko nhi? làm mình rối quá mình đi học đầy đủ mà hình như bài 5 "đa luồng" chưa học mà sao có vấn đề để thảo luận?hixhix
Bài 5 chưa học mà tự nhiên vô forum thấy post lên rồi. Cứ tưởng mình đang nhầm chứ. Mấy bạn vui lòng post đúng mục đi.
DoThiNgocNuong (I11C)- Tổng số bài gửi : 17
Join date : 27/08/2011
Re: Thảo luận Bài 5
phamngoctan095 (I11C) đã viết:Chào cả nhà!
Vấn đề “Tại sao phải làm lại những chương trình chat trong khi đã có rất nhiều chương trình chat miễn phí” đã được các bạn lớp Hoàn chỉnh kiến thức I83C thảo luận rất sôi nổi trên diễn đàn khóa trước. Riêng mình thì có ý kiến, cũng như cái ví dụ con mèo hoang mà thầy đã nêu trên lớp thì một khi đã lệ thuộc vào những thứ đã sẵn có sẽ mất dần khả năng tự kiếm “mồi”. Một khi chúng ta cần đến nó sẽ không biết cách để tự kiếm được. Trong thực tế cũng đã xảy ra trường hợp tương tự, lấy ví dụ tại một số công ty thì những ứng dụng chat hầu như bị cấm cửa như Yahoo chẳng hạn. Và lúc bấy giờ thì khả năng tự kiếm “mồi” của những con mèo hoang mới thật sự cần thiết.
-------------------------------------------------------------------------------
Chào bạn,
Theo mình nghĩ thì mình làm chương trình chat để mình hiểu rõ cơ chế hoạt động của nó. Một khi gặp những vấn đề liên quan đến nó thì mình biết nguyên nhân vì sao và cách khắc phục.
Mặc khác khi mình đã hiểu nó rồi mình cũng có thể phát triển theo hướng của mình mà không phụ thuộc vào của người khác.
Lấy một vd: Nếu mình là một lập trình viên và mình muốn viết một ứng dụng để sử dụng chat nội bộ (phục vụ công việc) trong cty mình thôi thì không cần phải dùng Yahoo Messenger hay Skype....(dễ bị lây virus, nói chuyện với nhiều người bên ngoài làm mất thời gian của của cty)
TranMinhThuc_I11C- Tổng số bài gửi : 15
Join date : 16/09/2011
Re: Thảo luận Bài 5
XuanThai_I11C đã viết:Để đổi port mặc định của Remote desktop connection, ta làm như sau:
1. Open Registry Editor
2. Theo đường dẫn:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Contro l\TerminalServer\WinStations\RDP-Tcp\PortNumber
3. Trong menu edit, chọn modify, chọn decimal.
4. Gõ vào số port mới mà bạn muốn.
5. Restart Windows.
và xem kết quả
------------------------------------------------------------------------------------------------------
Chào bạn,
Mình xin update thêm vài ý của mình vào chủ đề của bạn như sau:
Port có ý nghĩa gì? Tại sao phải đổi port?
Bạn hình dung port giống như cánh cửa có đánh số nhà bạn. Một người muốn tìm đến nhà bạn thì tìm tới cánh cửa có số này.
Tuy nhiên người muốn tìm tới nhà bạn thì có 2 loại là người ngay và kẻ gian :-).
Do đó:
Vì tính năng an toàn của hệ thống mà người ta mới nghỉ tới chuyện đổi port mặc định. Vd khi một hacker muốn tấn công vào trang web của công ty bạn và web site của bạn dùng port mặc định (port 80) thì hacker đó sẽ dễ dàng hơn trong việc tấn công ( Vì không phải mất công tìm kiếm port của trang web bạn)
TranMinhThuc_I11C- Tổng số bài gửi : 15
Join date : 16/09/2011
Re: Thảo luận Bài 5
[quote="DoThiNgocNuong (I11C)"]
Bài 5 chưa học mà tự nhiên vô forum thấy post lên rồi. Cứ tưởng mình đang nhầm chứ. Mấy bạn vui lòng post đúng mục đi. [/quot
acx taị thầy để thao luận bài 5 nên vao thảo luận lun, chán. hum bữa học tiếp tục bài 4. sorry
Duongthithanhhuynh (I11C) đã viết:ủa mình nhớ không lầm là những vấn đề mấy bạn post trong mục này là thuộc về bài 4 mà, mấy bạn post có đúng mục ko nhi? làm mình rối quá mình đi học đầy đủ mà hình như bài 5 "đa luồng" chưa học mà sao có vấn đề để thảo luận?hixhix
Bài 5 chưa học mà tự nhiên vô forum thấy post lên rồi. Cứ tưởng mình đang nhầm chứ. Mấy bạn vui lòng post đúng mục đi. [/quot
acx taị thầy để thao luận bài 5 nên vao thảo luận lun, chán. hum bữa học tiếp tục bài 4. sorry
chipphonui- Tổng số bài gửi : 21
Join date : 07/09/2011
Age : 36
Đến từ : Gia lai
Nguyên lý hoạt động của giao thức TCP/IP và Internet
Nguyên lý hoạt động của giao thức TCP/IP và Internet
Xem bai viet bang font ABC
PCWorld VN 11/99
Mạng máy tính ngày nay đã trở thành một thành phần quan trọng trong ngành truyền thông. Trên thế giới, ban đầu chỉ có vài mạng máy tính được đưa vào sử dụng ở các viện nghiên cứu và phục vụ cho quốc phòng. Cùng với thời gian, khoa học phát triển, giá máy giảm, mạng máy tính đã có mặt ở khắp nơi, từ trường học, nhà máy đến các học viện. Đặc biệt sự bùng nổ của mạng thông tin toàn cầu Internet đã đưa khả năng sử dụng mạng đến từng người dân. Hàng ngày bạn dạo chơi trên Internet, lướt trên các trang Web, có bao giờ bạn tự hỏi làm thế nào mà con người có được khả năng truy cập thông tin mạnh mẽ và tiện lợi đến như vậy?
Trả lời đầy đủ câu hỏi này quả là không đơn giản vì đó là thành quả của hàng ngàn con người, lao động trong hàng chục năm, không thể trình bày gói gọn chỉ trong vài trang viết. Bài báo này không đi vào chi tiết mà chỉ xin được cung cấp một số kiến thức cơ bản nhất về Internet và nguyên lý hoạt động của nó.
Mô hình tổng quát của mạng Internet
Như trong hình 1, kết cấu vật lý của mạng Internet gồm có mạng chính chứa các server cung cấp dịch vụ cho mạng, mạng nhánh bao gồm các trạm làm việc sử dụng dịch vụ do Internet cung cấp. "Đám mây Internet" hàm chứa vô vàn mạng chính, mạng nhánh và bao phủ toàn thế giới. Để một hệ thống phức tạp như vậy hoạt động trơn tru và hiệu quả thì điều kiện tiên quyết là mọi máy tính trong mạng, dù khác nhau về kiến trúc, đều phải giao tiếp với mạng theo cùng một quy luật. Đó là giao thức TCP/IP.
Quá trình truyền dữ liệu qua mạng Internet
Nếu đã từng lập trình, bạn hẳn biết rằng một chương trình hoàn chỉnh được tạo nên từ nhiều module với các chức năng và nhiệm vụ khác nhau nhưng lại liên kết chặt chẽ với nhau. Quá trình truyền dữ liệu cũng như vậy. Để có thể truyền qua mạng Internet, dữ liệu phải được xử lý qua nhiều tầng. Một mạng intranet theo chuẩn OSI thường có bảy tầng nhưng Internet chỉ có bốn tầng xử lý dữ liệu là:
* Tầng application
* Tầng transport còn gọi là tầng TCP (Transmission Control Protocol)
* Tầng network còn gọi là tầng IP (Internet Protocol)
* Tầng Datalink/Physical
Giả sử bạn đang ở máy A và muốn gửi một thông điệp tới máy B. Bạn dùng một trình soạn thảo văn bản để soạn thư, sau đó nhấn nút Send. Tính từ thời điểm đó dữ liệu được xử lý lần lượt như trong hình 2.
Đầu tiên, dữ liệu được xử lý bởi tầng application. Tầng này có nhiệm vụ tổ chức dữ liệu theo khuôn dạng và trật tự nhất định để tầng application ở máy B có thể hiểu được. Điều này giống như khi bạn viết một chương trình thì các câu lệnh phải tuân theo thứ tự và cú pháp nhất định thì chương trình mới chạy được. Tầng application gửi dữ liệu xuống tầng dưới theo dòng byte nối byte. Cùng với dữ liệu, tầng application cũng gửi xuống các thông tin điều khiển khác giúp xác định địa chỉ đến, đi của dữ liệu.
Khi xuống tới tầng TCP, dòng dữ liệu sẽ được đóng thành các gói có kích thước không nhất thiết bằng nhau nhưng phải nhỏ hơn 64 KB. Cấu trúc của gói dữ liệu TCP gồm một phần header chứa thông tin điều khiển và sau đó là dữ liệu. Sau khi đóng gói xong ở tầng TCP, dữ liệu được chuyển xuống cho tầng IP.
Gói dữ liệu xuống tới tầng IP sẽ tiếp tục bị đóng gói lại thành các gói dữ liệu IP nhỏ hơn sao cho có kích thước phù hợp với mạng chuyển mạch gói mà nó dùng để truyền dữ liệu. Trong khi đóng gói, IP cũng chèn thêm phần header của nó vào gói dữ liệu rồi chuyển xuống cho tầng Datalink/Physical.
Khi các gói dữ liệu IP tới tầng Datalink sẽ được gắn thêm một header khác và chuyển tới tầng physical đi vào mạng. Gói dữ liệu lúc này gọi là frame. Kích thước của một frame hoàn toàn phụ thuộc vào mạng mà máy A kết nối.
Trong khi chu du trên mạng Internet, frame được các router chỉ dẫn để có thể tới đúng đích cần tới. Router thực ra là một module chỉ có hai tầng là Network và Datalink/Physical. Các frame tới router sẽ được tầng Datalink/Physical lọc bỏ header mà tầng này thêm vào và chuyển lên tầng Network (IP). Tầng IP dựa vào các thông tin điều khiển trong header mà nó thêm vào để quyết định đường đi tiếp theo cho gói IP. Sau đó gói IP này lại được chuyển xuống tầng Datalink/Physical để đi vào mạng. Quá trình cứ thế tiếp tục cho đến khi dữ liệu tới đích là máy B.
Khi tới máy B các gói dữ liệu được xử lý theo quy trình ngược lại với máy A. Theo chiều mũi tên, đầu tiên dữ liệu qua tầng datalink/physical. Tại đây frame bị bỏ đi phần header và chuyển lên tầng IP. Tại tầng IP, dữ liệu được bung gói IP, sau đó lên tầng TCP và cuối cùng lên tầng application để hiển thị ra màn hình.
Hệ thống địa chỉ và cơ chế truyền dữ liệu trong mạng Internet
Để một gói dữ liệu có thể đi từ nguồn tới đích, mạng Internet đã dùng một hệ thống đánh địa chỉ tất cả các máy tính nối vào mạng như hình 3.
Những tên và địa chỉ này được gửi cho máy tính nhận dữ liệu.
Để phân tích hệ thống tên/địa chỉ, hãy bắt đầu từ thấp lên cao:
a. Địa chỉ vật lý, còn gọi là địa chỉ MAC
Sở dĩ có tên gọi như vậy là vì địa chỉ này gắn liền với phần cứng và đại diện cho một thiết bị. Thông thường địa chỉ vật lý được đặt ngay trên bảng mạch máy tính hay trên thiết bị kết nối trực tiếp với máy (modem, card mạng...)
Địa chỉ vật lý được sử dụng như sau:
Thiết bị nhận dữ liệu kiểm tra địa chỉ vật lý đích của gói dữ liệu ở tầng vật lý. Nếu địa chỉ đích này phù hợp địa chỉ vật lý của thiết bị thì gói dữ liệu sẽ được chuyển lên tầng trên, nếu không nó sẽ bị bỏ qua.
b. SAP: Dùng để đại diện cho giao thức bên trên tầng MAC, ở đây là IP.
c. Địa chỉ mạng (network address)
Một thực thể trong mạng được xác định chỉ qua địa chỉ mạng mà không cần địa chỉ vật lý. Dữ liệu được truyền qua mạng chỉ dựa vào địa chỉ mạng. Khi nào dữ liệu tới mạng LAN thì địa chỉ vật lý mới cần thiết để đưa dữ liệu tới đích.
Ví dụ:
Máy gửi có địa chỉ 128.1.6.7 ->địa chỉ mạng là 128.1
Máy nhận có địa chỉ 132.5.8.12 ->địa chỉ mạng là 132.5
Mạng Internet có trách nhiệm dựa vào 2 địa chỉ mạng trên để đưa dữ liệu tới mạng 132.5. Khi tới mạng 132.5 thì dựa vào địa chỉ 8.12 sẽ tìm ra địa chỉ vật lý thực để truyền dữ liệu tới đích. Như vậy có một thắc mắc là: đã có địa chỉ vật lý rồi, tại sao lại cần thêm địa chỉ mạng?
Việc tồn tại 2 loại địa chỉ là do các nguyên nhân:
* 2 hệ thống địa chỉ được phát triển một cách độc lập bởi các tổ chức khác nhau.
* Địa chỉ mạng chỉ có 32 bit sẽ tiết kiệm đường truyền hơn so với địa chỉ vật lý 48 bit.
* Khi mạch máy hỏng thì địa chỉ vật lý cũng mất.
* Trên quan điểm người thiết kế mạng thì sẽ rất hiệu quả khi tầng IP không liên quan gì với các tầng dưới.
Như trên đã nói, từ địa chỉ mạng có thể tìm được địa chỉ vật lý. Công việc tìm kiếm này được thực hiện bởi giao thức ARP (Address Resolution Protocol). Nguyên tắc làm việc của ARP là duy trì một bảng ghi tương ứng địa chỉ IP - địa chỉ vật lý. Khi nhận được địa chỉ IP, ARP sẽ dùng bảng này để tìm ra địa chỉ vật lý. Nếu không thấy, nó sẽ gửi một gói dữ liệu, gọi là ARP request, chứa địa chỉ IP vào mạng LAN. Nếu máy nào nhận ARP request và nhận ra địa chỉ IP của mình thì sẽ gửi lại một gói dữ liệu chứa địa chỉ vật lý của nó.
Vậy từ địa chỉ vật lý, một máy tính trong mạng có thể biết địa chỉ IP của mình hay không? Câu trả lời là có. Giao thức gọi là RARP (Reverse Address Resolution Protocol) thực hiện công việc này. Giả sử trong mạng có một máy cần biết địa chỉ IP của mình, nó gửi một gói dữ liệu cho tất cả các máy trong mạng LAN. Mọi máy trong mạng đều có thể nhận gói dữ liệu này, nhưng chỉ có RARP server mới trả lại thông báo chứa địa chỉ mạng của máy đó.
Trên thực tế, khi muốn nhập vào một địa chỉ Internet nào đó, bạn hay đánh vào dòng chữ như "WWW.hotmail.com" mà ít thấy những dòng địa chỉ số khô khốc. Vậy có điều gì mâu thuẫn? Chẳng sao cả, Internet đã dùng một hệ thống gọi là DNS (Domain Name System) để đặt tên cho một host và cung cấp một số giao thức để chuyển đổi từ địa chỉ chữ ra địa chỉ số và ngược lại. Cách tổ chức tên của DNS tuân theo dạng hình cây như hình 4.
Một máy tính trong mạng sẽ ứng với một nút của cây. Như ở cây trên, máy ở lá FPT sẽ có địa chỉ hoàn chỉnh là fpt.com.vn. Mỗi nút trên cây biểu diễn một miền (domain) trong hệ thống DNS; mỗi miền lại có một hay nhiều miền con. Tại mỗi miền này đều phải có máy chủ DNS tương ứng quản lý hệ thống tên trong miền đó. Để hiểu rõ hơn hoạt động của DNS, lấy một ví dụ sau:
Một máy trạm có tên là test.fpt.com.vn muốn biết địa chỉ IP của máy www.microsoft. com, quá trình hỏi của nó như sau:
Khi máy test.fpt.com.vn gửi yêu cầu hỏi về máy www. microsoft.com tới DNS của miền fpt.com.vn, DNS xác định là tên đó không nằm trong miền mà nó quản lý và gửi ngược lên cho miền ở mức cao hơn là com.vn. Tại đây, DNS cũng không tìm được thông tin thoả mãn nên phải hỏi ngược lên DNS của miền vn.
Quá trình cứ thế tiếp diễn đến khi câu hỏi được gửi tới DNS của miền microsoft.com và tại đây câu hỏi được giải đáp.
Để hoạt động hiệu quả như trên, mỗi máy chủ DNS lưu trữ một cơ sở dữ liệu gồm các bản ghi chứa thông tin:
+ Tên của DNS cấp cao hơn
+ Địa chỉ IP
+ Địa chỉ dạng chữ tương ứng
Chỉ số của bản ghi được lấy từ địa chỉ IP tương ứng, nhờ đó từ địa chỉ IP có thể dễ dàng tìm ra địa chỉ chữ.
d. Protocol ID chỉ ra giao thức của tầng giao vận. Trên Internet trường này là TCP hoặc UDP.
e. Port là một số đặc trưng cho một chương trình chạy trên Internet. Ví dụ, chương trình lấy thư điện tử qua giao thức IMAP có port=143, truyền file có port =21, v.v...
f. Username là tên người đăng kí sử dụng chương trình.
ở phần II có nói tại router, IP sử dụng các thông tin điều khiển trong header của gói dữ liệu IP để quyết định đường đi tiếp theo của gói này. Có rất nhiều thông tin điều khiển nhưng ở đây chỉ xin phân tích các thông tin quan trọng.
- Đầu tiên là địa chỉ đích. Nếu địa chỉ đích trùng với địa chỉ của router đó thì gói dữ liệu được truyền trực tiếp cho host B. Nếu không trùng thì dữ liệu sẽ được truyền đến router tiếp theo trên đường đi. Vấn đề là router nào được chọn. Có 2 khả năng để lựa chọn router, tức là 2 khả năng để dẫn đường:
+ Thứ nhất là tuân theo một cách nghiêm ngặt source routing. Dữ liệu sẽ được truyền cho router tiếp theo trong source routing. Nhưng dữ liệu chỉ được truyền đi khi router được chọn có trong bảng các router có thể đến được của router hiện tại, bằng không sẽ sinh ra lỗi.
+ Thứ hai là "quên đi" source routing và tìm đường mới tới đích. Router tiếp theo được chọn dựa trên sự tìm đường này. Thông thường sự tìm đường dựa trên thuật toán Dijstra tìm kiếm theo chiều rộng. Trên thực tế, cách này đang được sử dụng rộng rãi và có thể trở thành chuẩn trong tương lai.
- Các gói dữ liệu IP thường có kích thước phụ thuộc vào mạng con. Các mạng con khác nhau thì kích thước gói IP của chúng cũng khác nhau. Vậy giả sử mạng A truyền được gói dữ liệu có kích thước lớn nhất là 1024 byte, mạng B truyền được gói dữ liệu có kích thước lớn nhất là 256 byte thì gói dữ liệu từ mạng A có kích thước 1024 byte qua mạng B như thế nào?
Để giải quyết vấn đề này, IP cung cấp khả năng phân và gom mảnh gói dữ liệu. Đây chính là lúc IP sử dụng trường flags và offset trong gói dữ liệu IP. Trường flags thực chất là các cờ thông báo gói dữ liệu này có bị phân mảnh hay không, trường offset chứa giá trị tương đối của gói con trong gói to ban đầu. Khi phân mảnh các cờ được bật lên, đồng thời trường offset được thiết lập giá trị. Dựa vào các dữ liệu trên, IP có thể dễ dàng gom mảnh gói dữ liệu, hồi phục khối dữ liệu to ban đầu.
Kiểm soát lỗi
Qua các phần trên ta thấy quá trình dữ liệu đi trên mạng đã khá rõ ràng nhưng trên một mạng rộng lớn như Internet thì có gì đảm bảo dữ liệu sẽ tới đích một cách an toàn? Điều gì xảy ra nếu trên đường đi các gói dữ liệu bị mất, tắc nghẽn, lạc đường...? Đây chỉ đơn thuần là các sự cố, nhưng thật đáng tiếc là nó lại rất hay xảy ra trên thực tế, do đó một yêu cầu đặt ra là phải có cơ chế thông báo và sửa lỗi trên mạng. Khi có lỗi, tầng IP đơn thuần huỷ bỏ dữ liệu và thông báo lỗi. Thông báo lỗi được thực hiện qua một giao thức gọi là ICMP (Internet Control Message Protocol). ICMP có thể coi là bạn đồng hành với IP và có một số đặc điểm sau:
- Dùng IP để truyền thông báo qua mạng
- Không có chức năng sửa lỗi mà chỉ đơn thuần là máy thông báo lỗi. Chức năng sửa lỗi là của tầng trên (tầng TCP)
- Thông báo lỗi về gói dữ liệu IP nhưng lại không thể thông báo lỗi về gói dữ liệu của chính mình
- Nếu gói dữ liệu IP bị phân mảnh thì khi xảy ra lỗi, ICMP chỉ thông báo lỗi của mảnh đầu tiên
Nói rằng việc sửa lỗi là của TCP nhưng thật ra TCP chẳng sửa lỗi gì cả, khi có lỗi xảy ra nó chỉ làm mỗi một việc là truyền lại. Hãy xem nó làm việc đó như thế nào. TCP truyền dữ liệu theo cơ chế "flow window". Tất cả các byte truyền đều được đánh số thứ tự và TCP quản lý việc truyền dữ liệu dựa vào số thứ tự đó.
Giả sử có 13 byte dữ liệu gửi cho máy B (hình 5) .
Byte 0 đã gửi đi và được xác nhận là tới nơi. Sự xác nhận này được thực hiện bằng cách khi nhận được dữ liệu gửi đến, máy B sẽ gửi một thông báo về cho máy gửi. Thông báo đó có chứa số thứ tự của byte được chấp nhận chứa trong trường ACK.
Byte 1, 2 đã được gửi nhưng chưa có xác nhận, các byte 3, 4, 5 trong khung sẽ được truyền đi, các byte từ 6 trở đi không thể được truyền. Giá trị window limit được tính bằng công thức sau:
Window limit=SND UNA + SND WND
SND UNA = số byte đã gửi đi nhưng chưa được xác nhận
SND WND= số byte trong ô, giá trị này được lấy từ trường window trong gói dữ liệu TCP dùng để xác nhận các byte đã tới nơi. Giá trị này chính là số dữ liệu mà máy B có thể chấp nhận.
Máy B bây giờ lại gửi một thông báo thừa nhận có ACK=3, Window=6. Lúc này dữ liệu có dạng như hình 6.
Các byte 0, 1, 2 đã được xác nhận, cửa sổ đã mở rộng ra, window limit nhận giá trị 3+6 =9. Như vậy số byte có thể truyền đi được điều khiển bởi máy B, điều này giúp giảm đi sự tắc nghẽn giao thông trên mạng và làm cho máy B có thể chủ động xử lý dữ liệu đến một cách trôi chảy.
Khi có lỗi xảy ra trên đường truyền và phải truyền lại dữ liệu thì TCP không chờ đợi thông báo xác nhận từ phía máy B mà nó làm theo cách sau: khi truyền một gói dữ liệu, TCP bấm giờ và nếu thời gian hết mà không thấy thông báo xác nhận thì nó tiến hành truyền lại.
Như vậy thời gian để bấm giờ hết sức quan trọng. Ban đầu thời gian này được thiết lập xung quanh khoảng thời gian kể từ khi TCP A gửi dữ liệu đi đến khi nhận được thông báo xác nhận. Nhưng về sau do cách tính này không hợp lý nên người ta đã đưa ra nhiều cách thiết lập khác nhau. Một trong các cách tính được dùng phổ biến hiện nay là thuật toán của Phil Karn. Nội dung căn bản của thuật toán là mỗi khi hết thời gian thì khoảng thời gian bấm đồng hồ tăng lên gấp một số lần cho trước.
NVT=A x VT
NVT: giá trị thời gian mới để bấm đồng hồ
A : hằng số, thường lấy bằng 2
VT: giá trị thời gian cũá
Cơ chế kết nối giữa hai máy trong mạng Internet
Chặng cuối cùng trong hoạt động của mạng Internet là cơ chế kết nối giữa hai máy. Để toàn bộ các hoạt động truyền tin giữa hai máy trong mạng có thể diễn ra thì phải hình thành kênh liên lạc hay một kết nối giữa chúng. Quá trình đó diễn ra như sau (hình 7):
1: ULP B giả sử là một chương trình mail server ở Mỹ. Do là server nên lúc nào nó cũng chờ đợi sự kết nối.
2: ULP A là chương trình nhận thư điện tử của bạn. Để kết nối, bạn gửi yêu cầu kết nối xuống cho tầng TCP.
3: TCP chuẩn bị một gói dữ liệu TCP với cờ SYN=1 yêu cầu có sự đồng bộ hoá, SEQ có thể lấy bất kì giá trị nào, ở đây là =100 và gửi cho TCP B.
4: Sau khi nhận gói dữ liệu có SYN=1, TCP B gửi trả lại một thông báo có SYN=1, ACK=101, SEQ có thể lấy bất kì giá trị nào, ở đây là =177.
5: TCP A nhận được gói dữ liệu từ TCP B sẽ gửi tiếp một gói dữ liệu có ACK=178.
6: TCP A chuyển chấp nhận kết nối lên chương trình A.
7: Sau khi nhận nốt gói dữ liệu có ACK=178, TCP B chuyển chấp nhận kết nối lên chương trình B.
Sự kết nối giữa 2 module TCP ở các bước 3, 4, 5 gọi là cơ chế bắt tay 3 bước (three way handshake).
Quá trình đóng một kết nối cũng thực hiện tương tự.
Xem bai viet bang font ABC
PCWorld VN 11/99
Mạng máy tính ngày nay đã trở thành một thành phần quan trọng trong ngành truyền thông. Trên thế giới, ban đầu chỉ có vài mạng máy tính được đưa vào sử dụng ở các viện nghiên cứu và phục vụ cho quốc phòng. Cùng với thời gian, khoa học phát triển, giá máy giảm, mạng máy tính đã có mặt ở khắp nơi, từ trường học, nhà máy đến các học viện. Đặc biệt sự bùng nổ của mạng thông tin toàn cầu Internet đã đưa khả năng sử dụng mạng đến từng người dân. Hàng ngày bạn dạo chơi trên Internet, lướt trên các trang Web, có bao giờ bạn tự hỏi làm thế nào mà con người có được khả năng truy cập thông tin mạnh mẽ và tiện lợi đến như vậy?
Trả lời đầy đủ câu hỏi này quả là không đơn giản vì đó là thành quả của hàng ngàn con người, lao động trong hàng chục năm, không thể trình bày gói gọn chỉ trong vài trang viết. Bài báo này không đi vào chi tiết mà chỉ xin được cung cấp một số kiến thức cơ bản nhất về Internet và nguyên lý hoạt động của nó.
Mô hình tổng quát của mạng Internet
Như trong hình 1, kết cấu vật lý của mạng Internet gồm có mạng chính chứa các server cung cấp dịch vụ cho mạng, mạng nhánh bao gồm các trạm làm việc sử dụng dịch vụ do Internet cung cấp. "Đám mây Internet" hàm chứa vô vàn mạng chính, mạng nhánh và bao phủ toàn thế giới. Để một hệ thống phức tạp như vậy hoạt động trơn tru và hiệu quả thì điều kiện tiên quyết là mọi máy tính trong mạng, dù khác nhau về kiến trúc, đều phải giao tiếp với mạng theo cùng một quy luật. Đó là giao thức TCP/IP.
Quá trình truyền dữ liệu qua mạng Internet
Nếu đã từng lập trình, bạn hẳn biết rằng một chương trình hoàn chỉnh được tạo nên từ nhiều module với các chức năng và nhiệm vụ khác nhau nhưng lại liên kết chặt chẽ với nhau. Quá trình truyền dữ liệu cũng như vậy. Để có thể truyền qua mạng Internet, dữ liệu phải được xử lý qua nhiều tầng. Một mạng intranet theo chuẩn OSI thường có bảy tầng nhưng Internet chỉ có bốn tầng xử lý dữ liệu là:
* Tầng application
* Tầng transport còn gọi là tầng TCP (Transmission Control Protocol)
* Tầng network còn gọi là tầng IP (Internet Protocol)
* Tầng Datalink/Physical
Giả sử bạn đang ở máy A và muốn gửi một thông điệp tới máy B. Bạn dùng một trình soạn thảo văn bản để soạn thư, sau đó nhấn nút Send. Tính từ thời điểm đó dữ liệu được xử lý lần lượt như trong hình 2.
Đầu tiên, dữ liệu được xử lý bởi tầng application. Tầng này có nhiệm vụ tổ chức dữ liệu theo khuôn dạng và trật tự nhất định để tầng application ở máy B có thể hiểu được. Điều này giống như khi bạn viết một chương trình thì các câu lệnh phải tuân theo thứ tự và cú pháp nhất định thì chương trình mới chạy được. Tầng application gửi dữ liệu xuống tầng dưới theo dòng byte nối byte. Cùng với dữ liệu, tầng application cũng gửi xuống các thông tin điều khiển khác giúp xác định địa chỉ đến, đi của dữ liệu.
Khi xuống tới tầng TCP, dòng dữ liệu sẽ được đóng thành các gói có kích thước không nhất thiết bằng nhau nhưng phải nhỏ hơn 64 KB. Cấu trúc của gói dữ liệu TCP gồm một phần header chứa thông tin điều khiển và sau đó là dữ liệu. Sau khi đóng gói xong ở tầng TCP, dữ liệu được chuyển xuống cho tầng IP.
Gói dữ liệu xuống tới tầng IP sẽ tiếp tục bị đóng gói lại thành các gói dữ liệu IP nhỏ hơn sao cho có kích thước phù hợp với mạng chuyển mạch gói mà nó dùng để truyền dữ liệu. Trong khi đóng gói, IP cũng chèn thêm phần header của nó vào gói dữ liệu rồi chuyển xuống cho tầng Datalink/Physical.
Khi các gói dữ liệu IP tới tầng Datalink sẽ được gắn thêm một header khác và chuyển tới tầng physical đi vào mạng. Gói dữ liệu lúc này gọi là frame. Kích thước của một frame hoàn toàn phụ thuộc vào mạng mà máy A kết nối.
Trong khi chu du trên mạng Internet, frame được các router chỉ dẫn để có thể tới đúng đích cần tới. Router thực ra là một module chỉ có hai tầng là Network và Datalink/Physical. Các frame tới router sẽ được tầng Datalink/Physical lọc bỏ header mà tầng này thêm vào và chuyển lên tầng Network (IP). Tầng IP dựa vào các thông tin điều khiển trong header mà nó thêm vào để quyết định đường đi tiếp theo cho gói IP. Sau đó gói IP này lại được chuyển xuống tầng Datalink/Physical để đi vào mạng. Quá trình cứ thế tiếp tục cho đến khi dữ liệu tới đích là máy B.
Khi tới máy B các gói dữ liệu được xử lý theo quy trình ngược lại với máy A. Theo chiều mũi tên, đầu tiên dữ liệu qua tầng datalink/physical. Tại đây frame bị bỏ đi phần header và chuyển lên tầng IP. Tại tầng IP, dữ liệu được bung gói IP, sau đó lên tầng TCP và cuối cùng lên tầng application để hiển thị ra màn hình.
Hệ thống địa chỉ và cơ chế truyền dữ liệu trong mạng Internet
Để một gói dữ liệu có thể đi từ nguồn tới đích, mạng Internet đã dùng một hệ thống đánh địa chỉ tất cả các máy tính nối vào mạng như hình 3.
Những tên và địa chỉ này được gửi cho máy tính nhận dữ liệu.
Để phân tích hệ thống tên/địa chỉ, hãy bắt đầu từ thấp lên cao:
a. Địa chỉ vật lý, còn gọi là địa chỉ MAC
Sở dĩ có tên gọi như vậy là vì địa chỉ này gắn liền với phần cứng và đại diện cho một thiết bị. Thông thường địa chỉ vật lý được đặt ngay trên bảng mạch máy tính hay trên thiết bị kết nối trực tiếp với máy (modem, card mạng...)
Địa chỉ vật lý được sử dụng như sau:
Thiết bị nhận dữ liệu kiểm tra địa chỉ vật lý đích của gói dữ liệu ở tầng vật lý. Nếu địa chỉ đích này phù hợp địa chỉ vật lý của thiết bị thì gói dữ liệu sẽ được chuyển lên tầng trên, nếu không nó sẽ bị bỏ qua.
b. SAP: Dùng để đại diện cho giao thức bên trên tầng MAC, ở đây là IP.
c. Địa chỉ mạng (network address)
Một thực thể trong mạng được xác định chỉ qua địa chỉ mạng mà không cần địa chỉ vật lý. Dữ liệu được truyền qua mạng chỉ dựa vào địa chỉ mạng. Khi nào dữ liệu tới mạng LAN thì địa chỉ vật lý mới cần thiết để đưa dữ liệu tới đích.
Ví dụ:
Máy gửi có địa chỉ 128.1.6.7 ->địa chỉ mạng là 128.1
Máy nhận có địa chỉ 132.5.8.12 ->địa chỉ mạng là 132.5
Mạng Internet có trách nhiệm dựa vào 2 địa chỉ mạng trên để đưa dữ liệu tới mạng 132.5. Khi tới mạng 132.5 thì dựa vào địa chỉ 8.12 sẽ tìm ra địa chỉ vật lý thực để truyền dữ liệu tới đích. Như vậy có một thắc mắc là: đã có địa chỉ vật lý rồi, tại sao lại cần thêm địa chỉ mạng?
Việc tồn tại 2 loại địa chỉ là do các nguyên nhân:
* 2 hệ thống địa chỉ được phát triển một cách độc lập bởi các tổ chức khác nhau.
* Địa chỉ mạng chỉ có 32 bit sẽ tiết kiệm đường truyền hơn so với địa chỉ vật lý 48 bit.
* Khi mạch máy hỏng thì địa chỉ vật lý cũng mất.
* Trên quan điểm người thiết kế mạng thì sẽ rất hiệu quả khi tầng IP không liên quan gì với các tầng dưới.
Như trên đã nói, từ địa chỉ mạng có thể tìm được địa chỉ vật lý. Công việc tìm kiếm này được thực hiện bởi giao thức ARP (Address Resolution Protocol). Nguyên tắc làm việc của ARP là duy trì một bảng ghi tương ứng địa chỉ IP - địa chỉ vật lý. Khi nhận được địa chỉ IP, ARP sẽ dùng bảng này để tìm ra địa chỉ vật lý. Nếu không thấy, nó sẽ gửi một gói dữ liệu, gọi là ARP request, chứa địa chỉ IP vào mạng LAN. Nếu máy nào nhận ARP request và nhận ra địa chỉ IP của mình thì sẽ gửi lại một gói dữ liệu chứa địa chỉ vật lý của nó.
Vậy từ địa chỉ vật lý, một máy tính trong mạng có thể biết địa chỉ IP của mình hay không? Câu trả lời là có. Giao thức gọi là RARP (Reverse Address Resolution Protocol) thực hiện công việc này. Giả sử trong mạng có một máy cần biết địa chỉ IP của mình, nó gửi một gói dữ liệu cho tất cả các máy trong mạng LAN. Mọi máy trong mạng đều có thể nhận gói dữ liệu này, nhưng chỉ có RARP server mới trả lại thông báo chứa địa chỉ mạng của máy đó.
Trên thực tế, khi muốn nhập vào một địa chỉ Internet nào đó, bạn hay đánh vào dòng chữ như "WWW.hotmail.com" mà ít thấy những dòng địa chỉ số khô khốc. Vậy có điều gì mâu thuẫn? Chẳng sao cả, Internet đã dùng một hệ thống gọi là DNS (Domain Name System) để đặt tên cho một host và cung cấp một số giao thức để chuyển đổi từ địa chỉ chữ ra địa chỉ số và ngược lại. Cách tổ chức tên của DNS tuân theo dạng hình cây như hình 4.
Một máy tính trong mạng sẽ ứng với một nút của cây. Như ở cây trên, máy ở lá FPT sẽ có địa chỉ hoàn chỉnh là fpt.com.vn. Mỗi nút trên cây biểu diễn một miền (domain) trong hệ thống DNS; mỗi miền lại có một hay nhiều miền con. Tại mỗi miền này đều phải có máy chủ DNS tương ứng quản lý hệ thống tên trong miền đó. Để hiểu rõ hơn hoạt động của DNS, lấy một ví dụ sau:
Một máy trạm có tên là test.fpt.com.vn muốn biết địa chỉ IP của máy www.microsoft. com, quá trình hỏi của nó như sau:
Khi máy test.fpt.com.vn gửi yêu cầu hỏi về máy www. microsoft.com tới DNS của miền fpt.com.vn, DNS xác định là tên đó không nằm trong miền mà nó quản lý và gửi ngược lên cho miền ở mức cao hơn là com.vn. Tại đây, DNS cũng không tìm được thông tin thoả mãn nên phải hỏi ngược lên DNS của miền vn.
Quá trình cứ thế tiếp diễn đến khi câu hỏi được gửi tới DNS của miền microsoft.com và tại đây câu hỏi được giải đáp.
Để hoạt động hiệu quả như trên, mỗi máy chủ DNS lưu trữ một cơ sở dữ liệu gồm các bản ghi chứa thông tin:
+ Tên của DNS cấp cao hơn
+ Địa chỉ IP
+ Địa chỉ dạng chữ tương ứng
Chỉ số của bản ghi được lấy từ địa chỉ IP tương ứng, nhờ đó từ địa chỉ IP có thể dễ dàng tìm ra địa chỉ chữ.
d. Protocol ID chỉ ra giao thức của tầng giao vận. Trên Internet trường này là TCP hoặc UDP.
e. Port là một số đặc trưng cho một chương trình chạy trên Internet. Ví dụ, chương trình lấy thư điện tử qua giao thức IMAP có port=143, truyền file có port =21, v.v...
f. Username là tên người đăng kí sử dụng chương trình.
ở phần II có nói tại router, IP sử dụng các thông tin điều khiển trong header của gói dữ liệu IP để quyết định đường đi tiếp theo của gói này. Có rất nhiều thông tin điều khiển nhưng ở đây chỉ xin phân tích các thông tin quan trọng.
- Đầu tiên là địa chỉ đích. Nếu địa chỉ đích trùng với địa chỉ của router đó thì gói dữ liệu được truyền trực tiếp cho host B. Nếu không trùng thì dữ liệu sẽ được truyền đến router tiếp theo trên đường đi. Vấn đề là router nào được chọn. Có 2 khả năng để lựa chọn router, tức là 2 khả năng để dẫn đường:
+ Thứ nhất là tuân theo một cách nghiêm ngặt source routing. Dữ liệu sẽ được truyền cho router tiếp theo trong source routing. Nhưng dữ liệu chỉ được truyền đi khi router được chọn có trong bảng các router có thể đến được của router hiện tại, bằng không sẽ sinh ra lỗi.
+ Thứ hai là "quên đi" source routing và tìm đường mới tới đích. Router tiếp theo được chọn dựa trên sự tìm đường này. Thông thường sự tìm đường dựa trên thuật toán Dijstra tìm kiếm theo chiều rộng. Trên thực tế, cách này đang được sử dụng rộng rãi và có thể trở thành chuẩn trong tương lai.
- Các gói dữ liệu IP thường có kích thước phụ thuộc vào mạng con. Các mạng con khác nhau thì kích thước gói IP của chúng cũng khác nhau. Vậy giả sử mạng A truyền được gói dữ liệu có kích thước lớn nhất là 1024 byte, mạng B truyền được gói dữ liệu có kích thước lớn nhất là 256 byte thì gói dữ liệu từ mạng A có kích thước 1024 byte qua mạng B như thế nào?
Để giải quyết vấn đề này, IP cung cấp khả năng phân và gom mảnh gói dữ liệu. Đây chính là lúc IP sử dụng trường flags và offset trong gói dữ liệu IP. Trường flags thực chất là các cờ thông báo gói dữ liệu này có bị phân mảnh hay không, trường offset chứa giá trị tương đối của gói con trong gói to ban đầu. Khi phân mảnh các cờ được bật lên, đồng thời trường offset được thiết lập giá trị. Dựa vào các dữ liệu trên, IP có thể dễ dàng gom mảnh gói dữ liệu, hồi phục khối dữ liệu to ban đầu.
Kiểm soát lỗi
Qua các phần trên ta thấy quá trình dữ liệu đi trên mạng đã khá rõ ràng nhưng trên một mạng rộng lớn như Internet thì có gì đảm bảo dữ liệu sẽ tới đích một cách an toàn? Điều gì xảy ra nếu trên đường đi các gói dữ liệu bị mất, tắc nghẽn, lạc đường...? Đây chỉ đơn thuần là các sự cố, nhưng thật đáng tiếc là nó lại rất hay xảy ra trên thực tế, do đó một yêu cầu đặt ra là phải có cơ chế thông báo và sửa lỗi trên mạng. Khi có lỗi, tầng IP đơn thuần huỷ bỏ dữ liệu và thông báo lỗi. Thông báo lỗi được thực hiện qua một giao thức gọi là ICMP (Internet Control Message Protocol). ICMP có thể coi là bạn đồng hành với IP và có một số đặc điểm sau:
- Dùng IP để truyền thông báo qua mạng
- Không có chức năng sửa lỗi mà chỉ đơn thuần là máy thông báo lỗi. Chức năng sửa lỗi là của tầng trên (tầng TCP)
- Thông báo lỗi về gói dữ liệu IP nhưng lại không thể thông báo lỗi về gói dữ liệu của chính mình
- Nếu gói dữ liệu IP bị phân mảnh thì khi xảy ra lỗi, ICMP chỉ thông báo lỗi của mảnh đầu tiên
Nói rằng việc sửa lỗi là của TCP nhưng thật ra TCP chẳng sửa lỗi gì cả, khi có lỗi xảy ra nó chỉ làm mỗi một việc là truyền lại. Hãy xem nó làm việc đó như thế nào. TCP truyền dữ liệu theo cơ chế "flow window". Tất cả các byte truyền đều được đánh số thứ tự và TCP quản lý việc truyền dữ liệu dựa vào số thứ tự đó.
Giả sử có 13 byte dữ liệu gửi cho máy B (hình 5) .
Byte 0 đã gửi đi và được xác nhận là tới nơi. Sự xác nhận này được thực hiện bằng cách khi nhận được dữ liệu gửi đến, máy B sẽ gửi một thông báo về cho máy gửi. Thông báo đó có chứa số thứ tự của byte được chấp nhận chứa trong trường ACK.
Byte 1, 2 đã được gửi nhưng chưa có xác nhận, các byte 3, 4, 5 trong khung sẽ được truyền đi, các byte từ 6 trở đi không thể được truyền. Giá trị window limit được tính bằng công thức sau:
Window limit=SND UNA + SND WND
SND UNA = số byte đã gửi đi nhưng chưa được xác nhận
SND WND= số byte trong ô, giá trị này được lấy từ trường window trong gói dữ liệu TCP dùng để xác nhận các byte đã tới nơi. Giá trị này chính là số dữ liệu mà máy B có thể chấp nhận.
Máy B bây giờ lại gửi một thông báo thừa nhận có ACK=3, Window=6. Lúc này dữ liệu có dạng như hình 6.
Các byte 0, 1, 2 đã được xác nhận, cửa sổ đã mở rộng ra, window limit nhận giá trị 3+6 =9. Như vậy số byte có thể truyền đi được điều khiển bởi máy B, điều này giúp giảm đi sự tắc nghẽn giao thông trên mạng và làm cho máy B có thể chủ động xử lý dữ liệu đến một cách trôi chảy.
Khi có lỗi xảy ra trên đường truyền và phải truyền lại dữ liệu thì TCP không chờ đợi thông báo xác nhận từ phía máy B mà nó làm theo cách sau: khi truyền một gói dữ liệu, TCP bấm giờ và nếu thời gian hết mà không thấy thông báo xác nhận thì nó tiến hành truyền lại.
Như vậy thời gian để bấm giờ hết sức quan trọng. Ban đầu thời gian này được thiết lập xung quanh khoảng thời gian kể từ khi TCP A gửi dữ liệu đi đến khi nhận được thông báo xác nhận. Nhưng về sau do cách tính này không hợp lý nên người ta đã đưa ra nhiều cách thiết lập khác nhau. Một trong các cách tính được dùng phổ biến hiện nay là thuật toán của Phil Karn. Nội dung căn bản của thuật toán là mỗi khi hết thời gian thì khoảng thời gian bấm đồng hồ tăng lên gấp một số lần cho trước.
NVT=A x VT
NVT: giá trị thời gian mới để bấm đồng hồ
A : hằng số, thường lấy bằng 2
VT: giá trị thời gian cũá
Cơ chế kết nối giữa hai máy trong mạng Internet
Chặng cuối cùng trong hoạt động của mạng Internet là cơ chế kết nối giữa hai máy. Để toàn bộ các hoạt động truyền tin giữa hai máy trong mạng có thể diễn ra thì phải hình thành kênh liên lạc hay một kết nối giữa chúng. Quá trình đó diễn ra như sau (hình 7):
1: ULP B giả sử là một chương trình mail server ở Mỹ. Do là server nên lúc nào nó cũng chờ đợi sự kết nối.
2: ULP A là chương trình nhận thư điện tử của bạn. Để kết nối, bạn gửi yêu cầu kết nối xuống cho tầng TCP.
3: TCP chuẩn bị một gói dữ liệu TCP với cờ SYN=1 yêu cầu có sự đồng bộ hoá, SEQ có thể lấy bất kì giá trị nào, ở đây là =100 và gửi cho TCP B.
4: Sau khi nhận gói dữ liệu có SYN=1, TCP B gửi trả lại một thông báo có SYN=1, ACK=101, SEQ có thể lấy bất kì giá trị nào, ở đây là =177.
5: TCP A nhận được gói dữ liệu từ TCP B sẽ gửi tiếp một gói dữ liệu có ACK=178.
6: TCP A chuyển chấp nhận kết nối lên chương trình A.
7: Sau khi nhận nốt gói dữ liệu có ACK=178, TCP B chuyển chấp nhận kết nối lên chương trình B.
Sự kết nối giữa 2 module TCP ở các bước 3, 4, 5 gọi là cơ chế bắt tay 3 bước (three way handshake).
Quá trình đóng một kết nối cũng thực hiện tương tự.
Nguyen Van Phu(I11c)- Tổng số bài gửi : 4
Join date : 15/09/2011
Kiến thức về Client/Server , Port , Socket
Kiến thức về Client/Server , Port , Socket
1. Mô hình client/server
Mô hình được phổ biến nhất và được chấp nhận rộng rãi trong các hệ thống phân tán là mô hình client/server. Trong mô hình này sẽ có một tập các tiến trình mà mỗi tiến trình đóng vai trò như là một trình quản lý tài nguyên cho một tập hợp các tài nguyên cho trước và một tập hợp các tiến trình client trong đó mỗi tiến trình thực hiện một tác vụ nào đó cần truy xuất tới tài nguyên phần cứng hoặc phần mềm dùng chung. Bản thân các trình quản lý tài nguyên cần phải truy xuất tới các tài nguyên dùng chung được quản lý bởi một tiến trình khác, vì vậy một số tiến trình vừa là tiến trình client vừa là tiến trình server. Các tiến trình phát ra các yêu cầu tới các server bất kỳ khi nào chúng cần truy xuất tới một trong các tài nguyên của các server. Nếu yêu cầu là đúng đắn thì server sẽ thực hiện hành động được yêu cầu và gửi một đáp ứng trả lời tới tiến trình client.
Mô hình client/server cung cấp một cách tiếp cận tổng quát để chia sẻ tài nguyên trong các hệ thống phân tán. Mô hình này có thể được cài đặt bằng rất nhiều môi trường phần cứng và phần mềm khác nhau. Các máy tính được sử dụng để chạy các tiến trình client/server có nhiều kiểu khác nhau và không cần thiết phải phân biệt giữa chúng; cả tiến trình client và tiến trình server đều có thể chạy trên cùng một máy tính. Một tiến trình server có thể sử dụng dịch vụ của một server khác.
Mô hình truyền tin client/server hướng tới việc cung cấp dịch vụ. Quá trình trao đổi dữ liệu bao gồm:
1. Truyền một yêu cầu từ tiến trình client tới tiến trình server
2. Yêu cầu được server xử lý
3. Truyền đáp ứng cho client
Mô hình truyền tin này liên quan đến việc truyền hai thông điệp và một dạng đồng bộ hóa cụ thể giữa client và server. Tiến trình server phải nhận thức được thông điệp được yêu cầu ở bước một ngay khi nó đến và hành động phát ra yêu cầu trong client phải được tạm dừng (bị phong tỏa) và buộc tiến trình client ở trạng thái chờ cho tớ khi nó nhận được đáp ứng do server gửi về ở bước ba.
Mô hình client/server thường được cài đặt dựa trên các thao tác cơ bản là gửi (send) và nhận (receive)
Quá trình giao tiếp client và server có thể diễn ra theo một t rong hai chế độ: bị phong tỏa (blocked) và không bị phong tỏa (non-blocked).
Chế độ bị phong tỏa (blocked):
Trong chế độ bị phong tỏa, khi tiến trình client hoặc server phát ra lệnh gửi dữ liệu (send), việc thực thi của tiến trình sẽ bị tạm ngừng cho tới khi tiến trình nhận phát ra lệnh nhận dữ liệu (receive).
Tương tự đối với tiến trình nhận dữ liệu, nếu tiến trình nào đó (client hoặc server) phát ra lệnh nhận dữ liệu, mà tại thời điểm đó chưa có dữ liệu gửi tới thì việc thực thi của tiến trình cũng sẽ bị tạm ngừng cho tới khi có dữ liệu gửi tới.
Chế độ không bị phong tỏa (non-blocked)
Trong chế độ này, khi tiến trình client hay server phát ra lệnh gửi dữ liệu thực sự, việc thực thi của tiến trình vẫn được tiến hành mà không quan tâm đến việc có tiến trình nào phát ra lệnh nhận dữ liệu đó hay không.
Tương tự cho trường hợp nhận dữ liệu, khi tiến trình phát ra lệnh nhận dữ liệu, nó sẽ nhận dữ liệu hiện có, việc thực thi của tiến trình vẫn được tiến hành mà không quan tâm đến việc có tiến trình nào phát ra lệnh gửi dữ liệu tiếp theo hay không.
2.Các kiến trúc Client/Server
2.1. Client/Server hai tầng (two-tier client/server)
Kiến trúc client/server đơn giản nhất là kiến trúc hai tầng. Trong thực tế hầu hết các kiến trúc client/server là kiến trúc hai tầng. Một ứng dụng hai tầng cung cấp nhiều trạm làm việc với một tầng trình diễn thống nhất, tầng này truyền tin với tầng lưu trữ dữ liệu tập trung. Tầng trình diễn thông thường là client, và tầng lưu trữ dữ liệu là server.
Hầu hết các ứng dụng Internet như là email, telnet, ftp thậm chí là cả Web là các ứng dụng hai tầng. Phần lớn các lập trình viên trình ứng dụng viết các ứng dụng client/server có xu thế sử dụng kiến trúc này.
Trong ứng dụng hai tầng truyền thống, khối lượng công việc xử lý được dành cho phía client trong khi server chỉ đơn giản đóng vai trò như là chương trình kiểm soát luồng vào ra giữa ứng dụng và dữ liệu. Kết quả là không chỉ hiệu năng của ứng dụng bị giảm đi do tài nguyên hạn chế của PC, mà khối lượng dữ liệu truyền đi trên mạng cũng tăng theo. Khi toàn bộ ứng dụng được xử lý trên một PC, ứng dụng bắt buộc phải yêu cầu nhiều dữ liệu trước khi đưa ra bất kỳ kết quả xử lý nào cho người dùng. Nhiều yêu cầu dữ liệu cũng làm giảm hiệu năng của mạng. Một vấn đề thường gặp khác đối với ứng dụng hai tầng là vấn đề bảo trì. Chỉ cần một thay đổi nhỏ đối với ứng dụng cũng cần phải thay đổi lại toàn bộ ứng dụng client và server.
2.2. Client/Server ba tầng
Ta có thể tránh được các vấn đề của kiến trúc client/server hai tầng bằng cách mở rộng kiến trúc thành ba tầng. Một kiến trúc ba tầng có thêm một tầng mới tác biệt việc xử lý dữ liệu ở vị trí trung tâm.
Theo kiến trúc ba tầng, một ứng dụng được chia thành ba tầng tách biệt nhau về mặt logic. Tầng đầu tiên là tầng trình diễn thường bao gồm các giao diện đồ họa. Tầng thứ hai, còn được gọi là tầng trung gian hay tầng tác nghiệp. Tầng thứ ba chứa dữ liệu cần cho ứng dụng. Tầng thứ ba về cơ bản là chương trình thực hiện các lời gọi hàm để tìm kiếm dữ liệu cần thiết. Tầng trình diễn nhận dữ liệu và định dạng nó để hiển thị. Sự tách biệt giữa chức năng xử lý với giao diện đã tạo nên sự linh hoạt cho việc thiết kế ứng dụng. Nhiều giao diện người dùng được xây dựng và triển khai mà không làm thay đổi logic ứng dụng.
Tầng thứ ba chứa dữ liệu cần thiết cho ứng dụng. Dữ liệu này có thể bao gồm bất kỳ nguồn thông tin nào, bao gồm cơ sở dữ liệu như Oracale, SQL Server hoặc tài liệu XML.
2.3. Kiến trúc n-tầng
Kiến trúc n-tầng được chia thành các tầng như sau:
Tầng giao diện người dùng: quản lý tương tác của người dùng với ứng dụng
Tầng logic trình diễn: Xác định cách thức hiển thị giao diện người dùng và các yêu cầu của người dùng được quản lý như thế nào.
Tầng logic tác nghiệp: Mô hình hóa các quy tắc tác nghiệp,
Tầng các dịch vụ hạ tầng: Cung cấp một chức năng bổ trợ cần thiết cho ứng dụng như các thành phần (truyền thông điệp, hỗ trợ giao tác).
3. Mô hình truyền tin socket
Khi lập trình, ta cần quan tâm đến chế độ bị phong tỏa, vì nó có thể dẫn đến tình huống một tiến trình nào đó sẽ rơi vào vòng lặp vô hạn của quá trình gửi hoặc nhận.
Trong chương 1 chúng ta đã biết hai giao thức TCP và UDP là các giao thức tầng giao vận để truyền dữ liệu. Mỗi giao thức có những ưu và nhược điểm riêng. Chẳng hạn, giao thức TCP có độ tin cậy truyền tin cao, nhưng tốc độ truyền tin bị hạn chế do phải có giai đoạn thiết lập và giải phóng liên kết khi truyền tin, khi gói tin có lỗi hay bị thất lạc thì giao thức TCP phải có trách nhiệm truyền lại,…Ngược lại, giao thức UDP có tốc độ truyền tin rất nhanh vì nó chỉ có một cơ chế truyền tin rất đơn giản: không cần phải thiết lập và giải phóng liên kết. Khi lập trình cho TCP ta sử dụng các socket luồng, còn đối với giao thức UDP ta sẽ sử dụng lớp DatagramSocket và DatagramPacket.
Truyền tin hướng liên kết nghĩa là cần có giai đoạn thiết lập liên kết và giải phóng liên kết trước khi truyền tin. Dữ liệu được truyền trên mạng Internet dưới dạng các gói (packet) có kích thước hữu hạn được gọi là datagram. Mỗi datagram chứa một header và một payload. Header chứa địa chỉ và cổng cần truyền gói tin đến, cũng như địa chỉ và cổng xuất phát của gói tin, và các thông tin khác được sử dụng để đảm bảo độ tin cậy truyền tin, payload chứa dữ liệu. Tuy nhiên do các datagram có chiều dài hữu hạn nên thường phải phân chia dữ liệu thành nhiều gói và khôi phục lại dữ liệu ban đầu từ các gói ở nơi nhận. Trong quá trình truyền tin có thể có thể có một hay nhiều gói bị mất hay bị hỏng và cần phải truyền lại hoặc các gói tin đến không theo đúng trình tự. Để tránh những điều này, việc phân chia dữ liệu thành các gói, tạo các header, phân tích header của các gói đến, quản lý danh sách các gói đã nhận được và các gói chưa nhận được, … rất nhiều công việc cần phải thực hiện, và đòi hỏi rất nhiều phần mềm phức tạp.
Thật may mắn, ta không cần phải tự thực hiện công việc này. Socket là một cuộc cách mạng của Berkeley UNIX. Chúng cho phép người lập trình xem một liên kết mạng như là một luồng mà có thể đọc dữ liệu ra hay ghi dữ liệu vào từ luồng này.
Về mặt lịch sử Socket là một sự mở rộng của một trong những ý tưởng quan trọng nhất của UNIX: tất cả các thao tác vào/ra giống như vào ra tệp tin đối với người lập trình, cho dù ta đang làm việc với bàn phím, màn hình đồ họa, một file thông thường, hay một liên kết mạng. Các Socket che dấu người lập trình khỏi các chi tiết mức thấp của mạng như môi kiểu đường truyền, các kích thước gói, yêu cầu truyền lại gói, các địa chỉ mạng…
Một socket có thể thực hiện bảy thao tác cơ bản:
Kết nối với một máy ở xa (ví dụ, chuẩn bị để gửi và nhận dữ liệu)
- Gửi dữ liệu
- Nhận dữ liệu
- Ngắt liên kêt
- Gán cổng
- Nghe dữ liệu đến
- Chấp nhận liên kết từ các máy ở xa trên cổng đã được gán
Lớp Socket của Java được sử dụng bởi cả client và server, có các phương thức tương ứng với bốn thao tác đầu tiên. Ba thao tác cuối chỉ cần cho server để chờ các client liên kết với chúng. Các thao tác này được cài đặt bởi lớp ServerSocket. Các socket cho client thường được sử dụng theo mô hình sau:
Một socket mới được tạo ra bằng cách sử dụng hàm Socket().
Socket cố gắng liên kết với một host ở xa.
Mỗi khi liên kết được thiết lập, các host ở xa nhận các luồng vào và luồng ra từ socket, và sử dụng các luồng này để gửi dữ liệu cho nhau. Kiểu liên kết này được gọi là song công (full-duplex)-các host có thể nhận và gửi dữ liệu đồng thời. Ý nghĩa của dữ liệu phụ thuộc vào giao thức.
Khi việc truyền dữ liệu hoàn thành, một hoặc cả hai phía ngắt liên kết. Một số giao thức, như HTTP, đòi hỏi mỗi liên kết phải bị đóng sau mỗi khi yêu cầu được phục vụ. Các giao thức khác, chẳng hạn FTP, cho phép nhiều yêu cầu được xử lý trong một liên kết đơn.
4. Socket cho Client
4.1. Các constructor
public Socket(String host, int port) throws UnknownHostException, IOException
Hàm này tạo một socket TCP với host và cổng xác định, và thực hiện liên kết với host ở xa.
Ví dụ:
Mã:
try{
Socket s = new Socket( “www.vnn.vn”,80);
} catch(UnknownHostException e){
System.err.println(e);
}catch(IOException e){
System.err.println(e);
}
Trong hàm này tham số host là hostname kiểu String, nếu host không xác định hoặc máy chủ tên miền không hoạt động thì constructor đưa ra ngoại lệ UnknownHostException. Vì một lý do nào đó mà không thể mở được socket thì constructor sẽ đưa ra ngoại lệ IOException. Có nhiều nguyên nhân khiến cho một liên kết thất bại: host mà ta đang cố gắng kết nối tới không chấp nhận liên kết, kết nối Internet có thể bị ngắt, hoặc vấn đề định tuyến có thể ngăn ngừa các gói tin của ta tới đích.
Ví dụ: Viết chương trình để kiểm tra trên 1024 cổng đầu tiên những cổng nào đang có server hoạt động
Mã: Chọn tất cả
import java.net.*;
import java.io.*;
class PortScanner
{
public static void main(String[ args)
{
String host=”localhost”;
if(args.length>0){
host=args[0];
}
for(int i=0;i<1024;i++){
try{
Socket s=new Socket(host,i);
System.out.println(“Co mot server dang hoat dong tren cong:”+i);
}
catch(UnknownHostException e){
System.err.println(e);
}
catch(IOException e){
System.err.println(e);
}
} }
}
- public Socket(InetAddress host, int port)throws IOException
Tương tự như constructor trước, constructor này tạo một socket TCP với thông tin là địa chỉ của một host được xác định bởi một đối tượng InetAddres và số hiệu cổng port, sau đó nó thực hiện kết nối tới host. Nó đưa ra ngoại lệ IOException nhưng không đưa ra ngoại lệ UnknownHostException. Constructor đưa ra ngoại lệ trong trường hợp không kết nối được tới host.
- public Socket (String host, int port, InetAddress interface, int localPort) throws IOException, UnknownHostException
Constructor này tạo ra một socket với thông tin là địa chỉ IP được biểu diễn bởi một đối tượng String và một số hiệu cổng và thực hiện kết nối tới host đó. Socket kết nối tới host ở xa thông qua một giao tiếp mạng và số hiệu cổng cục bộ được xác định bởi hai tham số sau. Nếu localPort bằng 0 thì Javasẽ lựa chọn một cổng ngẫu nhiên có sẵn nằm trong khoảng từ 1024 đến 65535.
- public Socket (InetAddress host, int port, InetAddress interface, int localPort) throws IOException, UnknownHostException
Constructor chỉ khác constructor trên ở chỗ địa chỉ của host lúc này được biểu diễn bởi một đối tượng InetAddress.
4.2. Nhận các thông tin về Socket
Đối tượng Socket có một số trường thông tin riêng mà ta có thể truy nhập tới chúng thông qua các phương thức trả về các thông tin này.
- public InetAddress getInetAddress()
Cho trước một đối tượng Socket, phương thức getInetAddress() cho ta biết host ở xa mà Socket kết nối tới, hoặc liên kết đã bị ngắt thì nó cho biết host ở xa mà Socket đã kết nối tới
- public int getPort()
Phương thức này cho biết số hiệu cổng mà Socket kết nối tới trên host ở xa.
- public int getLocalPort()
Thông thường một liên kết thường có hai đầu: host ở xa và host cục bộ. Để tìm ra số hiệu cổng ở phía host cục bộ ta gọi phương thức getLocalPort().
- public InetAddress getLocalAddress()
Phương thức này cho ta biết giao tiếp mạng nào mà một socket gắn kết với nó.
- public InputStream getInputStream() throws IOException
Phương thức geInputStream() trả về một luồng nhập để đọc dữ liệu từ một socket vào chương trình. Thông thường ta có thể gắn kết luồng nhập thô InputStream tới một luồng lọc hoặc một luồng ký tự nhằm đưa các chức năng tiện ích (chẳng hạn như các luồng InputStream, hoặc InputStreamReader). Để tâng cao hiệu năng, ta có thể đệm dữ liệu bằng cách gắn kết nó với luồng lọc BufferedInputStream hoặc BufferedReader.
- public OutputStream getOutputStream() throws IOException
Phương thức getOutputStream() trả về một luồng xuất thô để ghi dữ liệu từ ứng dụng ra đầu cuối của một socket. Thông thường, ta sẽ gắn kết luồng này với một luồng tiện lợi hơn như lớp DataOuputStream hoặc OutputStreamWriter trước khi sử dụng nó. Để tăng hiệu quả ghi.
Hai phương thức getInputStream() và getOutputStream() là các phương thức cho phép ta lấy về các luồng dữ liệu nhập và xuất. Như đã đề cập ở chương 3 vào ra trong Java được tiến hành thông qua các luồng, việc làm việc với các socket cũng không phải là một ngoại lệ. Để nhận dữ liệu từ một máy ở xa ta nhận về một luồng nhập từ socket và đọc dữ liệu từ luồng đó. Để ghi dữ liệu lên một máy ở xa ta nhận về một luồng xuất từ socket và ghi dữ liệu lên luồng. Dưới đây là hình vẽ để ta hình dung trực quan hơn.
+ InputStream
+ OutputStream
+ Socket
+ Chương trình
4.3. Đóng Socket
Đến thời điểm ta đã có đầy đủ các thông tin cần thiết để triển khai một ứng dụng phía client. Khi viết một chương trình ứng dụng phía client tất cả mọi công việc đều chuyển về việc quản lý luồng và chuyển đổi dữ liệu từ luồng thành dạng thức mà người sử dụng có thể hiểu được. Bản thân các socket rất đơn giản bởi vì các phần việc phức tạp đã được che dấu đi. Đây chính là lý do để socket trở thành một lựa chọn có tính chiến lược cho lập trình mạng.
- public void close() throws IOException
Các socket được đóng một cách tự động khi một trong hai luồng đóng lại, hoặc khi chương trình kết thúc, hoặc khi socket được thu hồi bởi gabbage collector. Tuy nhiên, thực tế cho thấy việc cho rằng hệ thống sẽ tự đóng socket là không tốt, đặc biệt là khi các chương trình chạy trong khoảng thời gian vô hạn. Để đóng một socket ta có thể dùng phương thức close().
Mỗi khi một Socket đã bị đóng lại, ta vẫn có thể truy xuất tới các trường thông tin InetAddress, địa chỉ cục bộ, và số hiệu cổng cục bộ thông qua các phưong thức getInetAddress(), getPort(), getLocalHost(), và getLocalPort(). Tuy nhiên khi ta gọi các phương thức getInputStream() hoặc getOutputStream() để đọc dữ liệu từ luồng đọc InputStream hoặc ghi dữ liệu OuputStream thì ngoại lệ IOException được đưa ra.
Các socket đóng một nửa (Half-closed socket)
Phương thức close() đóng cả các luồng nhập và luồng xuất từ socket. Trong một số trường hợp ta chỉ muốn đóng một nửa kết nối, hoặc là luồng nhập hoặc là luồng xuất. Bắt đầu từ Java 1.3, các phương thưc shutdownInput() và shutdownOutput() cho phép ta thực hiện điều này.
- public void shutdownInput() throws IOException
- public void shutdownOutput() throws IOException
Các phương thức này không thực sự ngắt liên kết. Tuy nhiên, nó chỉ điều chỉnh luồng kết nối tới nó sao cho.
Trong Java 1.4 đưa thêm vào hai phương thức các luồng nhập và luồng xuất mở hay đóng
- public boolean isInputShutdown()
- public boolean isOutputShutdown()
4.4. Thiết lập các tùy chọn cho Socket
4.4.1. TCP_NODELAY
- public void setTcpNoDelay(boolean on) throws SocketException
- public boolean getTcpNoDelay() throws SocketException
Thiết lập giá trị TCP_NODELAY là true để đảm bảo rằng các gói tin được gửi đi nhanh nhất có thể mà không quan tâm đến kích thước của chúng. Thông thường, các gói tin nhỏ được kết hợp lại thành các gói tin lớn hơn trước khi được gửi đi. Trước khi gửi đi một gói tin khác, host cục bộ đợi để nhận các xác thực của gói tin trước đó từ hệ thống ở xa.
4.4.2. SO_LINGER
- public void setSoLinger(boolean on, int seconds) throws SocketException
- public int getSoLinger() throws SocketException
Tùy chọn SO_LINGER xác định phải thực hiện công việc gì với datagram vẫn chưa được gửi đi khi một socket đã bị đóng lại. Ở chế độ mặc định, phương thức close() sẽ có hiệu lực ngay lập tức; nhưng hệ thống vẫn cố gắng để gửi phần dữ liệu còn lại. Nếu SO_LINGER được thiết lập bằng 0, các gói tin chưa được gửi đi bị phá hủy khi socket bị đóng lại. Nếu SO_LINGER lớn hơn 0, thì phương thức close() phong tỏa để chờ cho dữ liệu được gửi đi và nhận được xác thực từ phía nhận. Khi hết thời gian qui định, socket sẽ bị đóng lại và bất kỳ phần dữ liệu còn lại sẽ không được gửi đi.
4.4.3. SO_TIMEOUT
- public void setSoTimeout(int milliseconds) throws SocketException
- public int getSoTimeout() throws SocketException
Thông thường khi ta đọc dữ liệu từ mộ socket, lời gọi phương thức phong tỏa cho tới khi nhận đủ số byte. Bằng cách thiết lập phương thức SO_TIMEOUT, ta sẽ đảm bảo rằng lời gọi phương thức sẽ không phong tỏa trong khoảng thời gian quá số giây quy định.
4.5. Các phương thức của lớp Object
Lớp Socket nạp chồng phương thức chuẩn của lớp java.lang.Object, toString(). Vì các socket là các đối tượng tạm thời và thường chỉ tồn tại khi liên kết tồn tại.
- public String toString()
Phương thức toString() tạo ra một xâu ký tự như sau:
Socket[addr=www.oreilly.com/198.122.208.11,port=80,localport=50055]
Phương thức này thường hữu ích cho việc gỡ rối.
4.6. Các ngoại lệ Socket
Hầu hết các phương thức của lớp Socket được khai báo đưa ra ngoại lệ IOException, hoặc lớp con của lớp IOExcepton là lớp SocketException.
4.7. Các lớp SocketAddress
Lớp SocketAddress bắt đầu có từ phiên bản Java 1.4, biểu diễn một đầu cuối của liên kết. Lớp SocketAddress là một lớp trừu tượng mà không có phương thức nào ngoài construtor mặc định. Lớp này có thể được sử dụng cho cả các socket TCP và socket không phải là TCP. Các lớp con của lớp SocketAddress cung cấp thông tin chi tiết hơn thích hợp cho kiểu socket. Trong thực tế, chỉ hỗ trợ TCP/IP.
Mục đích chính của lớp SocketAddress là cung cấp một nơi lưu trữ các thông tin liên kết socket tạm thời (như địa chỉ IP và số hiệu cổng) có thể được sử dụng lại để tạo ra socket mới.
- public SocketAddress getRemoteSocketAddress()
- public SocketAddress getLocalSocketAddress()
Cả hai phương thức này trả về giá trị null nếu socket vẫn chưa kết nối tới.
5. Lớp ServerSocket
Lớp ServerSocket có đủ mọi thứ ta cần để viết các server bằng Java. Nó có các constructor để tạo các đối tượng ServerSocket mới, các phương thức để lắng nghe các liên kết trên một cổng xác định, và các phương thức trả về một Socket khi liên kết được thiết lập, vì vậy ta có thể gửi và nhận dữ liệu.
Vòng đời của một server
1. Một ServerSocket mới được tạo ra trên một cổng xác định bằng cách sử dụng một constructor ServerSocket.
2. ServerSocket lắng nghe liên kết đến trên cổng đó bằng cách sử dụng phương thức accept(). Phương thức accept() phong tỏa cho tới khi một client thực hiện một liên kết, phương thức accept() trả về một đối tượng Socket mà liên kết giữa client và server.
3. Tùy thuộc vào kiểu server, hoặc phương thức getInputStream(), getOutputStream() hoặc cả hai được gọi để nhận các luồng vào ra để truyền tin với client.
4. server và client tương tác theo một giao thức thỏa thuận sẵn cho tới khi ngắt liên kết.
5. Server, client hoặc cả hai ngắt liên kết
6. Server trở về bước hai và đợi liên kết tiếp theo.
5.1. Các constructor
- public ServerSocket(int port) throws IOException, BindException
Constructor này tạo một socket cho server trên cổng xác định. Nếu port bằng 0, hệ thống chọn một cổng ngẫu nhiên cho ta. Cổng do hệ thống chọn đôi khi được gọi là cổng vô danh vì ta không biết số hiệu cổng. Với các server, các cổng vô danh không hữu ích lắm vì các client cần phải biết trước cổng nào mà nó nối tới (giống như người gọi điện thoại ngoài việc xác định cần gọi cho ai cần phải biết số điện thoại để liên lạc với người đó).
Ví dụ: Để tạo một server socket cho cổng 80
Mã:
try{
ServerSocket httpd = new ServerSocket(80);
}
catch(IOException e)
{
System. err.println(e);
}
Constructor đưa ra ngoại lệ IOException nếu ta không thể tạo và gán Socket cho cổng được yêu cầu. Ngoại lệ IOException phát sinh khi:
- Cổng đã được sử dụng
- Không có quyền hoặc cố liên kết với một cổng nằm giữa 0 và 1023.
Ví dụ;
Mã:
import java.net.*;
import java.io.*;
public class congLocalHost
{
public static void main(String[ args)
{
ServerSocket ss;
for(int i=0;i<=1024;i++)
{
try{
ss= new ServerSocket(i);
ss.close();
}
catch(IOException e)
{
System.out.println(“Co mot server tren cong “+i);
}
} }
}
- public ServerSocket(int port, int queuelength, InetAddress bindAddress)throws IOException
Constructor này tạo một đối tượng ServerSocket trên cổng xác định với chiều dài hàng đợi xác định. ServerSocket chỉ gán cho địa chỉ IP cục bộ xác định. Constructor này hữu ích cho các server chạy trên các hệ thống có nhiều địa chỉ IP.
5.2. Chấp nhận và ngắt liên kết
Một đối tượng ServerSocket hoạt động trong một vòng lặp chấp nhận các liên kết. Mỗi lần lặp nó gọi phương thức accept(). Phương thức này trả về một đối tượng Socket biểu diễn liên kết giữa client và server. Tương tác giữ client và server được tiến hành thông qua socket này. Khi giao tác hoàn thành, server gọi phương thức close() của đối tượng socket. Nếu client ngắt liên kết trong khi server vẫn đang hoạt động, các luồng vào ra kết nối server với client sẽ đưa ra ngoại lệ InterruptedException trong lần lặp tiếp theo
- public Socket accept() throws IOException
Khi bước thiết lập liên kết hoàn thành, và ta sẵn sàng để chấp nhận liên kết, cần gọi phương thức accept() của lớp ServerSocket. Phương thức này phong tỏa; nó dừng quá trình xử lý và đợi cho tới khi client được kết nối. Khi client thực sự kết nối, phương thức accept() trả về đối tượng Socket. Ta sử dụng các phương thức getInputStream() và getOutputStream() để truyền tin với client.
Ví dụ:
Mã:
try{
ServerSocket theServer = new ServerSocket(5776);
while(true)
{
Socket con = theServer.accept();
PrintStream p = new PrintStream(con.getOutputStream());
p.println(“Ban da ket noi toi server nay. Bye-bye now.”);
con.close();
}
}
catch(IOException e)
{
System.err.println(e);
}
- public void close() throws IOException
Nếu ta đã kết thúc làm việc với một đối tượng server socket thì cần phải đóng lại đối tượng này.
Ví dụ: Cài đặt một server daytime
Mã:
import java.net.*;
import java.io.*;
import java.util.Date;
public class daytimeServer{
public final static int daytimePort =13;
public static void main(String[args)
{
ServerSocket theServer;
Socket con;
PrintStream p;
try{
theServer = new ServerSocket(daytimePort);
try{
p= new PrintStream(con.getOutputStream());
p.println(new Date());
con.close();
}
catch(IOException e)
{
theServer.close();
System. err.println(e);
}
}
catch(IOException e)
{
System. err.println(e);
}
}
}
- public void close() throws IOException
Nếu đã hoàn thành công việc với một ServerSocket, ta cần phải đóng nó lại, đặc biệt nếu chương trình của ta tiếp tục chạy. Điều này nhằm tạo điều kiện cho các chương trình khác muốn sử dụng nó. Đóng một ServerSocket không đồng nhất với việc đóng một Socket.
Lớp ServerSocket cung cấp một số phương thức cho ta biết địa chỉ cục bộ và cổng mà trên đó đối tượng server đang hoạt động. Các phương thức này hữu ích khi ta đã mở một đối tượng server socket trên một cổng vô danh và trên một giao tiếp mạng không
- public InetAddress getInetAddress()
Phương thức này trả về địa chỉ được sử dụng bởi server (localhost). Nếu localhost có địa chỉ IP, địa chỉ này được trả về bởi phương thức InetAddress.getLocalHost()
Ví dụ:
Mã:
try{
ServerSocket httpd = new ServerSocket(80);
InetAddress ia = httpd.getInetAddress();
}
catch(IOException e)
{
}
- public int getLocalHost()
Các contructor ServerSocket cho phép ta nghe dữ liệu trên cổng không định trước bằng cách gán số 0 cho cổng. Phương thức này cho phép ta tìm ra cổng mà server đang nghe.
1. Mô hình client/server
Mô hình được phổ biến nhất và được chấp nhận rộng rãi trong các hệ thống phân tán là mô hình client/server. Trong mô hình này sẽ có một tập các tiến trình mà mỗi tiến trình đóng vai trò như là một trình quản lý tài nguyên cho một tập hợp các tài nguyên cho trước và một tập hợp các tiến trình client trong đó mỗi tiến trình thực hiện một tác vụ nào đó cần truy xuất tới tài nguyên phần cứng hoặc phần mềm dùng chung. Bản thân các trình quản lý tài nguyên cần phải truy xuất tới các tài nguyên dùng chung được quản lý bởi một tiến trình khác, vì vậy một số tiến trình vừa là tiến trình client vừa là tiến trình server. Các tiến trình phát ra các yêu cầu tới các server bất kỳ khi nào chúng cần truy xuất tới một trong các tài nguyên của các server. Nếu yêu cầu là đúng đắn thì server sẽ thực hiện hành động được yêu cầu và gửi một đáp ứng trả lời tới tiến trình client.
Mô hình client/server cung cấp một cách tiếp cận tổng quát để chia sẻ tài nguyên trong các hệ thống phân tán. Mô hình này có thể được cài đặt bằng rất nhiều môi trường phần cứng và phần mềm khác nhau. Các máy tính được sử dụng để chạy các tiến trình client/server có nhiều kiểu khác nhau và không cần thiết phải phân biệt giữa chúng; cả tiến trình client và tiến trình server đều có thể chạy trên cùng một máy tính. Một tiến trình server có thể sử dụng dịch vụ của một server khác.
Mô hình truyền tin client/server hướng tới việc cung cấp dịch vụ. Quá trình trao đổi dữ liệu bao gồm:
1. Truyền một yêu cầu từ tiến trình client tới tiến trình server
2. Yêu cầu được server xử lý
3. Truyền đáp ứng cho client
Mô hình truyền tin này liên quan đến việc truyền hai thông điệp và một dạng đồng bộ hóa cụ thể giữa client và server. Tiến trình server phải nhận thức được thông điệp được yêu cầu ở bước một ngay khi nó đến và hành động phát ra yêu cầu trong client phải được tạm dừng (bị phong tỏa) và buộc tiến trình client ở trạng thái chờ cho tớ khi nó nhận được đáp ứng do server gửi về ở bước ba.
Mô hình client/server thường được cài đặt dựa trên các thao tác cơ bản là gửi (send) và nhận (receive)
Quá trình giao tiếp client và server có thể diễn ra theo một t rong hai chế độ: bị phong tỏa (blocked) và không bị phong tỏa (non-blocked).
Chế độ bị phong tỏa (blocked):
Trong chế độ bị phong tỏa, khi tiến trình client hoặc server phát ra lệnh gửi dữ liệu (send), việc thực thi của tiến trình sẽ bị tạm ngừng cho tới khi tiến trình nhận phát ra lệnh nhận dữ liệu (receive).
Tương tự đối với tiến trình nhận dữ liệu, nếu tiến trình nào đó (client hoặc server) phát ra lệnh nhận dữ liệu, mà tại thời điểm đó chưa có dữ liệu gửi tới thì việc thực thi của tiến trình cũng sẽ bị tạm ngừng cho tới khi có dữ liệu gửi tới.
Chế độ không bị phong tỏa (non-blocked)
Trong chế độ này, khi tiến trình client hay server phát ra lệnh gửi dữ liệu thực sự, việc thực thi của tiến trình vẫn được tiến hành mà không quan tâm đến việc có tiến trình nào phát ra lệnh nhận dữ liệu đó hay không.
Tương tự cho trường hợp nhận dữ liệu, khi tiến trình phát ra lệnh nhận dữ liệu, nó sẽ nhận dữ liệu hiện có, việc thực thi của tiến trình vẫn được tiến hành mà không quan tâm đến việc có tiến trình nào phát ra lệnh gửi dữ liệu tiếp theo hay không.
2.Các kiến trúc Client/Server
2.1. Client/Server hai tầng (two-tier client/server)
Kiến trúc client/server đơn giản nhất là kiến trúc hai tầng. Trong thực tế hầu hết các kiến trúc client/server là kiến trúc hai tầng. Một ứng dụng hai tầng cung cấp nhiều trạm làm việc với một tầng trình diễn thống nhất, tầng này truyền tin với tầng lưu trữ dữ liệu tập trung. Tầng trình diễn thông thường là client, và tầng lưu trữ dữ liệu là server.
Hầu hết các ứng dụng Internet như là email, telnet, ftp thậm chí là cả Web là các ứng dụng hai tầng. Phần lớn các lập trình viên trình ứng dụng viết các ứng dụng client/server có xu thế sử dụng kiến trúc này.
Trong ứng dụng hai tầng truyền thống, khối lượng công việc xử lý được dành cho phía client trong khi server chỉ đơn giản đóng vai trò như là chương trình kiểm soát luồng vào ra giữa ứng dụng và dữ liệu. Kết quả là không chỉ hiệu năng của ứng dụng bị giảm đi do tài nguyên hạn chế của PC, mà khối lượng dữ liệu truyền đi trên mạng cũng tăng theo. Khi toàn bộ ứng dụng được xử lý trên một PC, ứng dụng bắt buộc phải yêu cầu nhiều dữ liệu trước khi đưa ra bất kỳ kết quả xử lý nào cho người dùng. Nhiều yêu cầu dữ liệu cũng làm giảm hiệu năng của mạng. Một vấn đề thường gặp khác đối với ứng dụng hai tầng là vấn đề bảo trì. Chỉ cần một thay đổi nhỏ đối với ứng dụng cũng cần phải thay đổi lại toàn bộ ứng dụng client và server.
2.2. Client/Server ba tầng
Ta có thể tránh được các vấn đề của kiến trúc client/server hai tầng bằng cách mở rộng kiến trúc thành ba tầng. Một kiến trúc ba tầng có thêm một tầng mới tác biệt việc xử lý dữ liệu ở vị trí trung tâm.
Theo kiến trúc ba tầng, một ứng dụng được chia thành ba tầng tách biệt nhau về mặt logic. Tầng đầu tiên là tầng trình diễn thường bao gồm các giao diện đồ họa. Tầng thứ hai, còn được gọi là tầng trung gian hay tầng tác nghiệp. Tầng thứ ba chứa dữ liệu cần cho ứng dụng. Tầng thứ ba về cơ bản là chương trình thực hiện các lời gọi hàm để tìm kiếm dữ liệu cần thiết. Tầng trình diễn nhận dữ liệu và định dạng nó để hiển thị. Sự tách biệt giữa chức năng xử lý với giao diện đã tạo nên sự linh hoạt cho việc thiết kế ứng dụng. Nhiều giao diện người dùng được xây dựng và triển khai mà không làm thay đổi logic ứng dụng.
Tầng thứ ba chứa dữ liệu cần thiết cho ứng dụng. Dữ liệu này có thể bao gồm bất kỳ nguồn thông tin nào, bao gồm cơ sở dữ liệu như Oracale, SQL Server hoặc tài liệu XML.
2.3. Kiến trúc n-tầng
Kiến trúc n-tầng được chia thành các tầng như sau:
Tầng giao diện người dùng: quản lý tương tác của người dùng với ứng dụng
Tầng logic trình diễn: Xác định cách thức hiển thị giao diện người dùng và các yêu cầu của người dùng được quản lý như thế nào.
Tầng logic tác nghiệp: Mô hình hóa các quy tắc tác nghiệp,
Tầng các dịch vụ hạ tầng: Cung cấp một chức năng bổ trợ cần thiết cho ứng dụng như các thành phần (truyền thông điệp, hỗ trợ giao tác).
3. Mô hình truyền tin socket
Khi lập trình, ta cần quan tâm đến chế độ bị phong tỏa, vì nó có thể dẫn đến tình huống một tiến trình nào đó sẽ rơi vào vòng lặp vô hạn của quá trình gửi hoặc nhận.
Trong chương 1 chúng ta đã biết hai giao thức TCP và UDP là các giao thức tầng giao vận để truyền dữ liệu. Mỗi giao thức có những ưu và nhược điểm riêng. Chẳng hạn, giao thức TCP có độ tin cậy truyền tin cao, nhưng tốc độ truyền tin bị hạn chế do phải có giai đoạn thiết lập và giải phóng liên kết khi truyền tin, khi gói tin có lỗi hay bị thất lạc thì giao thức TCP phải có trách nhiệm truyền lại,…Ngược lại, giao thức UDP có tốc độ truyền tin rất nhanh vì nó chỉ có một cơ chế truyền tin rất đơn giản: không cần phải thiết lập và giải phóng liên kết. Khi lập trình cho TCP ta sử dụng các socket luồng, còn đối với giao thức UDP ta sẽ sử dụng lớp DatagramSocket và DatagramPacket.
Truyền tin hướng liên kết nghĩa là cần có giai đoạn thiết lập liên kết và giải phóng liên kết trước khi truyền tin. Dữ liệu được truyền trên mạng Internet dưới dạng các gói (packet) có kích thước hữu hạn được gọi là datagram. Mỗi datagram chứa một header và một payload. Header chứa địa chỉ và cổng cần truyền gói tin đến, cũng như địa chỉ và cổng xuất phát của gói tin, và các thông tin khác được sử dụng để đảm bảo độ tin cậy truyền tin, payload chứa dữ liệu. Tuy nhiên do các datagram có chiều dài hữu hạn nên thường phải phân chia dữ liệu thành nhiều gói và khôi phục lại dữ liệu ban đầu từ các gói ở nơi nhận. Trong quá trình truyền tin có thể có thể có một hay nhiều gói bị mất hay bị hỏng và cần phải truyền lại hoặc các gói tin đến không theo đúng trình tự. Để tránh những điều này, việc phân chia dữ liệu thành các gói, tạo các header, phân tích header của các gói đến, quản lý danh sách các gói đã nhận được và các gói chưa nhận được, … rất nhiều công việc cần phải thực hiện, và đòi hỏi rất nhiều phần mềm phức tạp.
Thật may mắn, ta không cần phải tự thực hiện công việc này. Socket là một cuộc cách mạng của Berkeley UNIX. Chúng cho phép người lập trình xem một liên kết mạng như là một luồng mà có thể đọc dữ liệu ra hay ghi dữ liệu vào từ luồng này.
Về mặt lịch sử Socket là một sự mở rộng của một trong những ý tưởng quan trọng nhất của UNIX: tất cả các thao tác vào/ra giống như vào ra tệp tin đối với người lập trình, cho dù ta đang làm việc với bàn phím, màn hình đồ họa, một file thông thường, hay một liên kết mạng. Các Socket che dấu người lập trình khỏi các chi tiết mức thấp của mạng như môi kiểu đường truyền, các kích thước gói, yêu cầu truyền lại gói, các địa chỉ mạng…
Một socket có thể thực hiện bảy thao tác cơ bản:
Kết nối với một máy ở xa (ví dụ, chuẩn bị để gửi và nhận dữ liệu)
- Gửi dữ liệu
- Nhận dữ liệu
- Ngắt liên kêt
- Gán cổng
- Nghe dữ liệu đến
- Chấp nhận liên kết từ các máy ở xa trên cổng đã được gán
Lớp Socket của Java được sử dụng bởi cả client và server, có các phương thức tương ứng với bốn thao tác đầu tiên. Ba thao tác cuối chỉ cần cho server để chờ các client liên kết với chúng. Các thao tác này được cài đặt bởi lớp ServerSocket. Các socket cho client thường được sử dụng theo mô hình sau:
Một socket mới được tạo ra bằng cách sử dụng hàm Socket().
Socket cố gắng liên kết với một host ở xa.
Mỗi khi liên kết được thiết lập, các host ở xa nhận các luồng vào và luồng ra từ socket, và sử dụng các luồng này để gửi dữ liệu cho nhau. Kiểu liên kết này được gọi là song công (full-duplex)-các host có thể nhận và gửi dữ liệu đồng thời. Ý nghĩa của dữ liệu phụ thuộc vào giao thức.
Khi việc truyền dữ liệu hoàn thành, một hoặc cả hai phía ngắt liên kết. Một số giao thức, như HTTP, đòi hỏi mỗi liên kết phải bị đóng sau mỗi khi yêu cầu được phục vụ. Các giao thức khác, chẳng hạn FTP, cho phép nhiều yêu cầu được xử lý trong một liên kết đơn.
4. Socket cho Client
4.1. Các constructor
public Socket(String host, int port) throws UnknownHostException, IOException
Hàm này tạo một socket TCP với host và cổng xác định, và thực hiện liên kết với host ở xa.
Ví dụ:
Mã:
try{
Socket s = new Socket( “www.vnn.vn”,80);
} catch(UnknownHostException e){
System.err.println(e);
}catch(IOException e){
System.err.println(e);
}
Trong hàm này tham số host là hostname kiểu String, nếu host không xác định hoặc máy chủ tên miền không hoạt động thì constructor đưa ra ngoại lệ UnknownHostException. Vì một lý do nào đó mà không thể mở được socket thì constructor sẽ đưa ra ngoại lệ IOException. Có nhiều nguyên nhân khiến cho một liên kết thất bại: host mà ta đang cố gắng kết nối tới không chấp nhận liên kết, kết nối Internet có thể bị ngắt, hoặc vấn đề định tuyến có thể ngăn ngừa các gói tin của ta tới đích.
Ví dụ: Viết chương trình để kiểm tra trên 1024 cổng đầu tiên những cổng nào đang có server hoạt động
Mã: Chọn tất cả
import java.net.*;
import java.io.*;
class PortScanner
{
public static void main(String[ args)
{
String host=”localhost”;
if(args.length>0){
host=args[0];
}
for(int i=0;i<1024;i++){
try{
Socket s=new Socket(host,i);
System.out.println(“Co mot server dang hoat dong tren cong:”+i);
}
catch(UnknownHostException e){
System.err.println(e);
}
catch(IOException e){
System.err.println(e);
}
} }
}
- public Socket(InetAddress host, int port)throws IOException
Tương tự như constructor trước, constructor này tạo một socket TCP với thông tin là địa chỉ của một host được xác định bởi một đối tượng InetAddres và số hiệu cổng port, sau đó nó thực hiện kết nối tới host. Nó đưa ra ngoại lệ IOException nhưng không đưa ra ngoại lệ UnknownHostException. Constructor đưa ra ngoại lệ trong trường hợp không kết nối được tới host.
- public Socket (String host, int port, InetAddress interface, int localPort) throws IOException, UnknownHostException
Constructor này tạo ra một socket với thông tin là địa chỉ IP được biểu diễn bởi một đối tượng String và một số hiệu cổng và thực hiện kết nối tới host đó. Socket kết nối tới host ở xa thông qua một giao tiếp mạng và số hiệu cổng cục bộ được xác định bởi hai tham số sau. Nếu localPort bằng 0 thì Javasẽ lựa chọn một cổng ngẫu nhiên có sẵn nằm trong khoảng từ 1024 đến 65535.
- public Socket (InetAddress host, int port, InetAddress interface, int localPort) throws IOException, UnknownHostException
Constructor chỉ khác constructor trên ở chỗ địa chỉ của host lúc này được biểu diễn bởi một đối tượng InetAddress.
4.2. Nhận các thông tin về Socket
Đối tượng Socket có một số trường thông tin riêng mà ta có thể truy nhập tới chúng thông qua các phương thức trả về các thông tin này.
- public InetAddress getInetAddress()
Cho trước một đối tượng Socket, phương thức getInetAddress() cho ta biết host ở xa mà Socket kết nối tới, hoặc liên kết đã bị ngắt thì nó cho biết host ở xa mà Socket đã kết nối tới
- public int getPort()
Phương thức này cho biết số hiệu cổng mà Socket kết nối tới trên host ở xa.
- public int getLocalPort()
Thông thường một liên kết thường có hai đầu: host ở xa và host cục bộ. Để tìm ra số hiệu cổng ở phía host cục bộ ta gọi phương thức getLocalPort().
- public InetAddress getLocalAddress()
Phương thức này cho ta biết giao tiếp mạng nào mà một socket gắn kết với nó.
- public InputStream getInputStream() throws IOException
Phương thức geInputStream() trả về một luồng nhập để đọc dữ liệu từ một socket vào chương trình. Thông thường ta có thể gắn kết luồng nhập thô InputStream tới một luồng lọc hoặc một luồng ký tự nhằm đưa các chức năng tiện ích (chẳng hạn như các luồng InputStream, hoặc InputStreamReader). Để tâng cao hiệu năng, ta có thể đệm dữ liệu bằng cách gắn kết nó với luồng lọc BufferedInputStream hoặc BufferedReader.
- public OutputStream getOutputStream() throws IOException
Phương thức getOutputStream() trả về một luồng xuất thô để ghi dữ liệu từ ứng dụng ra đầu cuối của một socket. Thông thường, ta sẽ gắn kết luồng này với một luồng tiện lợi hơn như lớp DataOuputStream hoặc OutputStreamWriter trước khi sử dụng nó. Để tăng hiệu quả ghi.
Hai phương thức getInputStream() và getOutputStream() là các phương thức cho phép ta lấy về các luồng dữ liệu nhập và xuất. Như đã đề cập ở chương 3 vào ra trong Java được tiến hành thông qua các luồng, việc làm việc với các socket cũng không phải là một ngoại lệ. Để nhận dữ liệu từ một máy ở xa ta nhận về một luồng nhập từ socket và đọc dữ liệu từ luồng đó. Để ghi dữ liệu lên một máy ở xa ta nhận về một luồng xuất từ socket và ghi dữ liệu lên luồng. Dưới đây là hình vẽ để ta hình dung trực quan hơn.
+ InputStream
+ OutputStream
+ Socket
+ Chương trình
4.3. Đóng Socket
Đến thời điểm ta đã có đầy đủ các thông tin cần thiết để triển khai một ứng dụng phía client. Khi viết một chương trình ứng dụng phía client tất cả mọi công việc đều chuyển về việc quản lý luồng và chuyển đổi dữ liệu từ luồng thành dạng thức mà người sử dụng có thể hiểu được. Bản thân các socket rất đơn giản bởi vì các phần việc phức tạp đã được che dấu đi. Đây chính là lý do để socket trở thành một lựa chọn có tính chiến lược cho lập trình mạng.
- public void close() throws IOException
Các socket được đóng một cách tự động khi một trong hai luồng đóng lại, hoặc khi chương trình kết thúc, hoặc khi socket được thu hồi bởi gabbage collector. Tuy nhiên, thực tế cho thấy việc cho rằng hệ thống sẽ tự đóng socket là không tốt, đặc biệt là khi các chương trình chạy trong khoảng thời gian vô hạn. Để đóng một socket ta có thể dùng phương thức close().
Mỗi khi một Socket đã bị đóng lại, ta vẫn có thể truy xuất tới các trường thông tin InetAddress, địa chỉ cục bộ, và số hiệu cổng cục bộ thông qua các phưong thức getInetAddress(), getPort(), getLocalHost(), và getLocalPort(). Tuy nhiên khi ta gọi các phương thức getInputStream() hoặc getOutputStream() để đọc dữ liệu từ luồng đọc InputStream hoặc ghi dữ liệu OuputStream thì ngoại lệ IOException được đưa ra.
Các socket đóng một nửa (Half-closed socket)
Phương thức close() đóng cả các luồng nhập và luồng xuất từ socket. Trong một số trường hợp ta chỉ muốn đóng một nửa kết nối, hoặc là luồng nhập hoặc là luồng xuất. Bắt đầu từ Java 1.3, các phương thưc shutdownInput() và shutdownOutput() cho phép ta thực hiện điều này.
- public void shutdownInput() throws IOException
- public void shutdownOutput() throws IOException
Các phương thức này không thực sự ngắt liên kết. Tuy nhiên, nó chỉ điều chỉnh luồng kết nối tới nó sao cho.
Trong Java 1.4 đưa thêm vào hai phương thức các luồng nhập và luồng xuất mở hay đóng
- public boolean isInputShutdown()
- public boolean isOutputShutdown()
4.4. Thiết lập các tùy chọn cho Socket
4.4.1. TCP_NODELAY
- public void setTcpNoDelay(boolean on) throws SocketException
- public boolean getTcpNoDelay() throws SocketException
Thiết lập giá trị TCP_NODELAY là true để đảm bảo rằng các gói tin được gửi đi nhanh nhất có thể mà không quan tâm đến kích thước của chúng. Thông thường, các gói tin nhỏ được kết hợp lại thành các gói tin lớn hơn trước khi được gửi đi. Trước khi gửi đi một gói tin khác, host cục bộ đợi để nhận các xác thực của gói tin trước đó từ hệ thống ở xa.
4.4.2. SO_LINGER
- public void setSoLinger(boolean on, int seconds) throws SocketException
- public int getSoLinger() throws SocketException
Tùy chọn SO_LINGER xác định phải thực hiện công việc gì với datagram vẫn chưa được gửi đi khi một socket đã bị đóng lại. Ở chế độ mặc định, phương thức close() sẽ có hiệu lực ngay lập tức; nhưng hệ thống vẫn cố gắng để gửi phần dữ liệu còn lại. Nếu SO_LINGER được thiết lập bằng 0, các gói tin chưa được gửi đi bị phá hủy khi socket bị đóng lại. Nếu SO_LINGER lớn hơn 0, thì phương thức close() phong tỏa để chờ cho dữ liệu được gửi đi và nhận được xác thực từ phía nhận. Khi hết thời gian qui định, socket sẽ bị đóng lại và bất kỳ phần dữ liệu còn lại sẽ không được gửi đi.
4.4.3. SO_TIMEOUT
- public void setSoTimeout(int milliseconds) throws SocketException
- public int getSoTimeout() throws SocketException
Thông thường khi ta đọc dữ liệu từ mộ socket, lời gọi phương thức phong tỏa cho tới khi nhận đủ số byte. Bằng cách thiết lập phương thức SO_TIMEOUT, ta sẽ đảm bảo rằng lời gọi phương thức sẽ không phong tỏa trong khoảng thời gian quá số giây quy định.
4.5. Các phương thức của lớp Object
Lớp Socket nạp chồng phương thức chuẩn của lớp java.lang.Object, toString(). Vì các socket là các đối tượng tạm thời và thường chỉ tồn tại khi liên kết tồn tại.
- public String toString()
Phương thức toString() tạo ra một xâu ký tự như sau:
Socket[addr=www.oreilly.com/198.122.208.11,port=80,localport=50055]
Phương thức này thường hữu ích cho việc gỡ rối.
4.6. Các ngoại lệ Socket
Hầu hết các phương thức của lớp Socket được khai báo đưa ra ngoại lệ IOException, hoặc lớp con của lớp IOExcepton là lớp SocketException.
4.7. Các lớp SocketAddress
Lớp SocketAddress bắt đầu có từ phiên bản Java 1.4, biểu diễn một đầu cuối của liên kết. Lớp SocketAddress là một lớp trừu tượng mà không có phương thức nào ngoài construtor mặc định. Lớp này có thể được sử dụng cho cả các socket TCP và socket không phải là TCP. Các lớp con của lớp SocketAddress cung cấp thông tin chi tiết hơn thích hợp cho kiểu socket. Trong thực tế, chỉ hỗ trợ TCP/IP.
Mục đích chính của lớp SocketAddress là cung cấp một nơi lưu trữ các thông tin liên kết socket tạm thời (như địa chỉ IP và số hiệu cổng) có thể được sử dụng lại để tạo ra socket mới.
- public SocketAddress getRemoteSocketAddress()
- public SocketAddress getLocalSocketAddress()
Cả hai phương thức này trả về giá trị null nếu socket vẫn chưa kết nối tới.
5. Lớp ServerSocket
Lớp ServerSocket có đủ mọi thứ ta cần để viết các server bằng Java. Nó có các constructor để tạo các đối tượng ServerSocket mới, các phương thức để lắng nghe các liên kết trên một cổng xác định, và các phương thức trả về một Socket khi liên kết được thiết lập, vì vậy ta có thể gửi và nhận dữ liệu.
Vòng đời của một server
1. Một ServerSocket mới được tạo ra trên một cổng xác định bằng cách sử dụng một constructor ServerSocket.
2. ServerSocket lắng nghe liên kết đến trên cổng đó bằng cách sử dụng phương thức accept(). Phương thức accept() phong tỏa cho tới khi một client thực hiện một liên kết, phương thức accept() trả về một đối tượng Socket mà liên kết giữa client và server.
3. Tùy thuộc vào kiểu server, hoặc phương thức getInputStream(), getOutputStream() hoặc cả hai được gọi để nhận các luồng vào ra để truyền tin với client.
4. server và client tương tác theo một giao thức thỏa thuận sẵn cho tới khi ngắt liên kết.
5. Server, client hoặc cả hai ngắt liên kết
6. Server trở về bước hai và đợi liên kết tiếp theo.
5.1. Các constructor
- public ServerSocket(int port) throws IOException, BindException
Constructor này tạo một socket cho server trên cổng xác định. Nếu port bằng 0, hệ thống chọn một cổng ngẫu nhiên cho ta. Cổng do hệ thống chọn đôi khi được gọi là cổng vô danh vì ta không biết số hiệu cổng. Với các server, các cổng vô danh không hữu ích lắm vì các client cần phải biết trước cổng nào mà nó nối tới (giống như người gọi điện thoại ngoài việc xác định cần gọi cho ai cần phải biết số điện thoại để liên lạc với người đó).
Ví dụ: Để tạo một server socket cho cổng 80
Mã:
try{
ServerSocket httpd = new ServerSocket(80);
}
catch(IOException e)
{
System. err.println(e);
}
Constructor đưa ra ngoại lệ IOException nếu ta không thể tạo và gán Socket cho cổng được yêu cầu. Ngoại lệ IOException phát sinh khi:
- Cổng đã được sử dụng
- Không có quyền hoặc cố liên kết với một cổng nằm giữa 0 và 1023.
Ví dụ;
Mã:
import java.net.*;
import java.io.*;
public class congLocalHost
{
public static void main(String[ args)
{
ServerSocket ss;
for(int i=0;i<=1024;i++)
{
try{
ss= new ServerSocket(i);
ss.close();
}
catch(IOException e)
{
System.out.println(“Co mot server tren cong “+i);
}
} }
}
- public ServerSocket(int port, int queuelength, InetAddress bindAddress)throws IOException
Constructor này tạo một đối tượng ServerSocket trên cổng xác định với chiều dài hàng đợi xác định. ServerSocket chỉ gán cho địa chỉ IP cục bộ xác định. Constructor này hữu ích cho các server chạy trên các hệ thống có nhiều địa chỉ IP.
5.2. Chấp nhận và ngắt liên kết
Một đối tượng ServerSocket hoạt động trong một vòng lặp chấp nhận các liên kết. Mỗi lần lặp nó gọi phương thức accept(). Phương thức này trả về một đối tượng Socket biểu diễn liên kết giữa client và server. Tương tác giữ client và server được tiến hành thông qua socket này. Khi giao tác hoàn thành, server gọi phương thức close() của đối tượng socket. Nếu client ngắt liên kết trong khi server vẫn đang hoạt động, các luồng vào ra kết nối server với client sẽ đưa ra ngoại lệ InterruptedException trong lần lặp tiếp theo
- public Socket accept() throws IOException
Khi bước thiết lập liên kết hoàn thành, và ta sẵn sàng để chấp nhận liên kết, cần gọi phương thức accept() của lớp ServerSocket. Phương thức này phong tỏa; nó dừng quá trình xử lý và đợi cho tới khi client được kết nối. Khi client thực sự kết nối, phương thức accept() trả về đối tượng Socket. Ta sử dụng các phương thức getInputStream() và getOutputStream() để truyền tin với client.
Ví dụ:
Mã:
try{
ServerSocket theServer = new ServerSocket(5776);
while(true)
{
Socket con = theServer.accept();
PrintStream p = new PrintStream(con.getOutputStream());
p.println(“Ban da ket noi toi server nay. Bye-bye now.”);
con.close();
}
}
catch(IOException e)
{
System.err.println(e);
}
- public void close() throws IOException
Nếu ta đã kết thúc làm việc với một đối tượng server socket thì cần phải đóng lại đối tượng này.
Ví dụ: Cài đặt một server daytime
Mã:
import java.net.*;
import java.io.*;
import java.util.Date;
public class daytimeServer{
public final static int daytimePort =13;
public static void main(String[args)
{
ServerSocket theServer;
Socket con;
PrintStream p;
try{
theServer = new ServerSocket(daytimePort);
try{
p= new PrintStream(con.getOutputStream());
p.println(new Date());
con.close();
}
catch(IOException e)
{
theServer.close();
System. err.println(e);
}
}
catch(IOException e)
{
System. err.println(e);
}
}
}
- public void close() throws IOException
Nếu đã hoàn thành công việc với một ServerSocket, ta cần phải đóng nó lại, đặc biệt nếu chương trình của ta tiếp tục chạy. Điều này nhằm tạo điều kiện cho các chương trình khác muốn sử dụng nó. Đóng một ServerSocket không đồng nhất với việc đóng một Socket.
Lớp ServerSocket cung cấp một số phương thức cho ta biết địa chỉ cục bộ và cổng mà trên đó đối tượng server đang hoạt động. Các phương thức này hữu ích khi ta đã mở một đối tượng server socket trên một cổng vô danh và trên một giao tiếp mạng không
- public InetAddress getInetAddress()
Phương thức này trả về địa chỉ được sử dụng bởi server (localhost). Nếu localhost có địa chỉ IP, địa chỉ này được trả về bởi phương thức InetAddress.getLocalHost()
Ví dụ:
Mã:
try{
ServerSocket httpd = new ServerSocket(80);
InetAddress ia = httpd.getInetAddress();
}
catch(IOException e)
{
}
- public int getLocalHost()
Các contructor ServerSocket cho phép ta nghe dữ liệu trên cổng không định trước bằng cách gán số 0 cho cổng. Phương thức này cho phép ta tìm ra cổng mà server đang nghe.
Nguyen Van Phu(I11c)- Tổng số bài gửi : 4
Join date : 15/09/2011
Bài 5 chưa học mà
DoThiNgocNuong (I11C) đã viết:Duongthithanhhuynh (I11C) đã viết:ủa mình nhớ không lầm là những vấn đề mấy bạn post trong mục này là thuộc về bài 4 mà, mấy bạn post có đúng mục ko nhi? làm mình rối quá mình đi học đầy đủ mà hình như bài 5 "đa luồng" chưa học mà sao có vấn đề để thảo luận?hixhix
Bài 5 chưa học mà tự nhiên vô forum thấy post lên rồi. Cứ tưởng mình đang nhầm chứ. Mấy bạn vui lòng post đúng mục đi.
Ua mình cũng thấy lạ bài 5 chưa học mà thấy mấy bạn post wua trời. Mình cũng đi học đều mà.
nguyenthithuylinh (I11C)- Tổng số bài gửi : 23
Join date : 26/08/2011
Re: Thảo luận Bài 5
nguyenthithuylinh (I11C) đã viết:DoThiNgocNuong (I11C) đã viết:Duongthithanhhuynh (I11C) đã viết:ủa mình nhớ không lầm là những vấn đề mấy bạn post trong mục này là thuộc về bài 4 mà, mấy bạn post có đúng mục ko nhi? làm mình rối quá mình đi học đầy đủ mà hình như bài 5 "đa luồng" chưa học mà sao có vấn đề để thảo luận?hixhix
Bài 5 chưa học mà tự nhiên vô forum thấy post lên rồi. Cứ tưởng mình đang nhầm chứ. Mấy bạn vui lòng post đúng mục đi.
Ua mình cũng thấy lạ bài 5 chưa học mà thấy mấy bạn post wua trời. Mình cũng đi học đều mà.
Ý kiến của bạn Linh cũng giống như mình vậy đó! Mình xem qua mà hết cả hồn, bài 5 chưa học mà đã có những 3 trang bài viết rồi . Tuần vừa rồi còn mới thực hành các code sau khi hết bài 4 kia mà. Hihi...
n.t.tuyet.trinh90 (I11C)- Tổng số bài gửi : 24
Join date : 26/08/2011
TÌM HIỂU TCP VÀ UDP
Địa chỉ IP:
Mỗi căn nhà đều có số nhà, máy tính cũng vậy, trên mạng Internet, mỗi máy tính có một địa chỉ riêng. Có thể coi IP là địa chỉ của các máy tính trên mạng.
Tạm thời với số mạng, số máy trên thế giới hiện tại thì cứ tam coi như cấu trúc địa chỉ IP như hiện tại (IPv4) là tạm ổn. Sau này sẽ phải mở rộng (IPv6) kiểu như thêm số vào số phone chẳng hạn.
IP là chữ viết tắt của Internet Protocol. Địa chỉ IP đang được sử dụng hiện tại (IPv4) có 32 bit chia thành 4 Octet ( mỗi Octet có 8 bit, tương đương 1 byte ) cách đếm đều từ trái qua phải bít 1 cho đến bít 32, các Octet tách biệt nhau bằng dấu chấm (.), bao gồm có 3 thành phần chính.
Đây là 3 phần chính của một địa chỉ IP
Class bit Net ID Host ID
Bit nhận dạng lớp ( Class bit )
Địa chỉ của mạng ( Net ID )
Địa chỉ của máy chủ ( Host ID ).
Cụ thể địa chỉ IP biểu diễn dưới dạng bit nhị phân sẽ như sau:
0 0 1 0 1 1 0 0. 0 1 1 1 1 0 1 1. 0 1 1 0 1 1 1 0. 1 1 1 0 0 0 0 0 bit nhận dạng
Octet 1
Octet 2
Octet 3
Octet 4
Thông thường bạn sẽ thấy địa chỉ IP biểu diễn dưới dạng thập phân. Mỗi Octet có 3 con số.
Ví dụ 123.123.000.000
TCP và UDP
Muốn truyền dữ liệu hay thông tin qua lại trên mạng thì có một số máy tính phải phát tín hiệu, các máy khác nhận tín hiệu.
Trong quá trình đó có thế sẽ xảy ra lỗi.
Cũng giống như việc gửi và phát thư từ, bưu kiện chẳng hạn. Việc truyền thông tin trên mạng cũng có nhiều qui cách "bưu kiện" hay biểu diễn dữ liệu khác nhau.
Tập hợp các quy tắc chuẩn dành cho việc biểu diễn dữ liệu, phát tín hiệu, chứng thực và phát hiện lỗi dữ liệu - những việc cần thiết để gửi thông tin qua các kênh truyền thông, nhờ đó mà các máy tính (và các thiết bị) có thể kết nối và trao đổi thông tin với nhau gọi là giao thức (Protocol)
Khi bạn gửi một bưu kiện thì bưu kiện của bạn sẽ phải qua nhiều giai đoạn: bưu cục, xe vận chuyển, sân bay, máy bay, bưu điện nơi đến, người đưa thư.... Thông tin truyền trên mạng cũng vậy.
Có rất nhiều giao thức khác nhau. Đây là một số giao thức thông dụng.
* IP (Internet Protocol)
* UDP (User Datagram Protocol)
* TCP (Transmission Control Protocol)
* DHCP (Dynamic Host Configuration Protocol)
* HTTP (Hypertext Transfer Protocol)
* FTP (File Transfer Protocol)
* Telnet (Telnet Remote Protocol)
* SSH (Secure Shell Remote Protocol)
* POP3 (Post Office Protocol 3)
* SMTP (Simple Mail Transfer Protocol)
* IMAP (Internet Message Access Protocol)
-TCP là một giao thức cần "kết nối" giữa máy gửi và máy nhận. Chính vì vậy nó được gọi là connection-oriented. Ví dụ khi bạn muốn nói chuyện với một người bạn sống tại tỉnh khác hoặc nước khác, bạn nhấc điện thoại lên và quay số của người bạn này, lúc đó một kết nối sẽ được tạo ra giữa điện thoại của bạn và của người bạn, sau đó bạn gửi và nhận dữ liệu ( dưới dạng âm thanh) bằng cách nói và nghe qua điện thoại của bạn.
-UDP là giao thức không cần "kết nối" giữa máy gửi và máy nhận. Chính vì vậy được gọi là connectionless. Trong giao thức UDP khi hai ứng dụng muốn giao tiếp với nhau chúng không tạo ra kết nối mà chỉ đơn thuần gửi các gói tin một cách độc lập từ máy này tới máy khác. Các gói tin như vậy gọi là các datagram. Việc gửi các gói tin như vậy tương tự như việc chúng ta gửi thư qua đường bưu điện: Các bức thư bạn gửi độc lập với nhau, thứ tự các lá thư là không quan trọng và không có gì đảm bảo là thư sẽ đến đươc đích.
-TCP đảm bảo chuyển giao dữ liệu tới nơi nhận một cách đáng tin cậy và đúng thứ tự.
-UDP không cung cấp sự tin cậy và thứ tự truyền nhận
Mỗi căn nhà đều có số nhà, máy tính cũng vậy, trên mạng Internet, mỗi máy tính có một địa chỉ riêng. Có thể coi IP là địa chỉ của các máy tính trên mạng.
Tạm thời với số mạng, số máy trên thế giới hiện tại thì cứ tam coi như cấu trúc địa chỉ IP như hiện tại (IPv4) là tạm ổn. Sau này sẽ phải mở rộng (IPv6) kiểu như thêm số vào số phone chẳng hạn.
IP là chữ viết tắt của Internet Protocol. Địa chỉ IP đang được sử dụng hiện tại (IPv4) có 32 bit chia thành 4 Octet ( mỗi Octet có 8 bit, tương đương 1 byte ) cách đếm đều từ trái qua phải bít 1 cho đến bít 32, các Octet tách biệt nhau bằng dấu chấm (.), bao gồm có 3 thành phần chính.
Đây là 3 phần chính của một địa chỉ IP
Class bit Net ID Host ID
Bit nhận dạng lớp ( Class bit )
Địa chỉ của mạng ( Net ID )
Địa chỉ của máy chủ ( Host ID ).
Cụ thể địa chỉ IP biểu diễn dưới dạng bit nhị phân sẽ như sau:
0 0 1 0 1 1 0 0. 0 1 1 1 1 0 1 1. 0 1 1 0 1 1 1 0. 1 1 1 0 0 0 0 0 bit nhận dạng
Octet 1
Octet 2
Octet 3
Octet 4
Thông thường bạn sẽ thấy địa chỉ IP biểu diễn dưới dạng thập phân. Mỗi Octet có 3 con số.
Ví dụ 123.123.000.000
TCP và UDP
Muốn truyền dữ liệu hay thông tin qua lại trên mạng thì có một số máy tính phải phát tín hiệu, các máy khác nhận tín hiệu.
Trong quá trình đó có thế sẽ xảy ra lỗi.
Cũng giống như việc gửi và phát thư từ, bưu kiện chẳng hạn. Việc truyền thông tin trên mạng cũng có nhiều qui cách "bưu kiện" hay biểu diễn dữ liệu khác nhau.
Tập hợp các quy tắc chuẩn dành cho việc biểu diễn dữ liệu, phát tín hiệu, chứng thực và phát hiện lỗi dữ liệu - những việc cần thiết để gửi thông tin qua các kênh truyền thông, nhờ đó mà các máy tính (và các thiết bị) có thể kết nối và trao đổi thông tin với nhau gọi là giao thức (Protocol)
Khi bạn gửi một bưu kiện thì bưu kiện của bạn sẽ phải qua nhiều giai đoạn: bưu cục, xe vận chuyển, sân bay, máy bay, bưu điện nơi đến, người đưa thư.... Thông tin truyền trên mạng cũng vậy.
Có rất nhiều giao thức khác nhau. Đây là một số giao thức thông dụng.
* IP (Internet Protocol)
* UDP (User Datagram Protocol)
* TCP (Transmission Control Protocol)
* DHCP (Dynamic Host Configuration Protocol)
* HTTP (Hypertext Transfer Protocol)
* FTP (File Transfer Protocol)
* Telnet (Telnet Remote Protocol)
* SSH (Secure Shell Remote Protocol)
* POP3 (Post Office Protocol 3)
* SMTP (Simple Mail Transfer Protocol)
* IMAP (Internet Message Access Protocol)
-TCP là một giao thức cần "kết nối" giữa máy gửi và máy nhận. Chính vì vậy nó được gọi là connection-oriented. Ví dụ khi bạn muốn nói chuyện với một người bạn sống tại tỉnh khác hoặc nước khác, bạn nhấc điện thoại lên và quay số của người bạn này, lúc đó một kết nối sẽ được tạo ra giữa điện thoại của bạn và của người bạn, sau đó bạn gửi và nhận dữ liệu ( dưới dạng âm thanh) bằng cách nói và nghe qua điện thoại của bạn.
-UDP là giao thức không cần "kết nối" giữa máy gửi và máy nhận. Chính vì vậy được gọi là connectionless. Trong giao thức UDP khi hai ứng dụng muốn giao tiếp với nhau chúng không tạo ra kết nối mà chỉ đơn thuần gửi các gói tin một cách độc lập từ máy này tới máy khác. Các gói tin như vậy gọi là các datagram. Việc gửi các gói tin như vậy tương tự như việc chúng ta gửi thư qua đường bưu điện: Các bức thư bạn gửi độc lập với nhau, thứ tự các lá thư là không quan trọng và không có gì đảm bảo là thư sẽ đến đươc đích.
-TCP đảm bảo chuyển giao dữ liệu tới nơi nhận một cách đáng tin cậy và đúng thứ tự.
-UDP không cung cấp sự tin cậy và thứ tự truyền nhận
DuongKimLong(I111C)- Tổng số bài gửi : 29
Join date : 26/08/2011
siêu đa luông
Bây giờ chuyện tậu một bộ máy tính có công nghệ siêu phân luồng (Hyper-Threading Technology, gọi tắt là HT) chẳng còn là ghê gớm lắm, cho dù nó đang là một “mốt thời thượng”.
Còn nhớ, hồi mới được Intel trình làng ngày 14-11-2002, công nghệ HT cho máy desktop được coi như một công nghệ của “cõi trên”, loại “kính nhi viễn chi” – đứng đàng xa “nhểu nước miếng” mà ngó. Giá con CPU đầu tiên có HT là Pentium 4 bus 533 tốc độ 3.06 GHz lúc đó khoảng 650 USD. Mainboard có HT cũng tròm trèm 200 USD. Còn tới thời điểm trung tuần tháng 12-2003, gần 13 tháng sau, chỉ cần bỏ ra 285 USD (ở đây chỉ mới tính CPU và mainboard thôi), bạn đã có thể làm chủ công nghệ HT với con CPU Pentium 4 bus 800 tốc độ 2.4 GHz và mainboard i865PE. Con CPU desktop đụng nóc là Pentium 4 tốc độ 3.2 GHz giá cũng chỉ 440 USD.
Nhưng HT là cái chi chi? Người ta có thể mô tả công nghệ HT bằng nhiều cách, như công nghệ “đa nhiệm”, “CPU 2 trong 1”, “mua một CPU được hai bộ vi xử lý”, “CPU luận lý thứ hai”, ...
Để giải quyết nhu cầu đa nhiệm mà người sử dụng máy vi tính đang đặt ra ngày càng nhiều hơn, Intel đã khai thác thế mạnh của khả năng đa luồng (multithreading) vốn được xây dựng sẵn trong hệ điều hành Windows XP và nhiều phần mềm ứng dụng tiên tiến. Phần mềm đa luồng có khả năng chia các tác vụ nặng nề của mình thành nhiều quá trình và luồng có thể xử lý độc lập. Trong một hệ thống đa CPU (multiprocessor), các luồng này được chia ra để từng con CPU khác nhau xử lý. Giải pháp HT là thay vì đặt 2 bộ vi xử lý lên một cái nhân (die) với giá thành cao hơn nhiều, Intel đã chọn giải pháp tận dụng tài nguyên còn thừa của các CPU tốc độ cao để tạo ra một bộ vi xử lý luận lý (logical CPU) thứ hai bên trong một CPU vật lý (physical CPU). Thay vì phải sắp hàng chờ đợi được xử lý trong một bộ vi xử lý, các ứng dụng giờ đây được tách ra để được xử lý trong hai bộ vi xử lý ảo (virtual) hay vi xử lý luận lý (logical) cùng chạy song song nhưng độc lập với nhau. Tuy sức mạnh của CPU không được nhân đôi, nhưng theo các thử nghiệm của Intel, với công nghệ HT, hiệu suất của hệ thống sẽ tăng 25-30%. Bạn có thể chạy cùng một lúc 2 hay nhiều hơn các ứng dụng khác nhau mà không làm hệ thống bị nặng nề, quá tải như khi không có HT. Nhờ vậy mà bạn sẽ tiết kiệm được khối thời gian vốn là vàng bạc !
Công nghệ HT có xuất xứ từ công nghệ đa luồng đồng thời (Simultaneous Multi-Threading, SMT) đã được Intel ứng dụng đầu tiên trên các CPU Xeon dành cho máy chủ, máy trạm. SMT cho phép đa luồng tác vụ cùng chia nhau sử dụng tất cả các tài nguyên của CPU, như cache, các đơn vị xử lý, control logic, các bus và các hệ thống bộ nhớ.
- Cách hoạt động của công nghệ HT. Phần trên là CPU không có HT. Phần dưới là khi HT ra tay.
Khi hoạt động trong hệ thống có công nghệ HT, hệ điều hành Windows XP sẽ nhận ra hệ thống có tới hai CPU và khai thác cả hai để chạy các ứng dụng.
Bạn lưu ý cho, do không hỗ trợ đa nhiệm, đa luồng, một số phần mềm ứng dụng thậm chí bị “bối rối” khi “nhìn” thấy tới 2 CPU, dẫn tới chuyện còn chạy tệ hơn khi không có HT. Để xử cái vụ này, các mainboard đều có tùy chọn mở (enable) hay tắt (disable) công nghệ HT ở BIOS.
Yêu cầu bắt buộc để sử dụng HT là bạn phải có hệ điều hành, CPU, và mainboard với chipset hỗ trợ công nghệ này.
Các chipset hỗ trợ HT là từ i854E trở về sau này. Nói cho dễ nhớ, ngoại trừ hai chipset i845 và i845GL, cũng như chipset i850, tất cả các chipset i845 khác, i850E, các chipset i848, i865 và i875P đều có chức năng HT.
Cũng xin lưu ý, ở các vụ này, Intel còn phân thành hai cấp:
- được tối ưu hóa cho HT (Optimized for HT Technology), gồm các chipset i875P, i865G, i865PE và i865GV. Như tên gọi, các chipset này mới khai thác triệt để công nghệ HT.
- hỗ trợ HT (Supports HT Technology), gồm các chipset có chức năng HT còn lại.
Các CPU desktop Intel hỗ trợ HT hiện nay gồm:
- Pentium 4 bus 800 MHz: 3.20 GHz, 3.0 GHz, 2.80C GHz, 2.60C GHz, 2.40C GHz
- Pentium 4 Extreme Edition bus 800 MHz: 3.20 GHz
- Pentium 4 bus 533 MHz: 3.06 GHz
Các hệ điều hành hỗ trợ HT hiện nay có Windows XP và Windows Server 2003. Trong khi đó có khá nhiều hệ điều hành Linux hỗ trợ HT. Nhưng cho tới nay, Intel mới cấp logo “Intel Pentium 4 Processor with HT Technology” cho các hệ điều hành được test là được tối ưu hóa cho HT gồm: Red Hat Linux 9 (Professional và Personal), SuSE Linux 8.2 (Professional và Personal), Red Flag Linux Desktop 4.0, COSIX Linux 4.0.
Với các Windows không hỗ trợ HT (Windows 2000 tất tần tật phiên bản, Windows NT4.0, Windows Me, Windows 98SE, Windows 98 trở về trước), Intel khuyến cáo người dùng phải tắt (disable) chức năng hỗ trợ HT trong BIOS hệ thống.
Còn nhớ, hồi mới được Intel trình làng ngày 14-11-2002, công nghệ HT cho máy desktop được coi như một công nghệ của “cõi trên”, loại “kính nhi viễn chi” – đứng đàng xa “nhểu nước miếng” mà ngó. Giá con CPU đầu tiên có HT là Pentium 4 bus 533 tốc độ 3.06 GHz lúc đó khoảng 650 USD. Mainboard có HT cũng tròm trèm 200 USD. Còn tới thời điểm trung tuần tháng 12-2003, gần 13 tháng sau, chỉ cần bỏ ra 285 USD (ở đây chỉ mới tính CPU và mainboard thôi), bạn đã có thể làm chủ công nghệ HT với con CPU Pentium 4 bus 800 tốc độ 2.4 GHz và mainboard i865PE. Con CPU desktop đụng nóc là Pentium 4 tốc độ 3.2 GHz giá cũng chỉ 440 USD.
Nhưng HT là cái chi chi? Người ta có thể mô tả công nghệ HT bằng nhiều cách, như công nghệ “đa nhiệm”, “CPU 2 trong 1”, “mua một CPU được hai bộ vi xử lý”, “CPU luận lý thứ hai”, ...
Để giải quyết nhu cầu đa nhiệm mà người sử dụng máy vi tính đang đặt ra ngày càng nhiều hơn, Intel đã khai thác thế mạnh của khả năng đa luồng (multithreading) vốn được xây dựng sẵn trong hệ điều hành Windows XP và nhiều phần mềm ứng dụng tiên tiến. Phần mềm đa luồng có khả năng chia các tác vụ nặng nề của mình thành nhiều quá trình và luồng có thể xử lý độc lập. Trong một hệ thống đa CPU (multiprocessor), các luồng này được chia ra để từng con CPU khác nhau xử lý. Giải pháp HT là thay vì đặt 2 bộ vi xử lý lên một cái nhân (die) với giá thành cao hơn nhiều, Intel đã chọn giải pháp tận dụng tài nguyên còn thừa của các CPU tốc độ cao để tạo ra một bộ vi xử lý luận lý (logical CPU) thứ hai bên trong một CPU vật lý (physical CPU). Thay vì phải sắp hàng chờ đợi được xử lý trong một bộ vi xử lý, các ứng dụng giờ đây được tách ra để được xử lý trong hai bộ vi xử lý ảo (virtual) hay vi xử lý luận lý (logical) cùng chạy song song nhưng độc lập với nhau. Tuy sức mạnh của CPU không được nhân đôi, nhưng theo các thử nghiệm của Intel, với công nghệ HT, hiệu suất của hệ thống sẽ tăng 25-30%. Bạn có thể chạy cùng một lúc 2 hay nhiều hơn các ứng dụng khác nhau mà không làm hệ thống bị nặng nề, quá tải như khi không có HT. Nhờ vậy mà bạn sẽ tiết kiệm được khối thời gian vốn là vàng bạc !
Công nghệ HT có xuất xứ từ công nghệ đa luồng đồng thời (Simultaneous Multi-Threading, SMT) đã được Intel ứng dụng đầu tiên trên các CPU Xeon dành cho máy chủ, máy trạm. SMT cho phép đa luồng tác vụ cùng chia nhau sử dụng tất cả các tài nguyên của CPU, như cache, các đơn vị xử lý, control logic, các bus và các hệ thống bộ nhớ.
- Cách hoạt động của công nghệ HT. Phần trên là CPU không có HT. Phần dưới là khi HT ra tay.
Khi hoạt động trong hệ thống có công nghệ HT, hệ điều hành Windows XP sẽ nhận ra hệ thống có tới hai CPU và khai thác cả hai để chạy các ứng dụng.
Bạn lưu ý cho, do không hỗ trợ đa nhiệm, đa luồng, một số phần mềm ứng dụng thậm chí bị “bối rối” khi “nhìn” thấy tới 2 CPU, dẫn tới chuyện còn chạy tệ hơn khi không có HT. Để xử cái vụ này, các mainboard đều có tùy chọn mở (enable) hay tắt (disable) công nghệ HT ở BIOS.
Yêu cầu bắt buộc để sử dụng HT là bạn phải có hệ điều hành, CPU, và mainboard với chipset hỗ trợ công nghệ này.
Các chipset hỗ trợ HT là từ i854E trở về sau này. Nói cho dễ nhớ, ngoại trừ hai chipset i845 và i845GL, cũng như chipset i850, tất cả các chipset i845 khác, i850E, các chipset i848, i865 và i875P đều có chức năng HT.
Cũng xin lưu ý, ở các vụ này, Intel còn phân thành hai cấp:
- được tối ưu hóa cho HT (Optimized for HT Technology), gồm các chipset i875P, i865G, i865PE và i865GV. Như tên gọi, các chipset này mới khai thác triệt để công nghệ HT.
- hỗ trợ HT (Supports HT Technology), gồm các chipset có chức năng HT còn lại.
Các CPU desktop Intel hỗ trợ HT hiện nay gồm:
- Pentium 4 bus 800 MHz: 3.20 GHz, 3.0 GHz, 2.80C GHz, 2.60C GHz, 2.40C GHz
- Pentium 4 Extreme Edition bus 800 MHz: 3.20 GHz
- Pentium 4 bus 533 MHz: 3.06 GHz
Các hệ điều hành hỗ trợ HT hiện nay có Windows XP và Windows Server 2003. Trong khi đó có khá nhiều hệ điều hành Linux hỗ trợ HT. Nhưng cho tới nay, Intel mới cấp logo “Intel Pentium 4 Processor with HT Technology” cho các hệ điều hành được test là được tối ưu hóa cho HT gồm: Red Hat Linux 9 (Professional và Personal), SuSE Linux 8.2 (Professional và Personal), Red Flag Linux Desktop 4.0, COSIX Linux 4.0.
Với các Windows không hỗ trợ HT (Windows 2000 tất tần tật phiên bản, Windows NT4.0, Windows Me, Windows 98SE, Windows 98 trở về trước), Intel khuyến cáo người dùng phải tắt (disable) chức năng hỗ trợ HT trong BIOS hệ thống.
TranVanDucHieu I11c- Tổng số bài gửi : 12
Join date : 25/08/2011
Age : 35
Câu hỏi của bài 5
Câu 1: Trình bày Khái niệm Luồng, cho vd minh họa. So sánh luồng với tiến trình
Câu 2: Những ích lợi của công nghệ đa luồng. Cho vd
Câu 3: Trình bày nguyên lý Tập luồng và ứng dụng
Câu 4: Lập trình đa luồng trong Windows và DosNet
Câu 2: Những ích lợi của công nghệ đa luồng. Cho vd
Câu 3: Trình bày nguyên lý Tập luồng và ứng dụng
Câu 4: Lập trình đa luồng trong Windows và DosNet
thanhnam06511c- Tổng số bài gửi : 16
Join date : 31/08/2011
khái niệm về luồng
một luồng thường được gọi là quá trình nhẹ() là một đơn vị vơ bản của việc sử dụng CPU: bao gồm một đinh danh luồng(Thread ID) một bộ đếm chương trình, tập thanh ghi và ngăn xếp, nó chia sẽ với các luồng khác thuộc cùng một mã phần dữ liệu và tài nguyên hệ điều hành như các tập tin đang mở và các tín hiệu. một quá trình truyền thống hay quá trình nặng đều có một luồng điều khiển đơn. nếu một quá trình có nhiều luồng điều khiển nó có thể thực hiện nhiều hơn một tác vụ tại một thời điểm
nguyenvulinh_i11c- Tổng số bài gửi : 24
Join date : 28/08/2011
thận lợi của lập trình đa luồng
1. [b]sự đáp ứng: đa luồng là một ứng dụng giao tiếp cho phép một chương trình tiếp tục chay thậm chí nếu một phần của nó bị khoá hay đang thực hiện một thao tác dài. do đó tăng sự đáp ứng với người dùng. ví dụ: một trình diệt web vẫn có thể đáp ứng người dùng một luồng trong khi một ảnh được đáp ứng bởi một luồng khác.
2. chia sẻ tài nguyên:mặc định. các luồng chia sẻ bộ nhớ và tài nguyên của các quá trình mà chúng thuộc về. thuận lợi của việc chia sẻ mả là nó cho phép ứng dụng có nhiều hoạt động của những luồng khác nhau nằm trong cùng không gian địa chỉ
3. kinh tế: cấp phát tài nguyên cho việc tạo các quá trình là rất đắt. vì quá trình chia sẻ tài nguyên mà chúng thuộc về nên nó kinh tế hơn giữa việc tào và chuyển ngử cảnh giữa các luồng. khó để đánh giá theo kinh nghiệm sự khác biệt chi phí giữa việc tạo ra và duy trì một quá trình hơn một luồng.. tạo một quá trình chậm hơn khoản 30 lần tạo một luồng và chuyển đổi ngử cảnh chậm hơn 5 lần.
4.Sử dụng kiến trúc đa xử lý: các lợi điểm trong luồng có thể phát huy trong đa xử lý. ở đó mỗi luồng thực thi song song trên một bộ xử lý khác nhau. một quá trình đơn luồng chỉ có thể chạy trên một cpu tại một thời điểm. đa luồng trên một máy nhiều cpu gia tăng tính đồng hành trong kiến trúc đơn xử lý. CPU thường chuyển đỗi qua lại giữa các luông thường quá nhanh để tạo ra hình ảnh của sự song song nhưng trong thực tế chỉ có một luồng chỉ chạy tai một thời điểm.
2. chia sẻ tài nguyên:mặc định. các luồng chia sẻ bộ nhớ và tài nguyên của các quá trình mà chúng thuộc về. thuận lợi của việc chia sẻ mả là nó cho phép ứng dụng có nhiều hoạt động của những luồng khác nhau nằm trong cùng không gian địa chỉ
3. kinh tế: cấp phát tài nguyên cho việc tạo các quá trình là rất đắt. vì quá trình chia sẻ tài nguyên mà chúng thuộc về nên nó kinh tế hơn giữa việc tào và chuyển ngử cảnh giữa các luồng. khó để đánh giá theo kinh nghiệm sự khác biệt chi phí giữa việc tạo ra và duy trì một quá trình hơn một luồng.. tạo một quá trình chậm hơn khoản 30 lần tạo một luồng và chuyển đổi ngử cảnh chậm hơn 5 lần.
4.Sử dụng kiến trúc đa xử lý: các lợi điểm trong luồng có thể phát huy trong đa xử lý. ở đó mỗi luồng thực thi song song trên một bộ xử lý khác nhau. một quá trình đơn luồng chỉ có thể chạy trên một cpu tại một thời điểm. đa luồng trên một máy nhiều cpu gia tăng tính đồng hành trong kiến trúc đơn xử lý. CPU thường chuyển đỗi qua lại giữa các luông thường quá nhanh để tạo ra hình ảnh của sự song song nhưng trong thực tế chỉ có một luồng chỉ chạy tai một thời điểm.
nguyenvulinh_i11c- Tổng số bài gửi : 24
Join date : 28/08/2011
Re: Thảo luận Bài 5
cái này ko phải nhất thiết là chat. mà làm hiểu cái nguyên tắc hoạt động truyền tải dữ liệu như thế nào thôi. chứ cty mình vẫn cho xử dụng yahoo đấy thôi.phamngoctan095 (I11C) đã viết:Chào cả nhà!
Vấn đề “Tại sao phải làm lại những chương trình chat trong khi đã có rất nhiều chương trình chat miễn phí” đã được các bạn lớp Hoàn chỉnh kiến thức I83C thảo luận rất sôi nổi trên diễn đàn khóa trước. Riêng mình thì có ý kiến, cũng như cái ví dụ con mèo hoang mà thầy đã nêu trên lớp thì một khi đã lệ thuộc vào những thứ đã sẵn có sẽ mất dần khả năng tự kiếm “mồi”. Một khi chúng ta cần đến nó sẽ không biết cách để tự kiếm được. Trong thực tế cũng đã xảy ra trường hợp tương tự, lấy ví dụ tại một số công ty thì những ứng dụng chat hầu như bị cấm cửa như Yahoo chẳng hạn. Và lúc bấy giờ thì khả năng tự kiếm “mồi” của những con mèo hoang mới thật sự cần thiết.
tranvantoan83(I11c)- Tổng số bài gửi : 22
Join date : 25/08/2011
Age : 34
Câu 2: Những ích lợi của công nghệ đa luồng. Cho vd
Công nghệ siêu luồng cho phép các phần mềm ứng dụng được viết cho những máy chủ đa luồng có thể thực hiện các chỉ thị song song đồng thời trên mỗi bộ xử lý riêng, bằng cách này sẽ cải thiện tức thì tốc độ giao dịch cũng như thời gian đáp ứng và các yêu cầu đặc thù khác của phần mềm nghiệp vụ và thương mại điện tử. Công nghệ này tương thích với các phần mềm ứng dụng và hệ điều hành sẵn có trên các máy chủ, nó cho phép hỗ trợ nhiều người dùng hơn và tăng khối lượng công việc được xử lý trên một máy chủ. Với các máy trạm cao cấp, công nghệ siêu phân luồng cũng sẽ tăng đáng kể tốc độ các phần mềm ứng dụng đòi hỏi năng lực tính toán cao, ví dụ như phần mềm thiết kế 3 chiều, xử lý ảnh hay video… Trong thời gian tới sẽ xuất hiện ngày càng nhiều phần mềm được thiết kế đặc biệt và tối ưu hoá cho công nghệ này.
VD:
Từ tháng 1-2002, công nghệ siêu luồng đã được Intel đưa vào các bộ vi xử lý Xeon đời mới, khởi đầu với các bộ xử lý có tốc độ 1,8GHz và 2,0GHz với 512KB cache thứ cấp, sản xuất bằng công nghệ 0,13 micron (Xeon 1,7GHz, 1,8GHz, 2,0GHz với 256KB cache thứ cấp được sản xuất bằng công nghệ 0,18 không hỗ trợ siêu luồng). Tại thời điểm đầu tiên khi Intel giới thiệu bộ xử lý Xeon cùng với chipset 860, chỉ có một số rất ít các nhà sản xuất hàng đầu như IBM, Compaq, Dell, SuperMicro, Tyan… hỗ trợ bộ vi xử lý này, số lượng sản phẩm cũng rất ít. Tuy nhiên tới thời điểm hiện nay, khi có thêm các chipset hỗ trợ bộ xử lý Xeon như E7500 và Serverworks GC, nhiều nhà sản xuất khác đã có sản phẩm hỗ trợ bộ xử lý Xeon. Đặc biệt SuperMicro đã gần như “bỏ rơi” Pentium III với việc cho ra đời tới hơn 20 loại motherboard hỗ trợ bộ xử lý Xeon, chứng tỏ Xeon với công nghệ siêu luồng là sự thay thế xứng đáng
VD:
Từ tháng 1-2002, công nghệ siêu luồng đã được Intel đưa vào các bộ vi xử lý Xeon đời mới, khởi đầu với các bộ xử lý có tốc độ 1,8GHz và 2,0GHz với 512KB cache thứ cấp, sản xuất bằng công nghệ 0,13 micron (Xeon 1,7GHz, 1,8GHz, 2,0GHz với 256KB cache thứ cấp được sản xuất bằng công nghệ 0,18 không hỗ trợ siêu luồng). Tại thời điểm đầu tiên khi Intel giới thiệu bộ xử lý Xeon cùng với chipset 860, chỉ có một số rất ít các nhà sản xuất hàng đầu như IBM, Compaq, Dell, SuperMicro, Tyan… hỗ trợ bộ vi xử lý này, số lượng sản phẩm cũng rất ít. Tuy nhiên tới thời điểm hiện nay, khi có thêm các chipset hỗ trợ bộ xử lý Xeon như E7500 và Serverworks GC, nhiều nhà sản xuất khác đã có sản phẩm hỗ trợ bộ xử lý Xeon. Đặc biệt SuperMicro đã gần như “bỏ rơi” Pentium III với việc cho ra đời tới hơn 20 loại motherboard hỗ trợ bộ xử lý Xeon, chứng tỏ Xeon với công nghệ siêu luồng là sự thay thế xứng đáng
tranvantoan83(I11c)- Tổng số bài gửi : 22
Join date : 25/08/2011
Age : 34
Những ích lợi của công nghệ đa luồng?
- Khả năng đáp ứng tốt hơn: Trong khi một luồng bị ách hoặc quá bận, luồng khác vẫn vận hành bình thường (luồng chính của trình duyệt vẫn tương tác với người dùng trong khi dữ liệu đang được lấy về).
VD: tổng đài 108 với nhiều nhân viên đang làm việc (đa luồng), Khi khách hàng gọi tới nhân viên thứ nhất (luồng 1) sẽ trả lời, trong khi đó khách hàng khác gọi đến nhân viên thứ nhất đang bận (luồng 1 đang bận) thì nhân viên thứ hai (luồng khác) sẽ trả lời.
- Chia sẻ tài nguyên: Theo mặc định các luồng có thể dùng chung bộ nhớ và tài nguyên với luồng cha. Vài luồng cùng vận hành trong một vùng địa chỉ, do đó dễ dùng chung tài nguyên hơn so với trường hợp đa tiến trình.
VD: Trong lớp các học sinh (các luồng) đang học dùng chung một tấm bảng (tài nguyên).
- Tiết kiệm: Cấp phát bộ nhớ và tài nguyên cho tiến trình là một công việc tốn kém. Do luồng chung tài nguyên với cha và các luồng khác, việc tạo lập và chuyển ngữ cảnh cũng nhanh hơn.
VD: Trong một phòng học thêm chỗ ngồi mới (luồng mới) sẽ dễ và nhanh hơn nhiều so với xây phòng mới (tiến trình)
- Tận dụng được thế mạnh của kiến trúc đa xử lý: Đa luồng làm tăng tính song song trên hệ máy nhiều CPU. Mỗi luồng có thể chạy bởi CPU riêng.
- Lập trình đa luồng dễ hơn lập trình đa tiến trình.
VD: lập trình bán vé máy bay cũng cần đến công nghệ đa luồng.
VD: tổng đài 108 với nhiều nhân viên đang làm việc (đa luồng), Khi khách hàng gọi tới nhân viên thứ nhất (luồng 1) sẽ trả lời, trong khi đó khách hàng khác gọi đến nhân viên thứ nhất đang bận (luồng 1 đang bận) thì nhân viên thứ hai (luồng khác) sẽ trả lời.
- Chia sẻ tài nguyên: Theo mặc định các luồng có thể dùng chung bộ nhớ và tài nguyên với luồng cha. Vài luồng cùng vận hành trong một vùng địa chỉ, do đó dễ dùng chung tài nguyên hơn so với trường hợp đa tiến trình.
VD: Trong lớp các học sinh (các luồng) đang học dùng chung một tấm bảng (tài nguyên).
- Tiết kiệm: Cấp phát bộ nhớ và tài nguyên cho tiến trình là một công việc tốn kém. Do luồng chung tài nguyên với cha và các luồng khác, việc tạo lập và chuyển ngữ cảnh cũng nhanh hơn.
VD: Trong một phòng học thêm chỗ ngồi mới (luồng mới) sẽ dễ và nhanh hơn nhiều so với xây phòng mới (tiến trình)
- Tận dụng được thế mạnh của kiến trúc đa xử lý: Đa luồng làm tăng tính song song trên hệ máy nhiều CPU. Mỗi luồng có thể chạy bởi CPU riêng.
- Lập trình đa luồng dễ hơn lập trình đa tiến trình.
VD: lập trình bán vé máy bay cũng cần đến công nghệ đa luồng.
TranTrungTinh(I11C)- Tổng số bài gửi : 28
Join date : 30/08/2011
So sánh luồng & tiến trình
Khái niệm đa luồng: Luồng còn gọi là tiến trình nhẹ (LWP-Light Weight Process), cũng là một đơn vị cơ bản sử dụng CPU.
- Luồng cũng có thông tin trạng thái như tiến trình truyền thống (Heavy Weight Process).
+ Nhiều luồng có thể cùng chung một mã chương trình.
- Tiến trình có thể có một luồng chính với nhiều luồng phụ. Mỗi luồng có khả năng chia sẻ tài nguyên với các luồng khác trong tiến trình.
- Luồng cũng có thông tin trạng thái như tiến trình truyền thống (Heavy Weight Process).
+ Nhiều luồng có thể cùng chung một mã chương trình.
- Tiến trình có thể có một luồng chính với nhiều luồng phụ. Mỗi luồng có khả năng chia sẻ tài nguyên với các luồng khác trong tiến trình.
tannamthanh(I11C)- Tổng số bài gửi : 23
Join date : 03/09/2011
Tại sao phải dùng chung Code
Phải dùng chung Code vì cho dễ quản lý
VD:
Một chương trình ứng dụng khi thay đổi mã, người phát triển chỉ cần thay đổi 1 Code
VD:
Một chương trình ứng dụng khi thay đổi mã, người phát triển chỉ cần thay đổi 1 Code
tannamthanh(I11C)- Tổng số bài gửi : 23
Join date : 03/09/2011
Re: Thảo luận Bài 5
tranphanhieu36_i11c đã viết:Mình xin nói sơ qua về giao thức TCP và UDP, bạn nào học theo hướng mạng thì sẽ được tìm hiểu kỹ hơn về 2 giao thức này :
1.Giao thức điều khiển truyền dữ liệu TCP (Transmission Control Protocol )
TCP là một giao thức "có liên kết" (connection - oriented), nghĩa là cần phải thiết lập liên kết giữa hai thực thể TCP trước khi chúng trao đổi dữ liệu với nhau. Một tiến trình ứng dụng trong một máy tính truy nhập vào các dịch vụ của giao thức TCP thông qua một cổng (port) của TCP. Số hiệu cổng TCP được thể hiện bởi 2 bytes.
Cổng truy nhập dịch vụ TCP
Một cổng TCP kết hợp với địa chỉ IP tạo thành một đầu nối TCP/IP (socket) duy nhất trong 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 đầu nối TCP/IP. Một đầu nối TCP/IP có thể tham gia nhiều liên kết với các đầu nối TCP/IP ở xa khác nhau. Trước khi truyền dữ liệu giữa 2 trạm cần phải thiết lập một liên kết TCP giữa chúng và khi không còn nhu cầu truyền dữ liệu thì liên kết đó sẽ được giải phóng.
Các thực thể của tầng trên sử dụng giao thức TCP thông qua các hàm gọi (function calls) trong đó có các hàm yêu cầu để yêu cầu, để trả lời. Trong mỗi hàm còn có các tham số dành cho việc trao đổi dữ liệu.
-->Các bước thực hiện để thiết lập một liên kết TCP/IP: Thiết lập một liên kết mới có thể được mở theo một trong 2 phương thức: chủ động (active) hoặc bị động (passive).
-->Phương thức bị động, người sử dụng yêu cầu TCP chờ đợi một yêu cầu liên kết gửi đến từ xa thông qua một đầu nối TCP/IP (tại chỗ). Người sử dụng dùng hàm passive Open có khai báo cổng TCP và các thông số khác (mức ưu tiên, mức an toàn)
-->Với phương thức chủ động, người sử dụng yêu cầu TCP mở một liên kết với một một đầu nối TCP/IP ở xa. Liên kết sẽ được xác lập nếu có một hàm Passive Open tương ứng đã được thực hiện tại đầu nối TCP/IP ở xa đó.
Đơn vị dữ liệu sử dụng trong TCP được gọi là segment (đoạn dữ liệu), có các tham số với ý nghĩa như sau:
-->Source Por (16 bits): Số hiệu cổng TCP của trạm nguồn.
-->Destination Port (16 bit): Số hiệu cổng TCP của trạm đích.
-->Sequence Number (32 bit): số hiệu của byte đầu tiên của segment trừ khi bit SYN được thiết lập. Nếy bit SYN được thiết lập thì Sequence Number là số hiệu tuần tự khởi đầu (ISN) và byte dữ liệu đầu tiên là ISN+1.
-->Acknowledgment Number (32 bit): số hiệu của segment tiếp theo mà trạm nguồn đang chờ để nhận. Ngầm ý báo nhận tốt (các) segment mà trạm đích đã gửi cho trạm nguồn.
-->Data offset (4 bit): số lượng bội của 32 bit (32 bit words) trong TCP header (tham số này chỉ ra vị trí bắt đầu của nguồn dữ liệu).
-->Reserved (6 bit): dành để dùng trong tương lai
-->Control bit (các bit điều khiển):
-->URG: Vùng con trỏ khẩn (Ucgent Poiter) 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ộ hóa số hiệu tuần tự (sequence number).
-->FIN: Không còn dữ liệu từ trạm nguồn.
-->Window (16 bit): cấp phát credit để kiểm soát nguồn 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ỉ ra trong vùng ACK number, mà trạm nguồn đã saün sàng để nhận.
-->Checksum (16 bit): mã kiểm soát lỗi cho toàn bộ segment (header + data)
-->Urgemt Poiter (16 bit): con trỏ này trỏ tới số hiệu tuần tự của byte đi theo sau dữ liệu khẩn. Vùng này chỉ có hiệu lực khi bit URG được thiết lập.
-->Options (độ dài thay đổi): khai báo các option của TCP, trong đó có độ dài tối đa của vùng TCP data trong một segment.
-->Paddinh (độ dài thay đổi): phần chèn thêm vào header để đảm bảo phần header luôn kết thúc ở một mốc 32 bit. Phần thêm này gồm toàn số 0.
-->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 byte. Giá trị này có thể điều chỉnh bằng cách khai báo trong vùng options.
2.Giao thức UDP (User Datagram Protocol)
UDP (User Datagram Protocol) là giao thức theo phương thức không liên kết được sử dụng thay thế cho TCP ở trên IP theo yêu cầu của từng ứng dụng. Khác với TCP, UDP không có các chức năng thiết lập và kết thúc liên kết. Tương tự như IP, nó cũng không cung cấp cơ chế báo nhận (acknowledgment), không sắp xếp tuần tự các gói tin (datagram) đến và có thể dẫn đến tình trạng mất hoặc trùng dữ liệu mà không có cơ chế thông báo lỗi cho người gửi. Qua đó ta thấy UDP cung cấp các dịch vụ vận chuyển không tin cậy như trong TCP.
Khuôn dạng UDP datagram được mô tả với các vùng tham số đơn giản hơn nhiều so với TCP segment.
UDP cũng cung cấp cơ chế gán và quản lý các số hiệu cổng (port number) để định danh duy nhất cho các ứng dụng chạy trên một trạm của mạng. Do ít chức năng phức tạp nên UDP thường có xu thế hoạt động nhanh hơn so với TCP. Nó thường được dùng cho các ứng không đòi hỏi độ tin cậy cao trong giao vận.
Mô hình quan hệ họ giao thức TCP/IP
Nhận xét chung về TCP Và UDP:
-TCP có kiểm soát lỗi-> an toàn hơn nhưng tốc độ lại chậm hơn còn UDP không kiểm soát lỗi ->không an toàn nhưng không cần kiểm soát lỗi nên tốc độ sẽ cao hơn
-UDP ít phức tạp hơn nhiều so với TCP nên hoạt động nhanh hơn TCP
-UDP hoạt động trong môi trường TCP/IP Internet lớn hơn thì thường xảy ra hỏng hóc
- Cả 2 giao thức này đều có những ưu điểm và khuyết điểm riêng. Tủy vào ứng dụng hay từng hoàn cảnh tê có thể lựa chọn khác nhau:
TCP :
- Dùng cho mạng WAN
- Không cho phép mất gói tin
- Đảm bảo việc truyền dữ liệu
- Tốc độ truyền thấp hơn UDP
UDP:
- Dùng cho mạng LAN
- Cho phép mất dữ liệu
- Không đảm bảo.
- Tốc độ truyền cao, VolP truyền tốt qua UDP
- Một số ứng dụng và chọn lựa thông thường của TCP, UDP:
TCP : FTP, Telnet, HTTP ..
UDP : TFTP, SNMP, ...
Ban oi, ban dang post cua bai 4, bon minh dang thao luan bai 5 co ma, bai DA LUONG moi dung nha ban.
nguyenthingocloan (I11C)- Tổng số bài gửi : 33
Join date : 26/08/2011
Re: Thảo luận Bài 5
VoMinhHoang (I11C) đã viết:**TCP:
thì thiết lập sẵn mối liên kết giữa 2 máy trước khi truyền ( có kết nối )
**UDP:
Không phải thiết lập mối liên kết trước khi truyền, do đó dễ dàng liên lạc với nhiều máy cùng lúc nhưng không đảm bảo bằng TCP(không có kết nối).
ví dụ: giao thức TCP: từ điểm A sang điểm B nếu quy định đi bằng đường thẳng thì chỉ có một đường đi( ở đây ta có kết nối sẵn giữa 2 điểm A và B là đường thẳng). Giao thức UDP: Nếu không không buộc
Bài này là của bai 4 nha ban. Bài 5 la DA LUONG.
nguyenthingocloan (I11C)- Tổng số bài gửi : 33
Join date : 26/08/2011
Re: Thảo luận Bài 5
NguyenTrongHuy(I11C) đã viết:Duongthithanhhuynh (I11C) đã viết:ủa mình nhớ không lầm là những vấn đề mấy bạn post trong mục này là thuộc về bài 4 mà, mấy bạn post có đúng mục ko nhi? làm mình rối quá mình đi học đầy đủ mà hình như bài 5 "đa luồng" chưa học mà sao có vấn đề để thảo luận?hixhix
Mình đi hoc cũng đầy đủ nên thấy cung kỳ kỳ .tường thầy dạy trước bài Đa Luồng rùi nên co nhiều thắc mắc tính vào hỏi .ai dè không phải. Phần công nghệ Đa Luồng đối với mình là khá hay nên muốn tìm hiều thêm về công nghệ này.
Các bạn post bai khong dung mục gì hết, bài này post trong bài kia, làm loạn cả lên. Sao này các bạn chú ý post dúng vào nhé!!!!
nguyenthingocloan (I11C)- Tổng số bài gửi : 33
Join date : 26/08/2011
Trang 2 trong tổng số 3 trang • 1, 2, 3
Similar topics
» Giải giúp bài RRS này nhé
» Thảo luận các vấn đề của Môn học
» Thảo luận Bài 3
» Thảo luận bài 4
» Thảo luận Bài 7
» Thảo luận các vấn đề của Môn học
» Thảo luận Bài 3
» Thảo luận bài 4
» Thảo luận Bài 7
Trang 2 trong tổng số 3 trang
Permissions in this forum:
Bạn không có quyền trả lời bài viết