TCP는 데이터 스트림으로부터 데이터를 받아 들여 이것을 일정 단위로 분할한 뒤 TCP 헤더를 덧붙여 TCP 세그먼트를 생성한다. TCP 세그먼트는 *IP 데이터그램에 캡슐화되어 상대방과 주고 받게 된다.
Sequence number (32 비트): TCP 세그먼트 안의 데이터의 송신 바이트 흐름의 위치를 가리킨다. SYN 플래그가 (1)로 설정된 경우, 이것은 초기 시퀀스 번호가 된다. SYN 플래그가 (0)으로 해제된 경우, 이것은 현재 세션의 세그먼트 데이터의 누적 시퀀스 번호이다.
Acknowledgment number (32 비트): ACK 플래그가 설정된 경우 이 필드의 값은 수신자가 예상하는 다음 시퀀스 번호이다. 한쪽이 보낸 최초의 ACK는 반대쪽의 초기 시퀀스 번호 자체에 대한 확인응답이 되며, 데이터에 대한 응답은 포함되지 않는다. sequence number와 piggybacking하여 같이 보낸다.
control: TCP에서 흐름 제어, 연결 설정 및 종료, 데이터 전송 모드를 활성화하기 위함
SYN(Synchronization:동기화) - S : 연결 요청 플래그
TCP 에서 세션을 성립할 때 가장먼저 보내는 패킷, 시퀀스 번호를 임의적으로 설정하여 세션을 연결하는 데에 사용되며 초기에 시퀀스 번호를 보내게 된다.ACK(Acknowledgement) - Ack : 응답
상대방으로부터 패킷을 받았다는 걸 알려주는 패킷으로 다른 플래그와 같이 출력되는 경우도 있다.
받는 사람이 보낸 사람 시퀀스 번호에 TCP계층에서 길이 또는 데이터 양을 더한 것과 같은 ACK를 보낸다.(일반적으로 +1 하여 보냄) ACK 응답을 통해 보낸 패킷에 대한 성공, 실패를 판단하여 재전송 하거나 다음 패킷을 전송한다.RST(Reset) - R : 제 연결 종료
재설정(Reset)을 하는 과정이며 양방향에서 동시에 일어나는 중단 작업이다. 비정상적인 세션 연결 끊기에 해당한다. 이 패킷을 보내는 곳이 현재 접속하고 있는 곳과 즉시 연결을 끊고자 할 때 사용한다.PSH(Push) - P : 밀어넣기
TELNET과 같은 상호작용이 중요한 프로토콜의 경우 빠른 응답이 중요한데, 이 때 받은 데이터를 즉시 목적지인 OSI 7 Layer 의 Application 계층으로 전송하도록 하는 FLAG이다. 데이터를 즉시 목적지로 보내라는 의미이다.URG(Urgent) - U : 긴급 데이터
Urgent pointer 유효한 것인지를 나타낸다. Urgent pointer란 전송하는 데이터 중에서 긴급히 전당해야 할 내용이 있을 경우에 사용한다. 긴급한 데이터는 다른 데이터에 비해 우선순위가 높아야 한다. EX) ping 명령어 실행 도중 Ctrl+c 입력FIN(Finish) - F : 연결 종료 요청
세션 연결을 종료시킬 때 사용되며 더이상 전송할 데이터가 없음을 나타낸다.
소스와 대상 사이에 가상 경로를 설정하는 것으로 TCP는 IP 서비스를 사용하여 개별 세그먼트를 전달한다.
클라이언트는 Control field의 SYN에 1을 셋팅해 연결요청 패킷임을 명시한 뒤 해당 패킷을 서버에게 보내 연결을 요청한다. (seq: 8000-랜덤 번호. SYN 패킷이 잘 도착했는지 확인하는 역할)
서버는 ACK을 클라이언트에게 전송해 연결요청을 허가(SYN에 대한 응답)한다. 동시에 SYN을 클라이언트에게 보내 서버도 연결요청을 한다.(seq: 15000-랜덤 번호 / ack: 8001-8000번까지 패킷을 받았고 8001번을 보내달라는 응답)
클라이언트는 서버가 보낸 SYN에 ACK을 보내 응답한다. (ack: 15001-15000번까지 패킷을 받았고 15001번을 보내달라는 응답)
연결 완료, 이후 데이터 전송하는 과정은 다음과 같다.
연결종료에는 2가지 방식이 있는데 three way handshaking과 four-way handshaking이다.
클라이언트는 Control field의 FIN에 1을 셋팅해 종료요청 패킷임을 명시한 뒤 해당 패킷을 서버에게 보내 연결 종료를 요청한다.
서버는 ACK을 클라이언트에게 전송해 종료요청을 허가(SYN에 대한 응답)한다. 동시에 SYN을 클라이언트에게 보내 서버도 종료요청을 한다. 클라이언트 sending 버퍼 삭제.
클라이언트는 서버가 보낸 SYN에 ACK을 보내 응답한다.
연결 종료 및 버퍼 삭제
내가 전송할 것은 다 했는데 상대방이 아직 전송을 다 못했을 수도 있기 때문에 상대방이 종료할 때까지 기다린다.
클라이언트가 서버에게 FIN 요청을 보낸다.
서버가 ACK을 보내 연결 종료 요청에 응답했다. 이때 클라이언트의 sending buffer가 소멸되지만 recieving buffer는 남아있으므로 서버가 보낸 데이터를 읽을 수는 있다.
클라이언트의 close 요청 수락 후에도 서버가 보낼 데이터 있으면 계속 보낸다. 서버는 클라이언트에게 보낼 데이터를 다 보내고 FIN을 보내 연결 종료를 요청한다.
클라이언트는 ACK을 보내 연결 종료 요청에 응답한다.(sending buffer가 삭제된 상태이므로 다른 말은 못하고 응답만 할 수 있음)
연결 종료
SYN을 받고 SYN + ACK대신 RST를 보내면 연결되지 않고 바로 종료된다. 또는 처음부터 보낼때 RST + ACK 연결을 종료하고자 하는 상대가 RST를 보내면 handshake없이 바로 종료된다.