GIAO THỨC TCP/IP

Một phần của tài liệu Nghiên cứu giao thức trong mạng voip (Trang 25 - 31)

Giao thức TCP là giao thức điều khiển truyền thông hướng kết nối và có độ tin cậy cao. TCP cung cấp là giao thức được xây dựng phức tạp hơn UDP rất nhiều, ngoài các dịch vụ như UDP, TCP còn cung cấp các dịch vụ khác cho ứng dụng. Dịch vụ quan trọng nhất là truyền dữ liệu có độ tin cậy cao, các cơ chế điều khiển lưu lượng và kiểm soát tắc nghẽn, đánh số thứ tự và số thứ tự bên nhận, bộ định thời,....Cụ thể TCP cung cấp các dịch vụ sau:

• Thiết lập liên kết: TCP là giao thức hướng kết nối, trước khi gửi dữ liệu cần thiết lập trước đường truyền (chính là 1 liên kết lôgic giữa hai thực thể TCP), thủ tục này gọi là thủ tục “bắt tay”. Liên kết được thiết lập phải đảm bảo tính chính xác và độ tin cậy, một liên kết khi không còn đủ độ tin cậy thì sẽ bị huỷ bỏ và thiết lập lại. Khi quá trình truyền tin hoàn thành thì kết nối được giải phóng .

• Cung cấp đường truyền hai chiều (song công - full duplex).

• Đảm bảo độ tin cậy:Giao thức TCP cung cấp các tham số kiểm tra cùng với số thứ tự (Sequence number), xác nhận (ACKnowledge ) và kiểm tra lỗi tổng (Checksum). Các segment được đánh số tuần tự, cách làm này nhằm mục đích loại bỏ các segment bị trùng lặp hay không đúng yêu cầu. Tại bên thu, khi nhận được các segment thực hiện việc kiểm tra nhờ trường checksum. Nếu segment

nhận được không lỗi hay lặp, tín hiệu ACK sẽ được gửi trả lại bên phát để khẳng định dữ liệu nhận tốt. Ngược lại nếu segment nhận được bị lỗi hay bị trùng lặp thì segment này sẽ được loại bỏ và bên thu sẽ gửi một tin hiệu yêu cầu bên phát phát lại segment bị lỗi đó, bằng cơ chế này sẽ đảm bảo tính chính xác và độ tin cậy cho dữ liệu.

• Cung cấp các dịch vụ (chức năng) kiểm tra đường truyền, cho phép điều khiển luồng và điều khiển tắc nghẽn.

Trong ứng dụng VoIP, giao thức TCP được sử dụng làm giao thức truyền báo hiệu chứ không phục vụ việc truyền tín hiệu thoại. Lý do là vì phần mào đàu của TCP lớn

Hình 5.Cấu trúc đơn vị dữ liệu TCP Ý nghĩa các trường như sau:

• Source Port: độ dài 16 bit, xác định số hiệu cổng của trạm nguồn • Destination Port: độ dài 16 bit, xác định số hiệu cổng của trạm đích

• Sequence Number: độ dài 32 bit. Số hiệu của byte đầu tiên của segment từ khi bit SYN được thiết lập. Nếu 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

• ACK Number: độ dài 32 bit, xác định số hiệu của segment tiếp theo mà trạm nguồn đang chờ được xác nhận

• Data Offset: độ dài 4 bit, xác định vị trí bắt đầu của khối dữ liệu lớp trên trong đơn vị dữ liệu TCP.

• Control bit:

o ACK: vùng ACK có hiệu lực

o PSH: chức năng Push

o RST: khởi động lại liên kết

o SYN: đồng bộ hóa các số hiệu tuần tự

o FIN: không còn số liệu từ trạm cuối

• Window: cấp phát thẻ bài để kiểm soát luồng dữ liệu theo 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 mà trạm nguồn sẵn sàng nhận.

• Checksum: mã CRC-16

• Urgent Pointer: con trỏ trỏe tới số hiệu tuần tự của byte đi sau dữ liệu khẩn, cho bên nhận biết được độ dài của dữ liệu khẩn. Vùng này có hiệu lực khi bit URG được thiết lập.

• Option: có độ dài thay đổi, khai báo các lựa chọn của TCP trong đó có độ dài tối đa của vùng dữ liệu trong một đơn vị dữ liệu segment.

• Padding: đảm bảo phần tiêu đề của TCP luôn là bội 32 bit.

• TCP data: chứa dữ liệu lớp trên có giá trị tối đa là 536 byte. Giá trị này có thể thay đổi nhờ khai báo trong Option

Thiết lập và hủy kết nối TCP

Để hiểu được chức năng của hàm connect, accept, close và giúp debug các ứng dụng TCP bằng chương trình netstat, chúng ta cần hiểu làm thế nào để thiết lập và hủy một kết nối TCP, cũng như trạng thái của TCP.

Hình 6.Bắt tay 3 bước trong thiết lập kết nối TCP Giản đồ trên đây diễn ra khi một kết nối TCP được thiết lập:

