티스토리 뷰

Study/Network

[Networking] TCP service model (3)

생각많은 소심남 2016. 8. 30. 23:53

 TCP segment는 이전 포스트에서도 이야기했다시피 TCP data와 header로 구성되어 있다. data는 말그대로 application에서 전달하고자 하는 data이므로 간단한데, header의 구성은 조금 복잡하다. 

 - Destination Port : 말그대로 data가 전달될 포트번호를 나타낸다. 몇가지 대표적인 포트번호(예를 들어 TCP는 80번 포트, ssh는 22번 포트, smtp는 23번 포트...)들이 있는데 이에 대한 정보는 IANA 라는 공인 홈페이지에서 확인할 수 있다. TCP는 이를 통해 보낼 쪽에 대한 service를 정의할 수 있다. 그러면 받는 쪽에서도 이 포트번호를 보고 connection에 대한 service를 확인한다. 

 - Source Port : 반대로 Source 도 Destination에서 보낼 정보를 다시 받기 위한 connection을 생성하기 위해 자기의 포트번호를 알려준다. 

 - Sequence # : TCP Data의 첫번째 byte에 대한 index를 나타낸다. 이전 포스트에서 예시도 들었지만 첫번째 segment의 seq #이 1000이고 다음 segment의 크기가 500일 경우 다음 segment의 seq #는 1500이어야 된다.

 - Acknowledgement Sequence # :  여기는 상대방에게 다음으로 받아야 할 seq #을 알려준다. 예를 들어서 여기에 들어있는 값이 751인 경우, 이말은 이전까지 750번 seq를 받았다는 의미가 되는 것이다. 

 - Checksum : checksum은 header 전체와 data를 통틀어서 계산되는데, 이값을 통해서 받은 데이터에 손실이 있는지 여부를 확인할 수 있다. 

 - HLEN(Header Length) : TCP Header의 크기를 알려준다. 사실 TCP header에는 TCP option field가 있는데 header length는 전체 header의 크기를 나타내는 역할을 하기는 하지만, 엄밀히 말하면 이 option field의 크기를 말하는 것이다. 다른 field는 mandatory하지만 option field는 optional 하기 때문에 이 값을 통해서 그 크기를 유치할 수 있다.

 - Flag list : 현재 segment의 종류를 표현하는데 세부적으로는 다음과 같은 항목이 있다.

   - ACK(acknowledge) : segment내의 ACK seq #의 유효성을 알려준다.

   - SYN(synchronize) : 3-way handshake 중 connection을 형성하기 위한 flag다.

   - FIN(finish) : 현재 connection중 보낸 쪽에 대해 종료를 나타내는 flag

   - PSH(push) : 급히 보내야 될 데이터를 바로 보내게끔 해주는 flag다. 이전 포스트에서 segment에 따라서 data를 stream형태로 보내는 경우도 있지만 key stroke처럼 time-variant한 데이터를 전달하려면 그걸 stream 형태로 보내기 보다는 받자마자 보내는 형태가 효율적이다.

위의 TCP Segment가 IP Layer를 거치면 IP Datagram이 만들어지게 된다. 이중 connection이 생성되면서 unique하게 구별할 수 있는 요소가 크게 5가지가 있다. 우선은 IP header에 담기는 Destination IP Address, Source IP Address, 그리고 현재 사용하고 있는 protocol ID를 정의해서 다른 connection과 구분지을 수 있다. 또한 전달된 TCP segment중에서도 현재 application를 알려주는 포트 번호도 이 connection을 구별지을 수 있는 요소가 된다. 그래서 이 5가지를 TCP connection의 Unique ID라고 말하기도 한다.

 이중 포트번호에 대해서 첨언하자면, 현재의 connection은 unique하기 때문에 이 Unique ID가 우연하게 맞으면서 conflict가 나오는 케이스를 방지해야 한다.

 위의 케이스가 그런 conflict를 방지하기 위한 방법들이 참고하면 좋을거 같다.

 이 그림은 sequence number와 ACK seq number의 의미를 표현한 그림이 되겠다.


앞에서 말한 내용에 대한 실제 예를 소개해보고자 한다.

위와 같이 A에서 B로 data를 보내려 하는데, 이 때 web client를 통해서 보내고자 한다. 이때 TCP connection이 이미 되어있다고 가정을 하면 아래와 같이 

 sender쪽에서 TCP segment가 생성된다. 이때 web client는 web server를 향해서 data를 전달해야 하므로 Destination port를 80으로 잡게 된다. 이 값을 가진 상태에서 IP layer로 내려오면 IP header가 붙으면서 datagram을 형성하게 되는데, 이때 header에는 B의 IP 주소, A의 IP 주소, 그리고 현재의 프로토콜인 TCP를 포함한다.

그러면 아래와 같이 encapsulate된 datagram은 Host B로 전달이 된다.

최종적으로는 위와 같이 decapsulation이 이뤄져 최종적으로 Host B의 Web Server에게 data가 전달된다.


그림 출처 : Staford University - Networking - Unit 2-1 : TCP service model 강의자료

'Study > Network' 카테고리의 다른 글

[Network] ICMP Service Model  (0) 2018.01.24
[oFono] Overview  (0) 2017.11.17
[Networking] UDP service model  (0) 2016.09.06
[Networking] TCP service model (2)  (0) 2016.08.30
[Networking] TCP service model (1)  (0) 2016.08.30
[Network] Nash Equilibrium 문제  (0) 2015.03.02
[Network] End-to-end Principle  (2) 2014.02.06
댓글