본문 바로가기
ComputerScience/Network

[Network/Protocol] TCP란?

by whitele 2021. 3. 17.
반응형

전송계층 프로토콜 TCP

  TCP와 UDP를 사용하며 이외 몇 가지가 더 있다. 대부분 TCP와 UDP가 대부분이다. TCP는 전송되는 패킷에 오류와 중복이 없게 하고, 보낸 순서와 수신자가 받는 순서가 같도록 신뢰성 있는 전송을 보장하는 프로토콜이다. 3-way handshaking , 경로지정, 단편화 등 여러 가지 기능을 통해 신뢰성을 보장한다. 그리고 헤더에 오류코드에 대응할 수 있는 데이터를 포함한다. 송신 측에서는 데이터를 패킷으로 분할하고, 수신 측에서는 패킷을 결합하여 순서대로 재조립한다.

전송계층의 기능

  • 연결 제어
  • 데이터 전송
  • 단편화(UDP x)
  • 재조립(UDP x)

TCP Header TCP 헤더의 모습

TCP Header
TCP Segment

Source Port Address 송신 측 포트 번호

Destination Port Address 수신 측 포트 번호

Sequence Number(SYN) 순서 번호 TCP 세그먼트에 포함된 데이터의 첫 번째 byte에 부여된 것 unsigned 형태이다. 신뢰성 있는 연결을 위해 바이트마다 번호를 부여한다.

Acknowledgement Numbe(ACK) 확인 응답 번호, 상대편에서 수신하려는 번호이다. 순서 번호 +1이다.

Header Length 헤더 길이 TCP헤더는 20~60 사이로 가변적이다. 이 필드가 헤더의 길이를 알려준다.

Reserved 예약된 필드

Code bit 코드 비트, TCP 패킷이 어떤 패킷인지 알려준다. 연결, 연결 재설정, 연결 종료를 할 때 사용한다.

Window Size 윈도의 크기 윈도우의 크기를 정의하는 필드이다. 필드 크기가 16bit 이므로 0~2^16byte를 지정할  수 있다.

Check Sum 오류를 검사하는 필드

Urgent Pointer Code bit 에서 URG가 1이면 긴급 데이터의 마지막 바이트 순서 번호는 긴급 포인터 + 순서번호이다.

Option Padding 수신하고자 하는 Segment의 최대 크기를 나타낸다.

 


코드비트

TCP Code Bit

URG 긴급하게 처리할 데이터가 존재

ACK 확인 응답 번호 사용

PSH TCP가 받은 데이터를 상위 계층 전달

RST 연결 재설정

SYN 순서 번호 동기화

FIN 연결 종료

코드 비트는 TCP의 특정 기능을 수행하기 위해 있는 필드이다. 예를 들어 3-way handshaking 에서 SYN/ACK 패킷을 보낼 때 SYN과 ACK 비트가 1이다.

3-Way HandShaking

신뢰할 수 있는 연결을 위해서 연결 전 패킷을 교환한다. 연결 전 패킷 요청은 세 번 교환하는데 이것이 3-way handshaking이다. 과정은 다음과 같으며 client와 server의 예로 들겠다. 좌측이 클라이언트이고 우측이 서버이다.

  1. client 측은 연결 확립을 위해 Server에 SYN 요청을 보낸다.
  2. Server 측은 연결 요청을 승인한다는 응답을 보내기 위해 ACK를 보내며 동시에 Server는 데이터 전송 허가를 위해 SYN을 보낸다.
  3. Client 측은 Server에 허가한다는 응답으로 ACK를 보낸다.

연결 종료

자료 교환을 마친뒤 FIN과 ACK를 이용하여 연결 종료를 한다.

  1. Client측은 Server측에 연결 종료 요청을 보낸다.
  2. Server는 Client에 ACK을 보내고 곧바로 FIN요청을 보내 연결 종료를 요청한다.
  3. Client는 Server에 ACK응답을 보낸다.

여기서 3번째 과정에서 Client측은 바로 소켓을 닫지않고 서버에서 혹시모를 패킷 수신을 위해 잠시동안 열어두었다가 닫는다.

TCP흐름 제어

 TCP는 데이터 스트림을 패킷으로 청크로 쪼개어 보낸다. 이런 형식으로 보내다 보면 중간 패킷이 손실이 일어나거나 패킷 간에 순서가 뒤바뀔 수 있다. 패킷을 여러 개로 쪼개어 보내는 것보다 한번에  많이 보내는 것이 가능할 때 한번에 보낸느 것이 효율적이다. 1개로 보낼 것을 여러개로 보내면 손실의 가능성 그리고 그만큼 헤더 사용량도 많아져 손해이다.

window size

그래서 있는 것이 헤더에 있는 윈도우 크기이다. 업로드나 다운로드 할 때 속도가 계속 변하는 것에는 이 TCP 윈도우 크기와도 관련이 있다. 

수신 측으로 보낼 때 오버플로우가 발생하지 않도록 미리 정해놓는 것이 윈도우 크기이다. 윈도우의 크기값은 처음 3-wayhandshaking을 할 때 지정한다. Client-Server 관계의 예에서 Client는 SYN을 보낼때 Server측은 ACK+SYN을 보낼 때 정한다. 윈도우의 크기는 서로 다르게 지정할 수 있다.

Check Sum

TCP는 패킷에 오류가 생겼을 때 재전송을 하기 위해 검사합 기능이 있다. 검사합의 방법은 다음과 같다.

n n ... n n
  1. 데이터를 n비트인 m개의 섹션으로 나눈다.
  2. 모든 섹션은 1의 보수를 사용하여 서로 더한다.
  3. 합이 보수화 되어 검사합이 된다.

손실되거나 데이터에 오류가 발생 시 재전송 요청을 보낸다.

728x90
반응형

댓글