1) Server đã sẵn sàng accept một kết nối tới. Công việc này được thực hiện bằng việc gọi hàm socket, bind, listen. Và được gọi là “passive open” (mở ở trạng thái bị động)

2) Client thiết lập một “active open” bằng cách gọi hàm connect. Khi đó, phía client sẽ gửi SYN để báo cho server biết số thứ tự của dữ liệu client sẽ gửi trong kết nối. Thông thường, SYN không chứa dữ liệu, chỉ chứa tiêu đề IP, TCP và có thể là các tùy chọn TCP.

3) Server xác nhận SYN của client. Nó sẽ SYN với số thứ tự cho dữ liệu của nó. Server gửi SYN và ACK cho SYN của client trong cùng một segment.

4) Client xác nhận SYN của server.

Số gói tối thiểu được truyền là ba nên được gọi là there-way handshake (bắt tay 3 bước).

Hình 7.Hủy kết nối TCP

Trong khi chỉ cần ba segment để thiết lập một kết nối TCP thì cần bốn segment để hủy kết nối.

1) Một ứng dụng gọi hàm close trước, chúng ta gọi đầu cuối này thực hiện active- close. Đầu cuối này sẽ gửi FIN segment để kế thúc việc gửi dữ liệu

2) Đầu cuối khác nhận FIN thực hiện “passive close”. FIN nhận được gọi xác nhận bởi TCP. FIN nhận được cũng được truyền lên lớp ứng dụng như là end-of- file(sau khi các dữ liệu khác đã được nhận đủ). Khi nhận được FIN nghĩa là ứng dụng không nhận thêm dữ liệu nữa.

3) Ứng dụng sau khi nhận được end-of-file sẽ close (đóng) socket lại. TCP của nó sẽ gửi FIN.

4) TCP của phía yêu cầu hủy kết nối nhận bản tin FIN cuối cùng, xác nhận FIN.

Hoạt động của TCP trong thiết lập và hủy cuộc gọi được mô tả bằng lược đồ trạng thái. Có 11 trạng thái khác nhau cho một kết nối và luật cho phép chuyển từ trạng thái này sang trạng thái khác dựa trên cơ sở trạng thái đã có. Ví dụ: nếu một ứng dụng thiết lập một “active open” ở trạng thái CLOSED, TCP gửi SYN và trạng thái mới là SYN_SENT. Nếu TCP sau đó nhận được SYN với ACK, nó sẽ gửi ACK và một trạng thái mới ESTABLISH (Thiết lập). Trạng thái cuối khi mà việc truyền dữ liệu diễn ra. Hai đường mũi tên chỉ từ trạng thái ESTABLISHED tới trạng thái ngắt kết nối. Nếu ứng dụng gọi close trước khi nhận FIN, thì trạng thái là FIN_WAIT_1. Nhưng nếu ứng dụng nhận FIN trong khi đang ESTABLISHED, trạng thái sẽ là CLOSE_WAIT.

Một lý do cần thiết phải hiểu được lược đồ trạng thái là để hiểu được 11 trạng thái TCP với tên của nó. Trạng thái này được hiện bởi netstat, là một công cụ hữu hiệu trong việc debug (Gỡ lỗi) ứng client/server.

Truyền các gói

Hình 9.Truyền dữ liệu với TCP

Hình trên biểu diễn việc truyền gói thực diễn ra cho một TCP hoàn chỉnh: thiết lập kết nối, truyền dữ liệu, hủy kết nối. Client trong ví dụ này thông báo MSS=536(xác định

kích thước buffer của nó) và server có kích thước buffer là 1460. Với mỗi kết nối được thiết lập, client tạo một yêu cầu và gửi nó tới server. Yêu cầu này được gắn trọn trong chỉ một TCP segment. Server xử lý yêu cầu và gửi trả lời (kích thước nhỏ hơn 536). Hai gói dữ liệu được biểu diễn bằng đường mũi tên đậm. Chú ý rằng ACK của yêu cầu của client được gửi kèm với trả lời của server. Cách thức này thường được thực hiện khi thời gian server xử lý và trả lời nhỏ hơn 200ms. Nếu lâu hơn, thì ACK sẽ được gửi trước khi gửi trả lời. Một điều quan trọng trong mô hình này là: Nếu chỉ để gửi một segment yêu cầu đi và nhận một segment trả lời thì cần tám segment khác. Nếu UDP được sử dụng, chỉ có hai segment được truyền: yêu cầu, trả lời. Nhưng chuyển từ TCP sang UDP thì chúng ta không còn tính tin cậy mà TCP cung cấp cho ứng dụng nữa, việc đảm bảo truyền tin sẽ do chương trình UDP thực hiện. Một yếu tố quan trọng nữa của TCP đó là điều khiển tắc nghẽn mà ở UDP không có. Các ứng dụng thường sử dụng UDP với các dữ liệu nhỏ cần tốc độ truyền cao(độ trễ nhỏ).

Một phần của tài liệu Nghiên cứu giao thức trong mạng voip (Trang 25 - 31)